ArrayList源码分析----需要记住的

在这里插入图片描述
Collection老祖先,是一个接口,List和Set是众多子接口中最常用的两个。
List子接口(有索引,存的是地址,如数组对象存的是数组的首地址,所以数据可以重复)
ArrayList(使用比较多,因为一般都是存数据)、LinkedList、Vector实现类

ArrayList 是一个用数组实现的集合,支持随机访问,元素有序且可以重复。
对于 ArrayList 集合添加元素,我们总结一下:
1.当通过ArrayList()构造一个空集合,初始长度是为0的,第1次添加元素,会创建一个长度为10的数组,并将该元素赋值到数组的第一个位置
2.第2次添加元素,集合不为空,而且由于集合的长度size+1是小于数组的长度10,所以直接添加元素到数组的第二个位置,不用扩容。

//调用 Arrays.copyOf 将原数组拷贝到一个大小为newCapacity的新数组(注意是拷贝引用)
	elementData[size++] = e;
    elementData = Arrays.copyOf(elementData, newCapacity);

copyOf(elementData, newCapacity),把elementData复制到新的长度为newCapacity的数组里面
3.第11次添加元素,此时size+1=11,而数组长度是10,这时候创建一个长度为10+10*0.5 = 15 的数组(扩容1.5倍),然后将原数组元素引用拷贝到新数组。并将第11次添加的元素复制到新数组下标为10的位置。

//在grow方法里面定义了新的newCapacity的大小,这里面有右移1位的运算(效率高)
int newCapacity = oldCapacity + (oldCapacity >> 1);//新数组的长度等于原数组长度的1.5倍

4.第Integer.MAX_VALUE-8 = 2147483639,然后2147483639%1.5=1431655759(这个数是要进行扩容) 次添加元素,为了防止溢出,此时会直接创建一个 1431655759+1 大小的数组,这样一直,每次添加一个元素,都只扩大一个范围。原因是不能超过最大值,2147483639是第n次操作的结果,1431655759是n-1
5.第 Integer.MAX_VALUE - 7 次添加元素时,创建一个大小为 Integer.MAX_VALUE 的数组,在进行元素添加。
6.第Interger.MAX_VALUE+1次添加元素时,抛出OutOfMemoryError异常。
能想集合添加null,因为数组可以有null值存在。

//可以直接定义null
Object[] obj = {null,1};
//可以在list中添加null
ArrayList list = new ArrayList();
list.add(null);
list.add(1);
System.out.println(list.size());//最后的长度都是2

删除元素的时候用到了arraycopy方法
arrayCopy( arr1, 2, arr2, 5, 10);
将arr1数组里从索引为2的元素开始, 复制到数组arr2里的索引为5的位置, 复制的元素个数为10个. 把arr2换成arr1
Int[] arr1 ={1,2,3,4,5};
arrayCopy(arr1, 3, arr1, 2, 2);
将arr1从数字4开始 拷贝到arr1的数字3的位置, 拷贝2个数, 也就是说将4和5 拷贝到数字3的位置,相当于删除数字3.

ArrayList在执行插入元素时可能要扩容,在删除元素时并不会减小数组的容量(如希望相应的缩小数组容量,可以调用ArrayList的trimToSize()),在查找元素时要遍历数组,对于非null的元素采取equals的方式寻找

显示元素
迭代器的变种 forEach
这种语法可以看成是 JDK 的一种语法糖,通过反编译 class 文件,我们可以看到生成的 java 文件,其具体实现还是通过调用 Iterator 迭代器进行遍历的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值