首页 > IT职业 > IT生活 > (原)如何有效操作Vector
我们在程序的编写过程中经常会由于进度紧或其它各种原因而忽略了程序的性能问题,性能问题的大部分原因并不在于语言本身,而在于程序员对语言没有正确运用或不良的编程习惯。让我们看看有关Vector的不良用法,请看下面的代码。
Object obj = new Object();
Vector v = new Vector(100000);
for(int i=0;i<100000; i++) { v.add(0,obj); }
上述代码在没有要求把元素插入到最前面的情况下,在循环体内每次都把obj插到了最前面,这将造成性能的大幅度下降.让我们来分析一下原因.
====分析====
简单地说,一个Vector就是一个java.lang.Object实例的数组。Vector与数组相似,它的元素可以通过整数形式的索引访问。但是,Vector类型的对象在创建之后,对象的大小能够根据元素的增加或者删除而扩展、缩小。
在默认构造函数中,Vector的初始存储能力是10个元素,如果新元素加入时存储能力不足,则以后存储能力每次加倍。Vector类就象StringBuffer类一样,每次扩展存储能力时,所有现有的元素都要复制到新的存储空间之中。
在上面的例子中,每往Vector的最前面插入一次,原来的元素就要往后移动,这浪费了很多资源开销,根据循环次数大小,会对性能产生不同程度的不利影响,所以除非有绝对充足的理由要求每次都把新元素插入到v的前面,否则应采用下面的方法。每次都在v的最后追加.
Object obj = new Object();
Vector v = new Vector(100000);
for(int i=0; i<100000; i++) { v.add(obj); }
同样的规则也适用于Vector类的remove()方法。由于Vector中各个元素之间不能含有“空隙”,删除除最后一个元素之外的任意其他元素都导致被删除元素之后的元素向前移动。也就是说,从Vector删除最后一个元素要比删除第一个元素“开销”低好几倍。
所以如果要从前面的Vector v删除所有元素,效率最低的代码是:
for(int i=0; i<100000; i++){ v.remove(0); }
比上面代码效率快几个数量级的代码是:
for(int i=0; i<100000; i++){ v.remove(v.size()-1); }
而最好方法是直接用Vector的Method:
v.removeAllElements();
假设Vector类型的对象v包含字符串“Hello”。考虑下面的代码,它要从这个Vector中删除“Hello”字符串:
String s = "Hello"; int i = v.indexOf(s); if(i != -1) v.remove(s);
这些代码看起来没什么错误,但它同样对性能不利。indexOf()方法对v进行顺序搜索寻找字符串“Hello”,remove(s)方法也要进行同样的顺序搜索。
作如下改进之后,就可以避免第二次搜索:
String s = "Hello"; int i = v.indexOf(s); if(i != -1) v.remove(i);
而更好的做法是:
String s = "Hello"; v.remove(s);
====总结====
不良的代码编写方式导致代码性能下降。但是只要我们注意一些编程细节,采取一些简单的措施就能够避免代码性能下降。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7178747/viewspace-995287/ ,如需转载,请注明出处,否则将追究法律责任。