构造方法
注意:ArrayList不指定初始化大小,默认为10,每次扩容1.5倍。
//ArrayList: 使用的是数组结构,对于增加删除慢,查找快。
ArrayList<Integer> arr = new ArrayList<>();
注意:如果指定每次增加的容量为0,则每次扩容为之前的2倍。
Vector<Integer> arr = new Vector<>();
arr.add(100);
System.out.println(arr.get(0));//传入下标获得对应位置的值
如果不需要线程安全实现,建议使用ArrayList代替Vector 。
add(添加)
public boolean add(E e) {
modCount++;
//要添加的内容,添加的数组,数组长度
add(e, elementData, size);
return true;//永远返回true
}
private void add(E e, Object[] elementData, int s) {
if (s == elementData.length)//判断是否满了
elementData = grow();//扩容算法
elementData[s] = e;
size = s + 1;
}
private Object[] grow() {
return grow(size + 1);
}
private Object[] grow(int minCapacity) {
return elementData = Arrays.copyOf(elementData,
newCapacity(minCapacity));
}
private int newCapacity(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
//扩容
int newCapacity = oldCapacity + (oldCapacity >> 1);
//判断扩容后够不够
if (newCapacity - minCapacity <= 0) {
//如果当前数据存的是默认的,就是初始化放的东西
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
//默认长度和最小需要的长度比较(10,1)
return Math.max(DEFAULT_CAPACITY, minCapacity);
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
//需要多少给多少
return minCapacity;
}
//新扩容长度-允许的最大长度(int类型最大值减8)
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//在int最大值-8和int最大值之间
: MAX_ARRAY_SIZE;//在int最大值-8范围内
}
扩容:右移,每次扩容为旧长度的1.5倍。
int newCapacity = oldCapacity + (oldCapacity >> 1);
默认:DEFAULT_CAPACITY=10
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
return Math.max(DEFAULT_CAPACITY, minCapacity);
判断溢出:超过int的范围,符号位改变。
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
使用方法:
ArrayList<Integer> arr = new ArrayList<>();
arr.add(100);
System.out.println(arr.get(0));//传入下标获得对应位置的值