2012-08-10 6 views
5

Warum sollte die StringBuffer eine Grenze für ihre Größe haben?Max Größe für StringBuffer

Ich ging durch einige der Links: http://www.coderanch.com/t/540346/java/java/maximum-size-hold-String-buffer.

Ist das wegen der Count-Member-Variable, die ein Int ist?

Angenommen, wir haben 2^31-1 Zeichen in StringBuffer und wir fügen diesem Zeichen weitere Zeichen hinzu StringBuffer. Die Elementvariable count wird um die Anzahl der angehängten Zeichen erhöht, und wenn die Variable Count bereits ihren Maximalwert erreicht (2^31-1), wird sie auf einen negativen Wert zurückgesetzt.

Warum würde es einen Fehler werfen?

+0

Sie einen String nicht verwenden, wenn Sie einen Stringbuilder verwenden können (es hat die gleiche Grenze though) –

+1

A 2^32-1 StringBuilder würde 4 GB benötigen. Möchtest du eine so lange Zeichenfolge erstellen? –

Antwort

13

weil String intern ein Array verwendet und die maximale Anzahl der Elemente ein Array aufnehmen kann, ist 2^31-1, wenn Sie erhöhen danach erreicht es zu negativen gehen und führt den Fehler

+0

Warum gibt es ein maximales Limit für die Anzahl der Elemente in einem Array, ist das in den Java-Spezifikationen erwähnt? – vjk

+0

@vjk Zufällige Array-Zugriff verwendet eine Ganzzahl für die Position. zB: meinArray [8]. Wie würden Sie auf Elemente an der Position MAX_INT + 1 zugreifen? –

+0

versuchen Sie einfach, ein Array von Größe einige lange Wert erstellen –

0

, wenn Sie immer überall in der Nähe von 2^31 Zeichen in deinem Puffer machst du es falsch und du hättest vor langer Zeit keinen Speicher mehr.

+4

Ich stimme Ihnen zu dem Punkt, dass er es falsch macht. Es gibt jedoch keinen Grund zu denken, dass er nicht mehr in der Lage sein wird. –

4

StringBuffer verwendet eine char[].
In Java kann ein Array nur über eine Ganzzahl indiziert werden, was bedeutet, dass der höchste Wert, den der Index des Arrays sein kann, Integer.MAX_VALUE-1 (d. H. 2^31-1) ist. Das bedeutet, dass die Größe eines Arrays in Java nicht größer sein kann als Integer.MAX_VALUE

3

Antwort ist unterschiedlich basierend auf Systemarchitektur.

Diese alte Maschine, wenn ich gepostet Antwort auf 2012

Max Länge von Zeichen =

Java Version: 1.6.0_35

OS: Windows 7

Systemarchitektur: 32 Bit (x86)

RAM: 2 GB

Prozessor: Pentium Dual Core E5800 3.20GHz

Auf 2016

Max Länge von Zeichen =

Java Version: 1.8

OS: Ubuntu 14 LTE und Windows 7

System Architecture: 64 Bit (x86_64)

RAM: 8 GB

Prozessor: Intel (R) Core (TM) i3-4130 CPU @ 3.40GHz

Run Dieses Programm Ihr Selbst

 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"); 

Ausgabe

Max length on your system is 37748734 
+0

Yup, ich lief das und bekam genau den gleichen Wert -> 37748734. Mein System ist auch ein C2D e7500 und 4 Gigs RAM. Ich laufe 32 Bit Windows. Der Integer MAX VALUE ist 2147483647. – avinashkr

+0

Ich lief auf und bekam eine andere Antwort von mir geschrieben: 301989886, x86_64 Maschine 8 GB Ram, Java 1.8 und 4 GHz Prozessor. Die gleiche Nummer ist auf einem anderen x86_64-System gelandet. –

+0

Was zählt, ist der Impl der StringBuffer-Klasse in Ihrer JVM-Version und -Plattform ... wenn sie ihre Kapazität erweitern muss, kann sie einen Ladefaktor verwenden und möglicherweise Integer.MAX_VALUE (2^31 - 1, wie alle zeigen out) für die maximale Kapazität vor dem Sprengen ... also, wenn Sie diesen Wert nicht bekommen, liegt es daran, dass Ihre Implementierung das Array gerade erweitert, bis es einen Überlauf erkennt ... versucht man Integer.MAX_VALUE vor dem Blowing: http: // grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/AbstractStringBuilder.java#AbstractStringBuilder.expandCapacity%28int%29 – Renato