写点什么

Collections 之 Arraylist 源码解读 (四)

作者:知识浅谈
  • 2022 年 10 月 04 日
    吉林
  • 本文字数:1540 字

    阅读完需:约 5 分钟


🍁 作者:知识浅谈,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 源码中方法的部分解读,希望有所帮助。

发布于: 刚刚阅读数: 3
用户头像

知识浅谈

关注

公众号:知识浅谈 2022.06.22 加入

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

评论

发布
暂无评论
Collections之Arraylist源码解读(四)_ArrayList_知识浅谈_InfoQ写作社区