} } }

    ArrayList VS Vector(ArrayList和Vector的差别)_口试的时辰经常呈现

    添加时间:2013-5-2 点击量:

    数据增长:当须要增长时,Vector默认增长为本来一培,而ArrayList倒是本来的一半
    同步性:Vector是线程安然的,也就是说是同步的,而ArrayList是线法度不安然的,不是同步的


    这个我们可以看看他们的源码就可以知道:


    ArrayList的size()办法:



    1 /
    
    2 Returns the number of elements in this list.
    3
    4 @return the number of elements in this list
    5 /
    6 public int size() {
    7 return size;
    8 }


    Vector的size()办法:



    1 /
    
    2 Returns the number of components in this vector.
    3
    4 @return the number of components in this vector
    5 /
    6 public synchronized int size() {
    7 return elementCount;
    8 }


    其实Vector的其他很多办法都是同步的:



     1 /
    
    2 Sets the size of this vector. If the new size is greater than the
    3 current size, new {@code null} items are added to the end of
    4 the vector. If the new size is less than the current size, all
    5 components at index {@code newSize} and greater are discarded.
    6
    7 @param newSize the new size of this vector
    8 @throws ArrayIndexOutOfBoundsException if the new size is negative
    9 /
    10 public synchronized void setSize(int newSize) {
    11 modCount++;
    12 if (newSize > elementCount) {
    13 ensureCapacityHelper(newSize);
    14 } else {
    15 forint i = newSize ; i < elementCount ; i++) {
    16 elementData[i] = null;
    17 }
    18 }
    19 elementCount = newSize;
    20 }
    21
    22 /
    23 Returns the current capacity of this vector.
    24
    25 @return the current capacity (the length of its internal
    26 data array, kept in the field {@code elementData}
    27 of this vector)
    28 /
    29 public synchronized int capacity() {
    30 return elementData.length;
    31 }
    32
    33 /
    34 Returns the number of components in this vector.
    35
    36 @return the number of components in this vector
    37 /
    38 public synchronized int size() {
    39 return elementCount;
    40 }
    41
    42 /
    43 Tests if this vector has no components.
    44
    45 @return {@code true} if and only if this vector has
    46 no components, that is, its size is zero;
    47 {@code false} otherwise.
    48 /
    49 public synchronized boolean isEmpty() {
    50 return elementCount == 0;
    51 }


    那如今我们应当设计一个规划来研究我们的这些结论的正确性!!


    下面给出ArrayList线程不安然证实规划:



     1 /
    
    2
    3 /
    4 package com.b510;
    5
    6 import java.util.ArrayList;
    7 import java.util.Collections;
    8 import java.util.List;
    9
    10 /
    11 @date 2013-5-2
    12 @author xhw
    13
    14 /
    15 public class HongtenArrayList implements Runnable {
    16 //线程不安然
    17 List<String> list = new ArrayList<String>(1);
    18 //线程安然
    19 //List<String> list = Collections.synchronizedList(new ArrayList<String>());
    20 public void run() {
    21 try {
    22 Thread.sleep((int) (Math.random() 2));
    23 } catch (InterruptedException e) {
    24 e.printStackTrace();
    25 }
    26 System.out.println(Thread.currentThread().getName());
    27 list.add(Thread.currentThread().getName());
    28 }
    29
    30 public static void main(String[] args) throws InterruptedException {
    31 ThreadGroup group = new ThreadGroup(hongtenGroup);
    32 HongtenArrayList t = new HongtenArrayList();
    33 forint i = 0; i < 10000; i++) {
    34 Thread th = new Thread(group, t, String.valueOf(i));
    35 th.start();
    36 }
    37 while (group.activeCount() > 0) {
    38 Thread.sleep(10);
    39 }
    40 System.out.println(result=============);
    41 //若是线程安然,那么成果是10000,若是线程不安然,则成果不成猜测
    42 System.out.println(t.list.size());
    43 }
    44
    45 }


    下面贴出项目组运行成果:


    线程不安然:



    当然线程安然下面会呈现:(运行成果都是10000)



    9982
    
    9988
    9990
    9979
    9981
    9977
    9965
    9971
    9848
    9846
    9989
    9993
    9991
    9678
    9995
    9992
    9998
    9994
    9996
    9997
    9999
    result
    =============
    10000


    对于增长,我们可以看看ArrayList的源码:


    ArrayList:grow()



     1 /
    
    2 Increases the capacity to ensure that it can hold at least the
    3 number of elements specified by the minimum capacity argument.
    4
    5 @param minCapacity the desired minimum capacity
    6 /
    7 private void grow(int minCapacity) {
    8 // overflow-conscious code
    9 int oldCapacity = elementData.length;
    10 int newCapacity = oldCapacity + (oldCapacity >> 1);
    11 if (newCapacity - minCapacity < 0
    12 newCapacity = minCapacity;
    13 if (newCapacity - MAX_ARRAY_SIZE > 0
    14 newCapacity = hugeCapacity(minCapacity);
    15 // minCapacity is usually close to size, so this is a win:
    16 elementData = Arrays.copyOf(elementData, newCapacity);
    17 }


    Vector:grow()



     1 private void grow(int minCapacity) {
    
    2 // overflow-conscious code
    3 int oldCapacity = elementData.length;
    4 int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
    5 capacityIncrement : oldCapacity);
    6 if (newCapacity - minCapacity < 0
    7 newCapacity = minCapacity;
    8 if (newCapacity - MAX_ARRAY_SIZE > 0
    9 newCapacity = hugeCapacity(minCapacity);
    10 elementData = Arrays.copyOf(elementData, newCapacity);
    11 }


    容易发怒的意思就是: 别人做了蠢事, 然后我们代替他们, 表现出笨蛋的样子。—— 蔡康永
    分享到: