常见结论:
ArrayList的底层是数组结构(正确)
数组的默认长度为10,当数组添加满了的时候,会自动扩容为1.5倍(不完全正确)
ArrayList的扩容过程:
第一种情况:元素单个添加:
第一步:创建数组:
ArrayList<String> list = new ArrayList<>();
此时在底层会创建一个默认长度为0的数组,名字叫做elementData;
还有一个成员变量,叫Size,用来记录元素的个数,最开始Size=0。
第二步:往集合里添加数据:
list.add("A");//添加了一个元素,Size=1(记录的是元素的个数),注意此时集合的长度为10(底层数组的长度为10);
list.add("B");//又添加了一个数据,Size=2,默认长度仍然为10;
list.add("C");//以此类推。
直到加到了10
1.首先:底层就会创建一个新的数组,这个数组的长度是10*1.5=15(扩容因子为1.5);
2.其次:底层就会调用一个数组工具类里面的Arrays.copyof()方法将老的数组中的数据拷贝到新的数组里面去;
3.最后:再将新的数据继续装到新数组里就可以了。
OK,单个元素的添加情况就是这样
第二种情况:元素批量加入:
第一步:创建一个集合:
ArrayList<String> list1=new ArrayList<>();
我们假设这个集合有100个元素,
第二步:将这个新的集合里的元素一次性加入到第一个的集合中(使用addAll() 方法)
list.addAll(list1);
那第一个集合肯定扩容成15肯定还不够
所以此时他是直接加进去,所以此时第一个集合的长度为100+3=103,100是新加的,3是原本有的(之前添加的A,B,C)
(也就是底层创建了一个长度为103的新数组)
底层逻辑:
这两种情况:在代码的底层,会有一个Arrays.Max()的方法去比较默认新增的长度(也就是5嘛)和实际需要新增的长度(也就是100嘛)
比较一下谁大,谁大那我们就扩容多少长度