Java Vector与ArrayList的区别

时间:2021-10-21 13:30:16
Java Vector与ArrayList的区别   俗话说最危险的地方最安全,写Java代码的时候Vector估计是最常用的集合类了,ArrayList用得也不少。不过关于这两个类有什么区别竟然从来就没去关注过,直到今天才偶然发现这两个类其实有重大区别,即Vector的所有方法都加了synchronized,而ArrayList没有加。 这一点区别可不小,虽然Java对synchronized是优化再优化,再比起不加synchronized的总是慢一些。马上做了个简单测试,写程序各自调用Vector.get()和ArrayList.get()1亿次,分别在我本本上的Sun JVM 5.0和6.0上跑,结果如下:                           JDK 5.0        JDK 6.0 Vector.get()        1861            1506 ArrayList.get()     1268            1073 其中单位都是毫秒。由此可见无论是JDK 6还是5中,使用synchronized的Vector的性能都比ArrayList差了50%。顺便也可以看出JDK 6相对于JDK 5性能有明显提升,不知道是不是JDK 6中用的Linear scan register allocation的功效,其中使用synchronized时的性能提升更明显(一个是提高15%,一个是提高20%),估计是JDK 6里的Biased locking的结果。 顺便再看了一下Vector和ArrayList的实现(在Eclipse里看JDK代码太方便了,赞一下),还发现Vector与ArrayList的以下区别:
  1. ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍
  2. Vector提供indexOf(obj, start)接口,ArrayList没有
另外Vector本来不是Java Collection Framework里的成员,在JDK 1.2的时候为了实现List再把它弄到里面去的,有点外来人的感觉。 看来原来很多地方都不应该用Vector,应该用ArrayList。因为大部分情况下都不需要用到Vector的同步机制,即使真正在进行同步的地方,用Vector的同步通常也还是不能满足用户需求的。