?
方式一
?
class="java" name="code">JComboBox comboBox = new JComboBox(); long t1 = System.currentTimeMillis(); for (int i = 0; i < 10000; i++) { comboBox.addItem(new Integer(i)); } long t2 = System.currentTimeMillis(); System.out.println(t2-t1);
t2-t1=1毫秒
?
?
?方式二
?
long t1 = System.currentTimeMillis(); Vector v = new Vector(10000); for (int i = 0; i < 10000; i++) { v.add(new Integer(i)); } ComboBoxModel model = new DefaultComboBoxModel(v); comboBox.setModel(model); long t2 = System.currentTimeMillis(); System.out.println(t2-t1);
?
?t2-t1=40毫秒
?
?
说明:
方式一只是简单的往JComboBox 中添加数据项,,这种方法对于小数据量来说可以,但是当要添加大量数据时就会明显变得非常慢。
尽管方式一代码没有明确引用任何模型,JComboBox 的模型对象实际上是参与这个过程的,每次调用addItem 时,JComboBox 内部发生了许多操作:
组件将请求传递给JComboBox 的模型,模型发送一个事件表明一个新项被添加。
?
方式二之所以更快,原因有两个。
第一,因为所有项是一次添加到模型去,而不是一个一个的,只有一个事件发出,这意味着更少的事件触发,更少的方法调用。
第二,是因为需要通知变化的对象更少,总的工作量等于触发次数乘以侦听器数目。因为模型是新创建的,侦听在上面的侦听器为零,这意味着没有触发事件发生。
?
从上面的例子可以学到两点:
尽可能使用批操作,尽量减少触发事件的数量。
当初始化或者需要完全替换模型的内容时,考虑重新生成模型,不要使用已经存在的模型,已存在模型上已经保持了很多的侦听器,新生成的模型没有侦听器,这样避免了不必要的处理函数的调用。
?
?
?
?
?
?
?
?
?
?
?