- 在
JDK1.7中,使用ArrayList list = new ArrayList()创建List集合时,底层直接创建了长度是10的Object[]数组elementData;
在接下来调用add()方法向集合中添加元素时,如果本次的添加导致底层elementData数组容量不足,则进行扩容。
默认情况下,扩容为原来的1.5倍(>>1),同时将原来数组中的所有数据复制到新的数组中。- 故而,由此得到结论,在开发中,建议使用带参构造器创建List集合:
ArrayList list = new ArrayList(int capacity),
预估集合的大小,直接一次到位,避免中间的扩容,提高效率。
- 在
JDK1.8中,使用ArrayList list = new ArrayList()创建List集合时,底层的Object[] elementData初始化为{},并没有直接创建长度为10的数组;
而在第一次调用add()方法时,底层才创建了长度为10的数组,并将本次要添加的元素添加进去。
...
后续的添加和扩容操作与JDK1.7无异。
总结:JDK1.7中的ArrayList对象的创建,类似于单例中的饿汉式;而JDK1.8,则类似于单例中的懒汉式。
你品,你细品。
这么做的好处就是:延迟了数组的创建,节省内存空间。