就ArrayList与Vector主要从二方面来说. 一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的 二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半  就HashMap与HashTable主要从三方面来说。 一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现 二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 三.值:只有HashMap可以让你将空值作为一个表的条目的key或value  什么是线程安全?        如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。   或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。 举例 比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。   在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;   而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B也向此 ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值。   那好,现在我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而 Size 却等于 2。这就是“线程不安全”了。

解决方案 »

  1.   

    只要你的ArrayList或者Vector对象不会引起并发,所谓的线程安全与否都不重要了。
      

  2.   


    有个问题,ArrayList的增长好像不是原来的一般吧!源代码这样的:
    public void ensureCapacity(int minCapacity) {
    modCount++;
    int oldCapacity = elementData.length;
    if (minCapacity > oldCapacity) {
        Object oldData[] = elementData;
        int newCapacity = (oldCapacity * 3)/2 + 1;         if (newCapacity < minCapacity)
    newCapacity = minCapacity;
                // minCapacity is usually close to size, so this is a win:
                elementData = Arrays.copyOf(elementData, newCapacity);
    }
        }
      

  3.   

    int newCapacity = (oldCapacity * 3)/2 + 1;哎,颜色不好使啊
      

  4.   

    最大的区别就是Vector现在“过时”了
      

  5.   

    ???这个int newCapacity = (oldCapacity * 3)/2 + 1;难道不表示新容量比就容量增加1一半的意思么?
      

  6.   

    是啊,前段时间,有人说了:如果你与时俱进,那么就用arrayList,如果你固步自封,就用Vector..
      

  7.   


    比如说oldCapacity=2;
    那执行(oldCapacity * 3)/2 + 1;之后的值是多少呢,是4吧!那是原来的多少倍呢?
    比如说oldCapacity=3;
    那执行(oldCapacity * 3)/2 + 1;之后的值是多少呢,是5吧!那又是原来的多少倍呢?是多少倍是不固定的,要根据oldCapacity 来的,怎么大多数人没有看源码都说是增加一半呢!包括N本书上都是这么写的,学校老师也有很多这么教的,包括很多面试官拿Vector ArrayList面试别人的时候,还指导别人说ArrayList增加的容量是一半
    对程序误解是很正常的事,真是佩服如今的网络,很多错误的理念一直继承下来,传得满天飞当然我没有贬低楼主的研究精神及分享精神,
    come on!
      

  8.   

    借17楼的代码:
    public void ensureCapacity(int minCapacity) {……}
    请问一下大家minCapacity 这个指的是什么呢?
      

  9.   

    回26楼,我觉得设计者的意图任然是增加一半的意思。
    第一,+1,保证肯定要增加,否则如果原来是1的时候就不会增加了,因为int截取是“去掉小数”形。因为“一半”本来就可能是个小数,这里的补1误差是为了防止这个。
    第二,对常用情况来说,用到的数量级至少是10,100这种数量级吧。(oldCapacity * 3)/2 + 1,如果是100,增加后是151;如果是11,增加后是16;如果是2001,增加后是3001,这样的数字让一个人回答,绝大多数人会回答“多了一半”。
    所以,对这个(oldCapacity * 3)/2 + 1理解为增加一半我觉得很合理,而且我觉得设计者的意图本来也是这个意思,有误差,是因为确实有小数原因无法做到完美的“加一半”。记忆成“增加一半”,比记忆成“增加原有容量的一半int取整后加1”方便得多。