1、默认arrayList的数组未初始化,长度为0,容量默认是10
ArrayList<Integer> arrayList = new ArrayList<>();
System.out.println(ClassLayout.parseInstance(arrayList).toPrintable());
java.util.ArrayList object internals:
OFF SZ TYPE DESCRIPTION VALUE
0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)
8 4 (object header: class) 0x0000d7a0
12 4 int AbstractList.modCount 0
16 4 int ArrayList.size 0
20 4 java.lang.Object[] ArrayList.elementData []
Instance size: 24 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
2、第一次使用时会初始化:长度为1,容量是10
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
System.out.println(ClassLayout.parseInstance(arrayList).toPrintable());
java.util.ArrayList object internals:
OFF SZ TYPE DESCRIPTION VALUE
0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)
8 4 (object header: class) 0x0000d7a0
12 4 int AbstractList.modCount 1
16 4 int ArrayList.size 1
20 4 java.lang.Object[] ArrayList.elementData [1, null, null, null, null, null, null, null, null, null]
Instance size: 24 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
3、第一次扩容:第11次添加数据时扩容,长度为11,容量扩容为15
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
for (int i = 2; i <=10; i++) {
arrayList.add(i);
}
arrayList.add(11);
System.out.println(ClassLayout.parseInstance(arrayList).toPrintable());
java.util.ArrayList object internals:
OFF SZ TYPE DESCRIPTION VALUE
0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0)
8 4 (object header: class) 0x0000d7a0
12 4 int AbstractList.modCount 11
16 4 int ArrayList.size 11
20 4 java.lang.Object[] ArrayList.elementData [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, null, null, null, null]
Instance size: 24 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
4、 实现通用的数组:ArrayList
- 初始化:内部使用数组保存数据
- 方法:是否为空,是否已满,获取元素个数,新增数据,删除数据,修改数据,获取指定索引位置的数据,遍历打印:正序反序,扩容,缩容
5、ArrayList集合的长度和容量不是同一个意思。
- 长度(size)是指ArrayList中当前存储的元素数量。而容量(capacity)是指ArrayList内部数组可以容纳的元素数量。在ArrayList初始化时,它会创建一个内部数组,这个数组的初始大小是10。即使你还没有添加任何元素,这个数组仍然存在,所以ArrayList的初始长度是0,但初始容量是10。
- 当你向ArrayList添加元素时,如果当前长度小于容量,那么它不会重新分配数组。只有当长度超过了容量时,ArrayList才会考虑扩容,扩容后的容量通常是原容量的1.5倍加上10。
- 所以,长度和容量是两个不同的概念,但它们之间有一定的关联。
- ArrayList集合的length和capacity不是同一个意思。
- length表示ArrayList集合中元素的个数,可以通过size()方法获取。
- capacity表示ArrayList集合的容量,即当前ArrayList能够存储的元素个数的上限,可以通过capacity()方法获取。
- 简单来说,length表示当前ArrayList中存储的元素个数,
- 而capacity表示ArrayList能够存储的元素个数的上限。当向ArrayList中添加元素时,如果超过了ArrayList的容量,ArrayList会自动扩展其容量,以容纳更多的元素。