发布于2021-06-08 11:12 阅读(171) 评论(0) 点赞(21) 收藏(1)
可以看到,他依然还是继承了AbstractList与实现了List接口,这个与JDK1.7的没啥区别
可以看到,这个相比于jdk1.7的多出来了一常量Object数组,名字为DEFAULTCAPACITY_EMPTY_ELEMENTDATA
可以看到无参构造使用的是DEFAULTCAPACITY_EMPTY_ELEMENTDATA空数组,而使用指定容量的构造方法,当容量为0时,使用的是EMPTY_ELEMENTDATA。
即将无参构造的空数组与指定容量为0的有参构造方法区分开来
我们来看一下为什么要加这个DefaultCapacity_empty_elementData空数组
注释上说,是为了了解添加第一个元素时要膨胀多少
可以看到add方法与JDK1.7是几乎一样的,步骤都是
接下来,我们看看ensureCapacityInternal与ensureExplicitCapacity是怎么执行的
这里是一个与JDK1.7的不同点,我们回顾一下JDK1.7的版本是怎样的
JDK1.7是要先针对第一次的无参构造产生的elementData进行扩容(要设置默认容量为10)
但JDK1.8却没有针对第一次的无参构造产生的空数组进行扩容,但其还调用了另一个方法calculateCapacity来进行计算需要的容量
那接下来就看看,这个方法做了什么
可以看到,这个calculateCapacity方法做的内容跟JDK1.7的ensureCapacityInternal的第一步针对无参构造的判断几乎是一致,JDK1.8只不过将这一步拆分出来放在了calculateCapacity里
然后ensureExplicitCapacity是一致的,都是ensureCapacityInternal最后都要进行调用的方法,判断当前新增所需的容量大于当前的容量,大于就要进行扩容
接下来看看grow方法
跟JDK1.7也是一样的,没有任何变化
接下来,我们看看另一个add方法
可以看到,跟JDK1.7的是一样的,连rangeCheckForAdd都是一样的
步骤也是一样的
可以看到clear方法也是没变的,跟jdk1.7一摸一样
也是遍历底层Object数组,然后逐个设置为Null,让gc收集不要的引用
跟jdk1.7也是一摸一样的
也是跟JDK1.7一样,丝毫没有变过
看一下fastRemove方法
也是跟JDK1.7没用,没变的
调用arraycopy去将底层数组指定索引后面的那些元素往前移动一位,然后删除最后一位,将最后一位设为Null,让gc回收不要的引用
修改元素只有一个set方法
步骤如下
克隆的方法也是基本没变过的,也是浅拷贝
JDK1.7与JDK1.8的ArrayList几乎是相差无几的,不过在早期的JDK1.7好像无参构造方法是直接调用this(10)去调用指定容量的构造方法
不同点总结一下
原文链接:https://blog.csdn.net/GDUT_Trim/article/details/117574669
作者:java小王子
链接:http://www.javaheidong.com/blog/article/219441/b073d1841f3f612b12a0/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!