Java8 ArrayList源码分析

java8源码
ArrayList 总的来说就是一个动态数组,扩容时会变1.5倍容量

默认构造

一个空数组的arraylist

分析几个重要的方法

add(E)方法


每次调用此方法,会先检查是否需要扩容,,
ensureCapacityInternal(size + 1) ,,,默认 1.5倍扩容  int newCapacity = oldCapacity + (oldCapacity >> 1);
此时会修改modCount,,modCount用来检查并发修改异常,,,发现modCount出现变化就会抛出 throw new ConcurrentModificationException();

remove(int index) 方法


首先会检测索引范围 rangeCheck(index) 超过了就抛出 IndexOutOfBoundsException
修改 modCount  
索引旧的值 以便返回
数组删除索引之后的全部往前挪,System.arraycopy(elementData,index + 1, elementData, index, numRemoved)
数组最后一位置空,elementData[--size] = null; 让gc回收掉这个对象

get(int index) 方法


首先会检索范围 rangeCheck(index) 
返回索引对象 elementData[index]

set(int index,E element) 方法


范围检查
替换值 elementData[index] = element;

clear() 方法


修改modCount
数组所有位置 挨个设置成null,,,let gc work
size 设置成0

addAll(Collection<? extend E> c) 方法


将c容器变成数组 Object[] a = c.toArray(); toArray方法一般会将容器内容重新拷贝到一个新的数组里面去
检查是否需要扩容 oldSize + a.length
将a数组复制到ArrayList的数组
重新设置size += a.length;

iterator() 方法

,,return new Itr(); Itr是ArrayList的一个内部类。数据还是引用外部类ArrayList的数据,,并没有重新Copy一个
Itr 实现了Iterator 接口
hasNext() {
return cursor != size;
}
E next() {
检查并发修改
获取ArrayList.this.elementData;
返回获取的elementData[当前游标位置]
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值