ArrayList源码的阅读与理解

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

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
























  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值