JAVA集合系列分享-ArrayList(java集合超详解)

createh55个月前 (02-01)技术教程46

Collection学习分享:集合在我们日常开发中是经常用到的,用来存储一些对象,借助jdk提供的集合我们可以很方便的进行一些遍历,查找,删除,排序等操作(jdk版本为1.8)。

首先简单学习下Arraylist,借助idea等工具查看它的继承关系图(idea中的快捷键为Ctrl+shift+Alt+u),可以看到Arraylist实现了List接口,List又继承自Collection接口(见图1),

我们重点关注下Arraylist的创建过程,元素的添加、删除等操作。

1.ArrayList的创建:ArraylIst常用的两个构造器见图2,一个是无参构造器,图3绿框可以看到无参构造器中将默认的长度为0的Object[]数组赋值给elementData,后面add操作时可以看到ArrayList底层是Object[]数组来存储元素。另一个是有参构造器,传入一个初始容量,initialCapacity>0时直接创建长度为initialCapacity的数组,initialCapacity=0时还是将长度为0的数组(见图3红色框)赋值给elementData。(java调用子类构造器时会隐式调用父类无参构造器,由于ArrayList的父类无参构造没做什么事也就不讨论了)

2. add(E)操作:添加操作顾名思义就是将元素add到集合里,见图4可以看到分为两步走,第一步就是我们在创建集合时已经知道底层是用Object[]数组来存储元素的,而我们知道java中数组是不能自动扩容的,所以在add元素时要确保数组不越界,在ensureCapacityInternal()方法中去确保 Object[]数组有足够的长度,如果长度不够则会进行扩容操作。第二步就是将需要添加的元素存储到elementData数组的坐标为size处,如elementData数组长度为5,已经添加了2个元素则size为2,此时添加的元素就在下标为size+1=3处。还有add(int,E)将元素添加到指定位置。

注意:从图5可以看到当用无参构造器和有参但参数为0时,第一次add元素时会进行扩容操作,因为此时的elementData就是默认的所以进行Math.max()运算,此时的minCapacity=1,DEFAULT_CAPACITY=10见图6,计算结果为10,所以创建的Object[]数组长度为10。(面试有被问到初始化容量为多少,感觉这样回答更严谨些(jdk版本为1.8))


3. remove(E)操作:从图7可以看到在进行remove操作时,先判断是否为null,然后循环数组找出需要移除的元素,可以看到index从0开始且移除后进行return,所以remove只能按顺序移除第一个相同的元素。找到需要移除元素的index进行fastRemove(index)见图8,移除操作其实是用后面的元素覆盖掉要被移除的元素,所以numMoved为被移除元素后面剩余元素数量,然后用arrayCopy完成覆盖,因为arrayCopy操作最后的元素会多余所以elementData[--size]将末尾多余的元素置为 null。

4. get(index): get操作比较简单,先判断index是否越界见图10,然后从Object[]数组中根据index取值。

总结:1.ArrayList基于数组实现的,无容量限制;

2. ArrayList扩容时会创建新的数组然后将老数组元素copy过去;

3. 从图中代码可以看到Arraylist并不是线程安全的。

相关文章

你知道子类引用为什么不能指向父类对象吗?反汇编一起看看

在java、C++等面向对象的语言中,实现多态的方式就是使用父类引用指向子类对象,所以父类引用指向子类对象是没有任何问题的,但是,大家有没有想过,子类引用可以指向父类对象吗?答案是不可以!但是为什么呢...

「万字干货 | 图文」史上姨母级Java继承详解

首发公众号:bigsai 头条号:程序员bigsai 同时收录在回车课堂课程导学在Java课堂中,所有老师不得不提到面向对象(Object Oriented),而在谈到面向对象的时候,又不得不提到面向...

交互思考:“重要的小角色”——面包屑导航

导语:我们在设计网站的过程中,一开始的设计便会遇到导航设计,比如面包屑导航;然而对许多设计师来说,面包屑导航往往都是直接照搬,也很少会去注意甚至忽视它的存在。在产品设计多样化的今天,什么样的网站适合用...

JAVA学习基础之JAVA类集(java类中的类)

第十三章、JAVA类集在JAVA中必须掌握的知识点,会开发的:1、面向对象; 2、JAVA的类集; 3、JAVAIO; 4、JDBC;13-1、认识类集、Collection接口类集实际上就是一个动态...

Java中一个类可以继承多个类吗?揭秘多重继承的秘密!

#所见所得,都很科学#大家好,我是你们的小米!今天,我们来聊聊Java中一个备受争议的话题——"一个类可以继承多个类吗?"这是一个让许多Java初学者困惑的问题,也是一个常常被问及的热门话题。那么,到...