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

createh53个月前 (02-01)技术教程31

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基础知识,诸佬们都还记得嘛(学习,复习,面试均可)

方法重载和方法重写的区别方法重写重写体现在继承关系上。 在Java中,子类继承父类,子类就会具备父类所以的特征,以及父类的方法和变量比如动物类有“叫”的方法,小狗小猫分别继承了动物类,重写方法时就可以...

Java:Java中的多重继承问题(java中实现多重继承的方式)

  继承是面向对象编程 (OOP) 语言(如 Java)的主要功能之一。它是一种以增强软件设计中类重用能力的方式组织类的基本技术。多重继承是众多继承类型中的一种,是继承机制的一个重要原则。本文探讨了一...

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

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

C++_类和对象_C++继承_继承中子类的同名成员处理

然后我们再来看,如果继承的过程中,子类中,也有一个和父类中同名的,变量,或者函数怎么办??.我们先去写个Base类,然后base类中去声明一个m_A = 100;这个变量.在构造方法中赋值100;?然...

php中接口、抽象类以及接口和抽象类区别详解

在php中接口抽象类、Final、Static几个我们用到的相当的简单特别是大型网站架构时都会有用到了,今天我们来看一篇关于php中抽象类、Final、Static的例子。1. 接口(1)对接口的使用...

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

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