JDK1.8ArrayList源码分析
ArrayList几个对象:
1、默认容量,默认为10。tips:在new ArrayList()的时候并不会创建一个长度为10的数组,这个数值在add的时候如果发现没有指定容量会初始化一个10长度的Object[]给它
2、空对象数组。主要用于length=0时赋值
3、空对象数组。主要用于比较是否为空数组和new ArrayList()赋值
4、实际存放数据数组对象。transient关键字在本博客中已有阐释点击打开链接。不为Private的原因是为了让内部类更容易访问。
那么,问题来了,为什么这个Object[]对象要用此关键字修饰呢?
原因是在序列化过程中,如果用Serializable方式去序列化,elementData通常有预留的缓存容量,会导致不必要的空间和时间的浪费。所以ArrayList重写了Serializable的序列化方法,通过size+实际容量的方式去序列化。tips:如何定制化序列化方式点击打开链接
5、实际容量。
ArrayList几个方法:
add方法:
1、检查容量
2、扩容的最小值为10
3、记录修改次数,验证扩容长度必须大于数组容量
4、扩容的量级为原来数组容量的1.5倍!采用的是new更大的数组去copy-parse填充!
clear()方法:
将值设置为null,让垃圾回收器回收无引用对象。
System.arraycopy()和Arrays.copyOf()在ArrayList中被大量使用,同样的COPY有什么区别呢?
System.arraycopy方法:
此方法的作用是将dest从destPos到destPos+length的位置赋值给src从srcPos的位置开始,此方法是native方法点击打开链接
Arrays.copyOf方法:
生成新的数组去接收,再用System.arraycopy去赋值,为了一个数组复制另一个数组的时候,对象引用一致导致数据操作出问题!
小结:这个差别,也是深浅拷贝的区别!传送门