昨天在微信公众号看到了一篇文章,题目是“你真的会写java代码吗?”,文章大概意思是说很多程序员过于注重系统的业务,而忽略了写代码的能力。文章最后出了一个题目,自己写一个有ArrayList功能的类,作者说他们公司的很多程序员居然写不出来。我们平常工作中,ArrayList是我们经常使用的一个集合类,于是我有了兴趣,花了10分钟简单实现了一下,测试了下,也确实可以做到增删查改,代码比较粗糙,这里就不贴了,有兴趣的同学可以自己实现看看。
我一直有一颗爱好学习的心态,看了下自己写的代码,想研究下ArrayList源码是怎么写的。
下图是ArrayList类继承的类和实现的接口。
所以,ArrayList具有以下特点:
1、因为实现了RandomAccess接口,所以查询速度快,遍历时,第一种方式快于第二种方式。
第一种方式: for (int i = 0; i < list.size(); i++) {
list.get(i); }第二种方式: Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) { iterator.next(); }2、ArrayList内部存储原理是用一个数组来存储元素,这个数组的对象名是elementData。
(1)顺序添加一个元素,速度比较快。例如elementData目前size是6,新增一个元素,值为100,则elementData[6] = 100,当然,这里省略了一些类似数组越界的判断。
(2)插入一个元素,则会比较耗费性能。例如elementData现在有6个元素,需要在第2和第3个元素中间插入一个元素,那么得先将第3到第6个元素都往后移动,然后再进行插入操作。
(3)删除一个元素,也会比较耗费性能。例如elementData现在有6个元素,需要删除第2个元素,那么删除之后第3到第6个元素都需要往前移动。
ArrayList能够存多少元素?
第一次往ArrayList放置元素,elementData数组大小初始化为10,如果下一次元素放置满了,会以1.5倍的容量增长,最大容量为int类型的最大值。
容量增长源码中是这样写的:int newCapacity = oldCapacity + (oldCapacity >> 1);