ArrayList 源码学习

ps:arrayList相关的源码分析,网上有写很多了,这里就不献丑了。本文主要写我个人觉得有意义的一些点。

1. Sublist 巨坑

  1. arrayList的subList是可以修改的
  2. subList 映射到原ArrayList,也就是说,对subList 的修改也会作用到原 ArrayList上

2. 构造函数的懒加载

看源码时,会发现定义了两个空数组,而且都设置了final,这是为啥,一个不就够用了嘛?
DEFAULT_CAPACITY:初始化容量为0的时候,直接赋值为这个数组的值
DEFAULTCAPACITY_EMPTY_ELEMENTDATA:懒加载,初始化容量不为0的时候,赋值为这个数组,在第一次添加元素的时候,才初始化一个数组。

3. 扩容策略

初始默认容量10,1.5倍扩容之后,如果还不满足要求,则直接设置为要求的容量
如果扩容容量超过 MAX_ARRAY_LENGTH (=Integer.Maxvalue - 8),那么扩容为 Integer.Maxvalue

public static final int MAX_ARRAY_LENGTH = Integer.MAX_VALUE - 8;
private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    elementData = Arrays.copyOf(elementData, newCapacity);
}

4. Fail-Fast 机制

  1. modCount 记录结构性改变的次数
  2. 在迭代过程中,如果modCount的值和一开始不同,则直接失败

5. 删除元素

在删除数组元素时,要被删除的数组位置值设置为null,使得被删除元素可以被GC回收

6. elementData 为什么不设置成私有?

总结:简化内部类的访问
内部类虽然可以直接访问外部类的成员,但是当访问的成员是私有的时,是有些不同的。
虽然我们在编码时,外部类和内部类是写在同一个源码文件中的,但是要知道的是在编译之后,内部类和外部类会被编译为不同的 class 文件,那么此时如何维持外部类的私有属性在内部类中的可见性?
java 使用了 synthetic method 来解决这个问题。
当内部类中直接使用了外部类的某个私有成员时,会在外部类中自动生成一个静态方法,方法权限是包可见的,方法参数是外部类的实例,方法实现就是返回了传入实例的该私有变量。
这样,在内部类中也可以通过使用此静态方法来访问外部类的私有成员了,当然,前提是内部类要持有外部类对象的引用。
同理,外部类中再创建了内部类的对象之后,也是能够直接使用内部类的私有成员和方法的,也是用过 synthetic method 来实现的。
这就是 elementData 直接声明为包可见的原因,简化了通过 synthetic method 来访问这一步骤。

7. elementData 为什么设置 transient

因为 elementData数组有预先申请的空间,并不一定是全部存满了的。
因此,arrayList自己实现了序列化、反序列方法,来保证只序列化实际存储的元素

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值