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

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

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教程电子书下载)

第4章 面向对象的程序设计基础如前所述,Java语言是一种纯面向对象的编程语言,面向对象的程序设计是以类为基础的。从本章开始,我们将从类入手,详细介绍面向对象程序设计的基本思想和方法。本章将简要介绍面...

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

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

父类实现了Serializable,子类不需要实现Serializable

相关注意事项 a)序列化时,只对对象的状态进行保存,而不管对象的方法; b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口; c)当一个对象的实例变量引用其他对象...

三石说:java基础 类与对象(java的类和对象怎么理解)

类:类是封装对象的行为和属性的载体,具有相同属行和行为的一类实体。类中包含方法和属性。类中的构造方法:1.构造方法没有返回值2.名称与类名相同,在构造方法中可以为成员变量赋值,也就是初始化成员变量,若...

Java|剖析类内的五类成员:属性、方法、构造器、代码块、内部类

Java的哲学是一切皆类,全部代码都写在类内。Java是纯面向对象的编程语言,类是其基石。Java类有五类成员:class Person{ // ① 属性,或成员变量 String n...

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

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