setLength()方法是StringBuilder以及它在内部的工作方式

时间:2017-02-06 19:41:55

标签: java

据我所知,StringBuilder对象包含一个字符数组。当我们构造一个StringBuilder对象时,我们指定一个容量(或直接提供一个字符串)。 我假设这意味着还在内部创建了指定容量长度(或默认容量)的数组。

如果我然后追加或插入一个长度比容量短的字符串,该数组的(剩余?)空插槽中有什么?是空(\ u0000)吗?

如果它为null,当newLength参数大于实际字符串的长度时,setLength(newLength)会发生什么事也会让我感到困惑。在java API文档中,声明“如果newLength参数大于或等于当前长度,则足够的空字符(\ u0000)将附加到字符串构建器,以便”length“成为newLength参数。”我的问题是,那里还没有空字符吗?

赞赏任何澄清(:

再次编辑:标题中的*表示

6 个答案:

答案 0 :(得分:0)

  

我的问题是,那里是否有空字符?

不,当你从StringBuilder收缩或删除字符时,它不必填充不再与nul字符一起使用的字符。

答案 1 :(得分:0)

根据SpringBuilder的javadoc:

If the newLength argument is greater than or equal to the current length, sufficient null characters ('\u0000') are appended so that length becomes the newLength argument.

事实上,当StringBuilder存储char个字符数组时,此数组的长度为newLength

如果您当前的StringBuilder长度为10,并且您将此长度设置为12,那么缺少的空格将由null填充(对于char类型,这是\u0000 )。 所以最后两个字符将为空。

StringBuilder sb = new StringBuilder();
sb.append('x');
System.out.println(sb.length()); // prints 1
sb.setLength(2);
System.out.println(sb.length()); // prints 2

答案 2 :(得分:0)

假设StringBuilder有一个长度为' n'和' k'为了新的长度。
我的理解如下:

  • 如果k> n,则会附加空值(' \ u0000')以适应长度增加
  • 如果k == n,则不会发生任何事情。 JavaDoc表示"大于或等于当前长度",但如果当前长度与新长度相同,我不确定会发生什么。
  • 如果k < n,数组将缩短为长度k,不会添加空字符。

答案 3 :(得分:0)

StringBuilder添加了空字符。 setLength执行以下操作:

首先,使用Arrays副本。

Arrays.copyOf(value, newLength)

最后,在最后一个字符上设置\ 0:

   if (count < newLength) {
                for (; count < newLength; count++)
                    value[count] = '\0';

答案 4 :(得分:0)

如果你查看字符串生成器的setLength方法的代码,它会执行以下操作

  1. 确保新长度为正,否则抛出 的StringIndexOutOfBoundsException

  2. 确保满足最小容量,例如,如果最小容量 是10,你将长度改为20,创建一个新的数组 实际数组的内容被复制到这个新数组,然后它 替换字符串生成器的旧数组。 如果长度减少,则不会创建新阵列

  3. 检查新数组的长度是否大于之前的长度 数组,如果是,则填充该数组的额外索引 空字符

  4. 将新数组的长度设置为当前长度(如果新长度小于前一个长度,则会丢弃额外字符,简而言之,数组不会被更改或替换为长度数组的标记更改为新的长度)

答案 5 :(得分:0)

  • 如果newLength参数大于或等于当前长度,则会附加足够的空字符('\ u0000'),以便length成为newLength参数。
  • 执行这些命令集以了解setLength()方法

    的行为
      StringBuilder str = new StringBuilder("tutorials");
      System.out.println("string = " + str);  
    
      // length of StringBuilder
      System.out.println("length = " + str.length());
    
      // set the length of StringBuilder to 5
      str.setLength(5);
    
      // print new StringBuilder value after changing length
      System.out.println("After set, string = " + str);
    
      // length of StringBuilder after changing length
      System.out.println("length = " + str.length());
    

<强>输出:

string = tutorials
length = 9
After set, string = tutor
length = 5