ArrayList源码的阅读与理解

来源:互联网 发布:麒麟ubuntu安装 编辑:程序博客网 时间:2024/05/20 18:16

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去赋值,为了一个数组复制另一个数组的时候,对象引用一致导致数据操作出问题!

小结:这个差别,也是深浅拷贝的区别!
























原创粉丝点击