java 扩容

作者: spraysss | 来源:发表于2018-11-22 16:55 被阅读0次
private void ensureCapacity(int minCapacity) {
        // overflow-conscious code
        if (minCapacity - buf.length > 0)
            grow(minCapacity);
    }

    /**
     * The maximum size of array to allocate.
     * Some VMs reserve some header words in an array.
     * Attempts to allocate larger arrays may result in
     * OutOfMemoryError: Requested array size exceeds VM limit
     */
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

    /**
     * Increases the capacity to ensure that it can hold at least the
     * number of elements specified by the minimum capacity argument.
     *
     * @param minCapacity the desired minimum capacity
     */
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = buf.length;
        int newCapacity = oldCapacity << 1;
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
     
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        buf = Arrays.copyOf(buf, newCapacity);
    }
    private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }
  • 扩容操作理想情况是将容积增加为原来的2倍

  • newCapacity=Math.max(oldCapacity*2,minCapacity) 确保扩容后的数组大于等于minCapacity,扩容的意义就是增大容量嘛

  • newCapacity大于MAX_ARRAY_SIZE,调用hugeCapacity, 这里对newCapacity根据minCapacity做一个微调,如果minCapacity>MAX_ARRAY_SIZE,那么newCapacity=Integer.MAX_VALUE,否则newCapacity=MAX_ARRAY_SIZE
    这么做的理由是因为不同的JVM实现上可能运行分配的最大字节数组稍微小于Integer.MAX_VALUE,但是MAX_ARRAY_SIZE这个值对于所有的JVM来说都是ok的,所以尽量让数组长度不要达到Integer.MAX_VALUE,除非必须要这么做

相关文章

  • Java 高并发之扩容思路

    高并发处理扩容 扩容 什么是扩容, 什么时候要扩容. 了解Java 内存结构的伙伴应该都知道 , 每个线程都有自己...

  • Java高并发-扩容

    扩容种类 java软件第三方插件进行扩展 如何进行有效的扩容呢?扩容的依据是什么?

  • 2020-04-03 Java HashMap的实现原理的文章

    HashMap的扩容机制---resize() HashMap底层实现原理 扩容机制 Java中HashMap的实现原理

  • java 扩容

    扩容操作理想情况是将容积增加为原来的2倍 newCapacity=Math.max(oldCapacity*2,m...

  • ArrayList 扩容 Android Java 真的不一

    以前学java基础的时候 看过ArrayList的扩容机制 实现原理是下面这样 当时做的笔记ArrayList扩容...

  • hashmap扩容

    面试官:”用HashMap存1w条数据,构造时传10000会触发扩容吗? Java 集合的扩容 HashMap 算...

  • 近期学习安排

    一、Java基础篇 1.HashMap底层数据结构,扩容机制 2.ArrayList 底层数据结构,扩容机制 3....

  • HashMap 的扩容机制

    每个 Java 程序员都得了解 HashMap 的扩容机制美团一面:说说 HashMap 的扩容机制吧看完这篇,如...

  • Java ArrayList知识点整理

    Java中的ArrayList内部采用数组实现,其扩容方式可以认为是每次扩容原长度的1/2。在向一个ArrayLi...

  • HashMap知识

    HashMap的扩容机制---resize() - 割肉机 - 博客园 Java源码分析:HashMap 1.8 ...

网友评论

    本文标题:java 扩容

    本文链接:https://www.haomeiwen.com/subject/wxnlqqtx.html