JAVA学习笔记之十二---ArrayList集合详解


1.ArrayList集合的基本概念

ArrayList集合的底层实现是基于数组实现的

由于ArrayList集合实现了List接口所以集合中的元素是允许被重复的

List arrayList = new ArrayList();//多态

2.ArrayList集合常用的api方法

add()方法:向集合中存入元素

arrayList.add("hello");

返回值为boolean类型

size()方法:获取集合中存入的元素的个数

arrayList.size();

返回值为int

get(index)方法:获取某个index下标的元素

arrayList.get(0);

返回值为泛型

set(index,newMessage)方法:修改某个index的元素信息

arrayList.set(1,newMessage);

返回值为泛型,返回修改之前的元素

remove(index)方法:删除某个index下标的元素

注意当我们删除该index的元素后,之后的元素会向前移动

arrayList.remove(1);

返回值为泛型,返回删除的元素

3.ArrayList集合是否保证了数据的有序性?

保证了

plus:如何去查看源码?怎么样查看更加简洁明了?

1.先看构造函数

2.看方法的实现

4.ArrayList集合的底层实现原理。。。。。。。。。。。。。。。。。。。。。。。。。。只能说极其重要

ArrayList集合底层基于数组实现,通过index下标查询效率比较高(时间复杂度为O(1)),增删效率是比较低的(底层基于数组实现扩容,删除;时间复杂度为O(n))

1.ArrayList集合的无参构造函数就是创建一个空的Object数组

 

 在没有调用add方法之前,集合是空的,ArrayList集合使用了懒加载的形式;

2.add方法的底层实现

先判断是否需要扩容,如果需要就进行扩容操作

然后通过index进行赋值

我们在这儿直接提出疑问?扩容是怎样实现的?

一个例子:List arrayLIst = new ArrayList();

arrayList.add("a");

由于懒加载的形式,此处直接扩容

我直接先进入add函数,modCount++之后直接进入重载的add函数  modCount= 0;

 我直接进入重载之后的add函数,传递三个参数,分别是泛型e ,自定义的数组(为null) ,一个平平无奇的size = 0;size()函数直接return size

先判断这个数组是否满了,就是size已经一直自增到了与该数组同等长度(这里是0,没有什么问题)

然后我们将执行grow数组增长函数

 直接进入grow方法

 进入下个grow方法,传递size+1的值作为minCapacity

将我们的elementData扩容,可以将copyOf(数组,int)理解为,将该数组扩容int大小,直接看newCapacity函数

 直接进入newCapacity函数

直接用oldCapacity记录下当前数组的长度,定义一个新的长度=原来的长度+原来的长度/2(二进制右移一位 )

按理说我直接返回该长度就行,,,,,但是又一个问题,如果我们原来的长度是0的话,该新的长度还是0

所以直接加一个判断,如果集合为空,直接取10和minCapacity中的最大值max()函数 

再有就是限制判断,不加赘述

 3.get方法的底层实现

get()方法只能根据index查询,不可以根据元素值查询

由于底层是数组实现,我们直接返回该数组的index下标所对应的元素即可

 checkIndex函数直接对index进行判断是否越界,size表示元素个数,对应着集合的长度

 4.remove方法的底层实现

remove(index);

首先查看我们index是否合法

然后直接定义一个不可改变的对象数组接受原来的数组

直接用一个对象接受index在集合中所对应的元素

直接调用fastRemove函数

 进入到fastRemove函数

 5.Vector集合是ArrayList集合强有力的竞争对手,它们有什么区别?

//相同点:
//1.默认第一次初始化容量都是10
//2.底层都是基于数组实现
//3.List接口下的子类
//不同点:
//1.ArrayList是线程不安全的 Vector是线程安全的
//2.ArrayList每次扩容是原来容量的1.5
//3.Vector每次扩容是原来的2倍 ,并且可以设置数组的初始化容量
//4.ArrayList集合通过懒加载的形式 初始化容量 而Vector集合直接通过构造函数 初始化数组容量为10

6.ArrayList集合必问问题总结

ArrayList集合底层基于数组实现

add方法实现? 首先判断集合容量是否装的下; 如果装不下,就进行扩容,首先扩到10,然后每次以1.5倍扩容

get方法实现?根据index查询效率比较高

remove方法实现?相当于将index之后的元素都向前移动一位