JAVA学习笔记之十二---ArrayList集合详解
1.ArrayList集合的基本概念
ArrayList集合的底层实现是基于数组实现的
由于ArrayList集合实现了List接口所以集合中的元素是允许被重复的
List
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.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之后的元素都向前移动一位