StringBuilder 构造函数实现容易出现异常

StringBuilder constructor implementation vulnerable to exception

使用现有 String 或 CharSequence 初始化时 StringBuilder 的初始容量是 StringBuilder 构造函数中代码中原始 text + 16 的长度:

super(str.length() + 16);

我的查询如果原始长度接近Integer.MAX_VALUE怎么办?

它会抛出 NegativeArraySizeException 还是会更改为 long 以正确执行?

它会抛出一个 NegativeArraySizeException 因为整数会回绕。

实际上,它等同于:

int len = Integer.MAX_VALUE;

// here we are trying to create an array of size -2147483633
char [] value = new char[len + 16];

它会抛出 NegativeArraySizeException

此处的 NegativeArraySizeException 应为:

  1. 根据 String 实现,String 在内部使用 char[] 来保存单个字符。所以最大字符串长度实际上取决于 char[] 大小。
  2. Java 在内部使用 int (not Integer) 来索引数组的各个位置,因此 String 的最大长度可以是 Integer.MAX_VALUE 以及任何大于它的东西应该抛出异常,因为 JVM 将无法索引超过最大 int 值的各个位置。

由于这个约束,任何超出最大允许限制的数组都会抛出 NegativeArraySizeException,在这种情况下是最大 int 值。