源码分析三(Vector与ArrayList的区别)
2014-10-15 19:58
363 查看
前面讨论过ArrayList与LinkedList的区别,ArrayList的底层数据结构是数组Object[],而LinkedList底层维护
的是一个链表Entry,所以对于查询,肯定是ArrayList的效率高,但是对于删除和插入则是LinedList效率高。
现在我们再来看看Vector与ArrayList的区别,直接上源码,ArrayList源码:
1:扩容方面,ArrayList扩容扩原来容量的2/3+1,而Vector扩容为原来容量的2倍
2:Vector源码
默认创建的Vector对象new Vector(); 默认
调一个参数的构造方法:
默认增长容量为0
调用两个参数的构造方法:
所以
新的容量扩展到原来的2倍。
再来看它们的另外一个区别,ArrayList类中的方法都是没有synchronized修饰的,所以都是非线程安全的,
获取集合中元素数量:
判断集合是否为空:
。。。。。
再来看看Vector类,方法都是由synchronized修饰,所以是线程安全的,万事都是有利有弊,线程安全的处理数据效率会低,而线程非安全的处理
数据效率相对高一些:
。。。。。。
的是一个链表Entry,所以对于查询,肯定是ArrayList的效率高,但是对于删除和插入则是LinedList效率高。
现在我们再来看看Vector与ArrayList的区别,直接上源码,ArrayList源码:
1:扩容方面,ArrayList扩容扩原来容量的2/3+1,而Vector扩容为原来容量的2倍
1 public void ensureCapacity(int minCapacity) { 2 modCount++; //容器中元素的数量 3 int oldCapacity = elementData.length; 4 if (minCapacity > oldCapacity) { 5 Object oldData[] = elementData; //新的容量 6 int newCapacity = (oldCapacity * 3)/2 + 1; 7 if (newCapacity < minCapacity) 8 newCapacity = minCapacity; 9 // minCapacity is usually close to size, so this is a win: 10 elementData = Arrays.copyOf(elementData, newCapacity); 11 } 12 }
2:Vector源码
1 private void ensureCapacityHelper(int minCapacity) { 2 int oldCapacity = elementData.length; 3 if (minCapacity > oldCapacity) { 4 Object[] oldData = elementData; 5 int newCapacity = (capacityIncrement > 0) ? 6 (oldCapacity + capacityIncrement) : (oldCapacity * 2); 7 if (newCapacity < minCapacity) { 8 newCapacity = minCapacity; 9 } 10 elementData = Arrays.copyOf(elementData, newCapacity); 11 } 12 }
默认创建的Vector对象new Vector(); 默认
capacityIncrement = 0
1 public Vector() { 2 this(10); 3 }
调一个参数的构造方法:
1 public Vector(int initialCapacity) { 2 this(initialCapacity, 0); 3 }
默认增长容量为0
调用两个参数的构造方法:
1 public Vector(int initialCapacity, int capacityIncrement) { 2 super(); 3 if (initialCapacity < 0) 4 throw new IllegalArgumentException("Illegal Capacity: "+ 5 initialCapacity); 6 this.elementData = new Object[initialCapacity]; 7 this.capacityIncrement = capacityIncrement; 8 }
所以
int newCapacity = (capacityIncrement > 0) ? (oldCapacity + capacityIncrement) : (oldCapacity * 2);
新的容量扩展到原来的2倍。
再来看它们的另外一个区别,ArrayList类中的方法都是没有synchronized修饰的,所以都是非线程安全的,
获取集合中元素数量:
1 public int size() { 2 return size; 3 }
判断集合是否为空:
1 public boolean isEmpty() { 2 return size == 0; 3 }
1 public boolean contains(Object o) { 2 return indexOf(o) >= 0; 3 }
。。。。。
再来看看Vector类,方法都是由synchronized修饰,所以是线程安全的,万事都是有利有弊,线程安全的处理数据效率会低,而线程非安全的处理
数据效率相对高一些:
1 public synchronized void setSize(int newSize) { 2 modCount++; 3 if (newSize > elementCount) { 4 ensureCapacityHelper(newSize); 5 } else { 6 for (int i = newSize ; i < elementCount ; i++) { 7 elementData[i] = null; 8 } 9 } 10 elementCount = newSize; 11 }
1 public synchronized int capacity() { 2 return elementData.length; 3 }
1 public synchronized int size() { 2 return elementCount; 3 }
1 public synchronized boolean isEmpty() { 2 return elementCount == 0; 3 }
。。。。。。
相关文章推荐
- java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析
- 从源码分析ArrayList和Vector区别
- java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析
- ArrayList和LinkedList和Vector源码分析
- 从源码分析ArrayList和LinkList的区别
- java源码分析之集合框架 ArrayList和LinkedList的区别05
- 从源码分析ArrayList和LinkList的区别
- 源码分析二(ArrayList与LinkedList的区别)
- 源码分析-java-Vector、Stack-与ArrayList的相关性
- Vector ArrayList LinkedList区别 深度分析 自我总结
- 源码浅析 ArrayList、Vector、LinkedList 的区别
- 比较分析Vector、ArrayList和hashtable hashmap数据结构
- 比较分析Vector、ArrayList和hashtable hashmap数据结构
- 比较分析Vector、ArrayList和hashtable hashmap数据结构
- ArrayList和Vector的区别
- Vector和ArrayList的一点区别
- 关于vector的一点源码分析
- 比较分析Vector、ArrayList和hashtable hashmap数据结构
- 比较分析Vector、ArrayList和hashtable hashmap数据结构
- 比较分析Vector、ArrayList和hashtable hashmap数据结构