java源码--ArrayList(重点摘抄)

底层数据结构为数组,
默认的大小为10
一般最大的size为
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

为什么要-8:
Some VMs reserve some header words in an array.

ArrayList的扩容:
1.当所需容量大于目前数组的长度时,默认扩容为原容量的1.5倍.
2.当扩容后容量还是不够时会直接扩容成所需容量.
3.如果扩容后容量大于MAX_ARRAY_SIZE,根据所需容量来计:如果所需容量比MAX_ARRAY_SIZE小就扩容为MAX_ARRAY_SIZE,如果所需容量比MAX_ARRAY_SIZE大,扩容为Integer.MAX_VALUE.

ArrayList的删除:
1.通过下标来移除:
移除中间位置的元素,利用数组的拷贝来实现:
System.arraycopy(elementData, index+1, elementData, index,numMoved);numMoved:要移动的元素个数
移除末尾的元素,直接将末尾元素置为null,利用GC来处理。
2.通过元素移除:
从0开始找到第一个匹配的元素,再通过下标来移除。

ArrayList的清除:
通过遍历将所有元素的值都置为null,利用GC来处理

ArrayList添加集合:
将集合转成数组,容量不够进行扩容,再进行数组拷贝实现

ArrayList的其他方法:
removeAll:移除一个集合,遍历,拿出所有包含的项,再进行数组拷贝,如果经过操作后ArrayList没有改变则返回false,有改变返回true.
retainAll:保留一个集合,与removeAll同理,只需要拿出所有不包含的项再做其他同样的操作.返回也一样
sort:如果没有指定排序的具体实现类,基本使用二分法对数组进行遍历而后通过元素自己的CompareTo方法进行排序.

ArrayList相关笔记:
遍历时修改或删除了其中的值,将抛出oncurrentModificationException,主要原理是由于for循环和foreach都是通过迭代器来实现的,ArrayList而每删除增加一个元素,modCount就会加1,如果遍历时进行了元素的增删,modCount将与遍历前不一致.HashMap中也是类似的处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值