StringBuffer
为什么会限制其大小?
我浏览了一些链接: http://www.coderanch.com/t/540346/java/java/maximum-size-hold-String-buffer
是因为count成员变量,这是一个int?
假设我们在StringBuffer
中有2 ^ 31-1个字符,并且我们在StringBuffer
附加了一些字符。计数成员变量将增加附加的字符数,如果Count变量已经达到最大值(2 ^ 31-1),它将恢复为某个负值。
为什么会抛出错误?
答案 0 :(得分:13)
因为stringbuffer在内部使用一个数组,并且数组可以容纳的最大元素数是2 ^ 31-1,如果在达到此值后增加它将变为负数并抛出错误
答案 1 :(得分:4)
StringBuffer
使用char[]
在Java中,数组只能通过整数索引,这意味着数组索引的最高值可以是Integer.MAX_VALUE
- 1(即2 ^ 31-1)。这意味着Java中数组的大小不能大于Integer.MAX_VALUE
答案 2 :(得分:3)
根据系统架构,答案有所不同。
当我在2012年发布答案
时,这台旧机器最大字符长度= 37748734
Java版本:1.6.0_35
操作系统:Windows 7
系统架构:32位(x86)
RAM:2 GB
处理器:奔腾双核E5800 3.20GHz
2016年
最大字符长度= 301989886
Java版本:1.8
操作系统:Ubuntu 14 LTE和Windows 7
系统架构:64位(x86_64)
RAM:8 GB
处理器:Intel(R)Core(TM)i3-4130 CPU @ 3.40GHz
自行运行此程序
StringBuffer strbTest = new StringBuffer();
long len = 0;
try {
System.out.println("Wait.... til number not generated.");
while(true) {
strbTest.append("a");
len++;
}
} catch (OutOfMemoryError e) {
System.out.println("Max length on your system is "+len);
System.out.println("Error");
}
System.out.println("End");
输出
Max length on your system is 37748734
答案 3 :(得分:0)
如果你的缓冲区中有2 ^ 31个字符附近的任何地方你做错了,很久以前就会用完你的内存。