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             for (int 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         for (int 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     }
容易发怒的意思就是: 别人做了蠢事, 然后我们代替他们, 表现出笨蛋的样子。—— 蔡康永
                     
                  
     
  
 
    
    
数据增长:当须要增长时,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 for (int 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 for (int 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 }
容易发怒的意思就是: 别人做了蠢事, 然后我们代替他们, 表现出笨蛋的样子。—— 蔡康永




