ArrayList无参初始化默认容量是0,往list里面添加一个元素,容量开始扩容,扩容大小是10,当我的size到达10之后,再继续添加时,容量是拿当前的容量乘以1.5倍,舍去小数取整,即为新容量大小。
请看如下代码测试:
/** * @Description 测试List集合的扩容机制(jdk1.8) */ public class Test { public static void main(String[] args) { //测试默认容量是0,第一次扩容后是10,以后按照1.5倍扩容,即第二次扩容后是15*1.5=22 //测试默认容量(0)和元素的个数(0) ArrayList<Integer> list1 = new ArrayList<>(); // 获取容量 Integer capacity = getCapacity(list1); int size = list1.size(); System.out.println("list1的默认容量:" + capacity); System.out.println("list1的大小:" + size); System.out.println("----------------------------"); //测试添加1个元素后的容量(10)和元素的个数(1) ArrayList<Integer> list2 = new ArrayList<>(); list2.add(1); // 获取容量,arraylist初始化容量是10 capacity = getCapacity(list2); size = list2.size(); System.out.println("list2的容量:" + capacity); System.out.println("list2的大小:" + size); System.out.println("----------------------------"); //测试添加11个元素后的容量(15)和元素的个数(11) ArrayList<Integer> list3 = new ArrayList<>(); // 获取容量,arraylist初始化容量是10 capacity = getCapacity(list3); for (int i = 0; i < 11; i++) { list3.add(i); } capacity = getCapacity(list3); size = list3.size(); System.out.println("list3的容量:" + capacity); System.out.println("list3的大小:" + size); System.out.println("----------------------------"); //测试添加16个元素后的容量(15*1.5=22)和元素的个数(16) ArrayList<Integer> list4 = new ArrayList<>(); for (int i = 0; i < 16; i++) { list4.add(i); } capacity = getCapacity(list4); size = list4.size(); System.out.println("list4的容量:" + capacity); System.out.println("list4的大小:" + size); } //获取List的容量 public static Integer getCapacity(ArrayList list) { Integer length = null; Class clazz = list.getClass(); Field field; try { field = clazz.getDeclaredField("elementData"); field.setAccessible(true); Object[] object = (Object[]) field.get(list); length = object.length; return length; } catch (Exception e) { e.printStackTrace(); } return length; } }