数据增长:当需要增长时,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 }