- 前言
- 一、初始化
- 二、添加元素
- 总结
- 参考文献
一、初始化
Vector跟ArrayList一样实现了List接口,但是它是线程同步的,方法上加了synchronized同步锁,所以线程安全效率低。
public Vector() { this(10); } public Vector(int initialCapacity) { this(initialCapacity, 0); } public Vector(int initialCapacity, int capacityIncrement) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity]; this.capacityIncrement = capacityIncrement; }
当执行List
protected transient int modCount = 0; protected Object[] elementData; protected int elementCount; public synchronized boolean add(E e) { modCount++; add(e, elementData, elementCount); return true; } private void add(E e, Object[] elementData, int s) { if (s == elementData.length) elementData = grow(); elementData[s] = e; elementCount = s + 1; } private Object[] grow() { return grow(elementCount + 1); } private Object[] grow(int minCapacity) { return elementData = Arrays.copyOf(elementData, newCapacity(minCapacity)); } protected int capacityIncrement; private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; private int newCapacity(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity); if (newCapacity - minCapacity <= 0) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return minCapacity; } return (newCapacity - MAX_ARRAY_SIZE <= 0) ? newCapacity : hugeCapacity(minCapacity); } private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; }
1)modCount++是记录了修改次数,也不知道有什么用,modCount是来自AbstractList抽象类的静态属性,Vector、ArrayList都继承了这个类。
2)扩容机制,如果要在第size-1后面加一个元素,需要判断底层数组的长度为size,那么就开始实现扩容机制,来到newCapability()函数进行扩容,而跟ArrayList扩容的区别在于int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);每次扩容自原来的两倍,而上限的确定就是一样的,当扩容到大于默认长度,就需要看原来的长度,添加一个元素即length+1是否大于默认最大长度MAX_ARRAY_SIZE,是就扩容至最大Integer.MAX_VALUE,否则就用最大默认长度作为扩容的大小,而不是用原来的二倍作为扩容大小。
1)初始化,不会懒加载一个空数组,而是之间初始化长度为10的数组。
2)添加元素,主要是扩容机制,不同于ArrayList的是先扩容原来的一倍,然后再判断是否超过MAX_ARRAY_SIZE来做进一步的真实扩容。
[1] [JDK 1.12 源码]
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)