Java StringBuilder可以容纳多少个字符?

10

在JAVA中,StringBuilder是否有最大容量限制?

StringBuilder url=new StringBuilder();

stmt = connnection.createStatement();
String sql="SOME QUERY";
rs = stmt.executeQuery(sql);
while(rs.next())
{
    String emailId=rs.getString("USER_EMAIL_ID");
     url.append(emailId);  
}

StringBuilder变量'url'是否有最大容量限制,还是可以容纳任何内容?

3个回答

12

4
如果超过最大限制会发生什么? - Narendra Rawat

0
Java 9 引入了 JEP 254: Compact Strings。这使得字符串的存储更加节省空间,通过将字符存储在字节数组中实现。如果所有字符都是 Latin 1,则每个字符使用一个字节,否则每个字符使用两个字节。
因此,答案是:如果启用了紧凑字符串(默认情况下),并且您的 StringBuilder 只包含 Latin 1 字符,则最大大小为 Integer.MAX_VALUE*,否则为 Integer.MAX_VALUE / 2*

* 或者稍微少一些,参见"Java数组有最大大小吗?"


0

如果您按照此链接进行操作,可能会更清楚Oracle Docs字符串生成器缓冲区容量

现在您想声明任何StringBuilder类的容量,那么为此定义了一个构造函数StringBuilder(int initCapacity)

StringBuilder(int initCapacity):- 使用指定的初始容量创建一个空字符串生成器。

由于参数为int ,所以 StringBuilder 类的最大容量将达到 2147483647 。

关于 StringBuilder 类中这个上下文的容量有各种方法,这些方法也考虑类型为 int 的参数。

void setLength(int newLength):- 设置字符序列的长度。 如果newLength小于length(),则截断字符序列中的最后一个字符。 如果newLength大于length(),则在字符序列的末尾添加null字符。

void ensureCapacity(int minCapacity):- 确保容量至少等于指定的最小值。

这些方法也接受int类型的参数。因此,使用这些方法或构造函数,您将能够生成一个最大容量为2147483647的对象。


5
你展示的所有方法都和“最大容量”没有关系,这才是问题所在。你提供的链接也没有提到最大容量。至于你最后一句话,仅仅因为参数是一个 int 类型,并不意味着如果你给出了最大可能的整数值就不会出现错误,而且 new StringBuilder(Integer.MAX_VALUE) 将会得到 OutOfMemoryError: Requested array size exceeds VM limit 错误,无论你为虚拟机分配多少内存。简而言之,你的回答与问题无关,也不准确。 - Andreas
@Andreas 是的,你说得对。如果没有足够的内存可用,那么它会引发一个 OutOfMemory JVM 错误。我没有提到这个错误。谢谢。 - Vikrant Kashyap
即使有足够的内存可用,也不意味着new char[Integer.MAX_VALUE]会起作用。数组的最大大小可能受其他约束限制,这些限制取决于平台。 - Andreas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接