Collections之Arraylist源码解读(四)

举报
知识浅谈 发表于 2022/10/03 09:17:50 2022/10/03
【摘要】 Collections之Arraylist源码解读(四)

在这里插入图片描述

🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家
📌 擅长领域:全栈工程师、爬虫、ACM算法
💒 公众号:知识浅谈

Collections之Arraylist源码解读(四)总结

正菜来了⛳⛳⛳

🎈Arraylist中相关方法

🍮ensureCapacity(int minCapacity)

这个函数的主要含义是确保elementData数组中最少有这个数量的元素,如果elementData没有达到这个最小的容量的数量,就对elmentData 进行扩容。

public void ensureCapacity(int minCapacity) {
   int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
       // any size if not default element table
       ? 0
       // larger than default for default empty table. It's already
       // supposed to be at default size.
       : DEFAULT_CAPACITY;

   if (minCapacity > minExpand) {
       ensureExplicitCapacity(minCapacity);
   }
}

由以上方法可以看到调用ensureExplicitCapacity这个函数,我们接着探索这个函数。

🍮ensureExplicitCapacity(int minCapacity)

从下边的这个函数中可以就看出来当指定的minCapacity大于elementData中现在容量的大小的时候,会调用grow函数进行扩容,使elementData 中的容量扩容到minCapacity的大小。

 private void ensureExplicitCapacity(int minCapacity) {
     modCount++;

     // overflow-conscious code
     if (minCapacity - elementData.length > 0)
         grow(minCapacity);
 }

上边的函数中提到了grow这个函数,我们接着往下走。

🍮grow(int minCapacity)

grow这个函数的作用就是把elementData数组的大小扩容为minCapacity的大小。

    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);
    }

上边调用到了hugeCapacity(minCapacity)这个就是判断这个minCapacity是不是大于数组最大的值MAX_ARRAY_SIZE,接着往下走。

🍮hugeCapacity(int minCapacity)

这个函数的含义就是如果minCapacity 大于最大的数组的大小,就返回Integer的最大值,否则就返回MAX_ARRAY_SIZE。

private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // overflow
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
        Integer.MAX_VALUE :
        MAX_ARRAY_SIZE;
}

🍮size()

返回当前elementData数组中包含的元素的个数。

public int size() {
  return size;
}

🍮indexOf(Object o)

这个函数的意思就是查看Object对象在elementData数组中的位置,如果不存在就返回,主要是用于函数Contains()函数中查看是否包含对象的时候调用这个IndexOf函数,函数里边也是通过遍历来实现的判断elementData中是否含有某个元素。

    public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

🍚总结

以上是关于今天对AraayList源码中方法的部分解读,希望有所帮助,Wtitten By 知识浅谈

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。