Why would the StringBuffer
have a limit on its size?
I went through some of the links : http://www.coderanch.com/t/540346/java/java/maximum-size-hold-String-buffer.
Is that because of the count member variable, which is an int?
Suppose that we have 2^31-1 chars in StringBuffer
and that we append some more chars to that StringBuffer
. Count member variable would be incremented by the number of chars appended and if Count variable is already at its max (2^31-1), it would revert back to some negative value.
Why would it throw an error?
because stringbuffer internally uses an array and the maximum number of elements an array can accommodate is 2^31-1 if you increment after reaching this it will go to negative and throws the error
StringBuffer
uses a char[]
.
In Java an array can be indexed only via an integer which means the highest value the index of the array can be is Integer.MAX_VALUE
- 1 (i.e. 2^31 - 1). Which means that the size of an array in Java can not be larger than Integer.MAX_VALUE
Answer is different based on System architecture.
This old machine when I posted answer on 2012
Max Length of characters = 37748734
Java Version : 1.6.0_35
OS : Windows 7
System Architecture : 32bits (x86)
RAM : 2 GB
Processor : Pentium Dual Core E5800 3.20GHz
On 2016
Max Length of characters = 301989886
Java Version : 1.8
OS : Ubuntu 14 LTE and Windows 7
System Architecture : 64bits (x86_64)
RAM : 8 GB
Processor : Intel(R) Core(TM) i3-4130 CPU @ 3.40GHz
Run This program your self
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");
Output
Max length on your system is 37748734
if you are getting anywhere near 2^31 characters in your buffer you are doing it wrong and you would have run out of memory long ago.
来源:https://stackoverflow.com/questions/11908665/max-size-for-stringbuffer