【问题标题】:StringBuilder capacity method [duplicate]StringBuilder容量方法[重复]
【发布时间】:2018-03-30 08:54:33
【问题描述】:

我一直在为 Java OCA 考试工作,只是注意到 StringBuilder 类有一个容量方法。在我阅读有关容量方法之前,一切都很好。它只是告诉 Java 为 StringBuilder 分配容量。但如果需要,Java 可以增加 StringBuilder 的容量。 我要问的是,当Java需要更多的字符空间时,它可以自己提高StringBuilder的容量,为什么需要容量()方法?

【问题讨论】:

    标签: java stringbuilder capacity


    【解决方案1】:

    通常,Java 会随着字符串的增长分配容量,但这可能需要多次重新分配内存(如果您正在逐段构建大字符串),这会给垃圾收集器带来一些开销。

    如果你已经知道你最终需要的大小,你可以预先分配足够的内存开始,然后你就只有一个分配。

    重新分配的公式是:

    int newCapacity = (value.length + 1) * 2;
    

    因此,通常每次 StringBuilder 空间不足时容量都会增加一倍。默认容量为 16,因此,例如,如果您需要构建一个 1k 的字符串,则需要进行相当多 (6) 次重新分配才能到达那里。

    同样的策略也适用于集合类。

    【讨论】:

      【解决方案2】:

      我要问的是,当 Java 需要更多的字符空间时 可以自己提高StringBuilder的容量,为什么容量() 需要方法吗?

      由于StringBuilder 的大小超过了实际容量,所以实际上是这样做的。

      capacity() 指定为:

      返回当前容量。容量是存储量 可用于新插入的字符,超出该字符的分配 会发生。

      您可以将其视为StringBuilder(以及AbstractStringBuilder 实例通常定义为capacity())的客户更精细地控制当前StringBuilder 实例的实际状态的一种方式。
      例如,它可以用于优化ensureCapacity(int minimumCapacity) 的下一次调用以仅分配所需的内容。

      【讨论】:

        【解决方案3】:

        为了回答你的问题,我想让你看看 hashmap 或 ArrayList 类

        **

        public class ArrayList<E> extends AbstractList<E>
                implements List<E>, RandomAccess, Cloneable, java.io.Serializable
        {
            private static final long serialVersionUID = 8683452581122892189L;
            /**
             * Default initial capacity.
             */
            private static final int DEFAULT_CAPACITY = 10;
        //...
        }
        

        由于 arraylist 是可调整大小的,但如果你没有定义元素的数量,它们在内部会有一些大小,那么它将创建一个大小为 10 的数组,即DEFAULT_CAPACITY = 10; 因此,如果您超过 10,它将调整大小并创建另一个更大大小的数组并放置以前的值,但如果您在之前声明 ArrayList 的大小,它将创建该大小的内存并达到效率。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-27
          • 1970-01-01
          • 2015-12-13
          • 1970-01-01
          • 1970-01-01
          • 2010-12-15
          • 1970-01-01
          相关资源
          最近更新 更多