ArrayList
- ArrayList底层是一个动态数组
- ArrayList的构造方法
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
- 声名的变量elementData
transient Object[] elementData;
- 默认添加元素的时候数组的大小
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
- 调用完ArrayList的构造方法就会得到一个长度为0的数组
add方法的源码
public boolean add(E e) {
// size是ArrayList类的一个成员变量(ArrayList中的元素),默认值为0
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
- ensureCapacityInternal方法
private void ensureCapacityInternal(int minCapacity) {
// 前面把DEFAULTCAPACITY_EMPTY_ELEMENTDATA赋值给elementData
// 取DEFAULT_CAPACITY和minCapacity两个的最大值给minCapacity
// minCapacity为传入的值,传入的值为1
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
- DEFAULT_CAPACITY 声名的时候值为10
private static final int DEFAULT_CAPACITY = 10;
- ensureExplicitCapacity方法传入的参数为10
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
// 传入的参数为10,elementData数组长度为0,相减结果为10>0
// *如果数组还没有满则不执行grow方法
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
调用grow方法传入参数的值为10
private void grow(int minCapacity) {
// overflow-conscious code
// elementData数组的长度为0
int oldCapacity = elementData.length;
// newCapacity 为0
int newCapacity = oldCapacity + (oldCapacity >> 1);
// newCapacity为0, minCapacity为10,相减结果小于0
if (newCapacity - minCapacity < 0)
// newCapacity被赋值为10
newCapacity = minCapacity;
// MAX_ARRAY_SIZE 为Integer.MAX_VALUE - 8
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
// 把数组中的元素拷贝到一个长度为newCapacity的数组中
elementData = Arrays.copyOf(elementData, newCapacity);
}
上面int newCapacity = oldCapacity + (oldCapacity >> 1)可以看出来,ArrayList每次扩容增加原数组长度的一半
当需要给一个ArrayList中添加很多元素的时候,最好给ArrayList指定一个初始长度,避免多次扩容导致代码性能下降
Java8新增的遍历方法
Java8 之后为ArrayList(集合)提供了新的方法forEach方法,配合lambda表达式可以简化集合的遍历
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(5);
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
// 使用forEach方法配合lambda表达式遍历集合
list.forEach((number)->System.out.println(number));
}
结果