jdk7中:
ArrayList list = new ArrayList;//底层创建了长度是10的Object[]数组elementData
list.add(123);//elementData[0] = new Integer[123];
...
list.add(11);//如果此次的添加导致底层elementData数组容量不够,则扩容。
//默认情况下,扩容为原来的1.5倍,同时需要将原有数组中的数组复制到新的数组中。
结论:
建议开发中使用带参的构造器:ArrayList list=new ArrayList(int capacity)
jdk8中的变化:
ArrayList list = new ArrayList();//底层Object[] elementData初始化为{},并没有创建长度为10的数组
list.add(123);//第一次调用add()时,底层才创建了长度为10的数组,并将123添加到element[0]中
...
//后续的添加与扩容操作与jdk7无异
小结:
- jdk7中的ArrayList的对象的创建类似于单例的饿汉式
- jdk8中的ArrayList的对象的创建类似于单例的懒汉式,延迟了对象的创建,节省内存空间