Java的ArrayList与Vector比较

来源:互联网 发布:集搜客网页抓取软件 编辑:程序博客网 时间:2024/06/07 02:58
其两者内部数据保存都是由数组实现

1. ArrayList的实现是线程不同的(方法实现上没有加 synchronized),而Vector是线程同步的。若想线程安全,那么它必须 保持外部同步。这样造成的结果:效率比Vector高,但是线程不安全。
2. ArrayList扩容时每次为原来的50%, 而Vector扩容1倍。

若ArrayList线程同步,需采用如下的方式:

* It is imperative that the user manually synchronize on the returned
     * list when iterating over it:
     * <pre>
     *  List list = Collections.synchronizedList(new ArrayList());
     *      ...
     *  synchronized(list) {    //确保整个代码块是同步的
     *      Iterator i = list.iterator(); // Must be in synchronized block
     *      while (i.hasNext())
     *          foo(i.next());
     *  }

这是Stackoverflow的解释:



其具体实现代码如下所示:
首先创建ArrayList, 然后调用Collections的静态方法
publicstatic<T> List<T> synchronizedList(List<T>list)


其中,SynchronizedList<E>是Collections的一个内部静态类,


其返回的List是同步的原因:在SynchronizedList静态内部类中,通过synchronized同步代码块来完成同步,其本质还是调用了ArrayList的一些操作函数,例如add操作:

因此,SynchroizedList 与Vector的区别:
1 同步的方式: SynchronizedList采用同步块,而Vector采用同步方法
2 扩容大小:  SynchronizedList每次扩容50%, 而Vector正好扩大一倍。


参考资料:
http://www.cnblogs.com/yanghuahui/p/3365976.html
http://stackoverflow.com/questions/9468187/collections-synchronizedlist-and-synchronized

0 0
原创粉丝点击