ArrayList在JDK7以前和JDK8之后中实现方式略有不同。
JDK 7版本中:
ArrayList list = new ArrayList();//底层创建了长度是10的Object[]数组elementDate list.add(123);//elementData[0] = new Integere(123); ··· list.add(11);//如果此次的添加导致底层elementData数组容量不够,则扩容。
默认情况下,扩容为原来的容量的1.5倍,同时需要将原有数组中的数据复制到新的数组中。
结论:建议开发中使用带参的的构造器
ArrayList list = new ArrayList(int capacity);
JDK 8版本中:
ArrayList list = new ArrayList();//底层Object[] elementData初始化为{},并没有创建长度10的数组 list.add(123);//第一次调用add()时,底层才创建了长度10的数组,并将数据123添加到elementDate中 ···
后续的添加和扩容和JDK 7中无异。
结论:jdk7中的ArrayList的对象的创建类似于单例中的饿汉式,而jdk8中的ArrayList的对象的创建类似于单例的懒汉式,延迟了数据的创建,节约内存。