JDK源码阅读之ArrayList

一 继承关系

在这里插入图片描述)

二 构造函数

[在这里插入图片描述

  • ArrayList底层使用Object[] 存储 ,无参构造则是创建一个空数组

  • ArrayList(int) :可以指定Object[]的初始大小

  • ArrayList(Collection<? extends E> c) 将源集合copy到新集合

在这里插入图片描述

三 容量扩容

每次添加都会做边界校验,使用私有方法grow返回新集合

  • minCapacity 为当前的容量

  • newCapacity 计算后的新容量

    • 当容器使用默认值也就是空数组时 则容量为10

    • 之后的每次扩容1.5倍

      int newCapacity = oldCapacity + (oldCapacity >> 1);
      
  • Arrays.copyOf()

    • 底层使用System.arraycopy() arraycopy是native本地方法
private Object[] grow(int minCapacity) {
        return elementData = Arrays.copyOf(elementData,
                                           newCapacity(minCapacity));
    }

四 类方法详解

  1. contains 如果此列表包含指定的元素,则返回{@code true}
  • 底层调用indexOf() 判断返回下标

  • 判断是否是同一对象 底层使用Object的equals()方法 判断的是对象的引用地址是否相同

    public int indexOf(Object o) {
            return indexOfRange(o, 0, size);
        }
    
        int indexOfRange(Object o, int start, int end) {
            Object[] es = elementData;
            if (o == null) {
                for (int i = start; i < end; i++) {
                    if (es[i] == null) {
                        return i;
                    }
                }
            } else {
                for (int i = start; i < end; i++) {
                    if (o.equals(es[i])) {
                        return i;
                    }
                }
            }
            return -1;
        }
    
  1. toArray() 返回的不是elementData 它是用Arrays.copy()拷贝出新的数组返回
public Object[] toArray() {
        return Arrays.copyOf(elementData, size);
    }
  1. T[] toArray(T[] a) 将集合中元素copy到a数组中
  • a的长度大于集合的size 则a的其余空间用null填充
  • a的长度小于集合的size 则创建新的数组
  1. remove() 底层会判断要删除的元素是不是最后一个元素 如果是则直接置null 如不是则需要对当前要删除元素之后的元素重排 ,所以ArrayList在删除操作时效率会低
if ((newSize = size - 1) > i)
            System.arraycopy(es, i + 1, es, i, newSize - i);
        es[size = newSize] = null;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值