源码分析之ArrayList

1.  基于数组实现,可随机访问。实现了RandomAccess接口。数组默认大小为10。

2. 添加元素
使用ensureCapacityInternal()方法保证容量充足。容量不够时,用grow()方法来进行扩容,新容量为原来1.5倍。扩容操作会调用Arrays.copyof(),将元素组复制到新数组中。代价很高,因为创建时最好确定大概容量大小,减少扩容次数。

3.删除元素
适应System.arraycopy()将index+1后面的元素都复制到index位置。复杂度为O(N),所以删除元素代价很高。

4.序列化
因为Arraylist基于数组实现,具有动态扩容的特性。因此保存的元素不一定都会使用。所以没必要全部序列化。
保存元素的数组elementdata.使用transient修饰。该关键字声明数组默认不会被序列化。
Arraylist实现了readObject()和writeObject()来控制只序列化数组中有元素填充的部分。

5. fail-fast
modCount用来记录Arraylist发生结构变化的次数。数组中删除或添加至少一个元素的操作。仅仅改变元素的值不算结构变化。

进行序列化或者迭代操作时会进行对比操作前后的modCount,如果改变了,需要抛出ConcurrentModificationException.。
全部评论

相关推荐

07-03 16:13
嘉应学院 Python
xiaolihuam...:很明显骗子,如果是hr直接约你面试了,哪用得着内推,如果是员工的话,你得多优秀,一线员工直接加你微信,
点赞 评论 收藏
分享
07-09 20:50
门头沟学院 Java
码农索隆:1.教育背景和荣誉证书合二为一。 2.获奖项目理一遍,你做了什么,对你求职的岗位有什么帮助,没有就删掉。 3.技能特长和教育背景交换位置。 4.技能特长写的太差,上网上找简历参考。都不用问你别的,一个redis就能把你问住,写写你具体会redis哪些方面的知识。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-24 13:39
在记录秋招的大魔王很...:别被忽悠了,我做了多年销售。我可以告诉你,这就是忽悠你的,销售一定要看底薪也要看提成两者不可缺一。提成是有业绩的时候才拿的到的,谁能保证一直有单状态都好。销售有时候很讲究运气的。底薪是你这个人这个岗位日常工作体现的价值。别小看底薪,你看那些跳槽去做经理主管的,底薪底一些,人家愿意去吗?所以那些说销售靠提成的纯属忽悠,除非他们的业务很容易成单。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务