2012-08-10 11 views
5

Perché il StringBuffer ha un limite alle sue dimensioni?Dimensioni massime per StringBuffer

Ho esaminato alcuni collegamenti: http://www.coderanch.com/t/540346/java/java/maximum-size-hold-String-buffer.

È a causa della variabile membro di conteggio, che è un int?

Supponiamo di disporre di 2^31-1 caratteri in StringBuffer e che aggiungiamo altri caratteri a quello StringBuffer. La variabile membro di conteggio sarebbe incrementata dal numero di caratteri aggiunti e se la variabile Count è già al massimo (2^31-1), ritornerebbe ad un valore negativo.

Perché genera un errore?

+0

Non utilizzare uno StringBuffer quando è possibile utilizzare uno StringBuilder (ha lo stesso limite però) –

+1

A 2^32-1 StringBuilder richiederebbe 4 GB. Ti piace creare una stringa così lunga? –

risposta

13

perché StringBuffer utilizza internamente un array e il numero massimo di elementi di un array può ospitare è di 2^31-1 se si incrementa dopo aver raggiunto questo andrà ai risultati negativi e genera l'errore

+0

perché c'è un limite massimo al numero di elementi in un array, è quello menzionato int le specifiche java? – vjk

+0

@vjk l'accesso casuale all'array utilizza un numero intero per la posizione. vale a dire: myArray [8]. Come accetteresti gli elementi nella posizione MAX_INT + 1? –

+0

prova a creare una serie di dimensioni di valore lungo –

0

se hai trovato da nessuna parte vicino a 2^31 caratteri nel buffer lo stai facendo male e avresti esaurito la memoria molto tempo fa.

+4

Sono d'accordo con te sul fatto che lui stia sbagliando. Tuttavia non c'è motivo di pensare che sarà fuori di memoria. –

4

StringBuffer utilizza uno char[].
In Java un array può essere indicizzato solo tramite un numero intero che significa che il valore più alto che l'indice dell'array può essere è Integer.MAX_VALUE-1 (ovvero 2^31 - 1). Ciò significa che la dimensione di un array in Java non può essere maggiore di Integer.MAX_VALUE

3

La risposta è diversa in base all'architettura di sistema.

Questa vecchia macchina quando ho postato risposta su 2012

Lunghezza massima dei caratteri =

Java Version: 1.6.0_35

OS: Windows 7

Architettura di sistema

: 32bits (x86)

RAM: 2 GB

Processore: Pentium Dual Core E5800 3.20GHz

Su 2016

Lunghezza massima dei caratteri =

Java Version: 1.8

OS: Ubuntu 14 LTE e Windows 7

System Architecture: 64 bit (x86_64)

RAM: 8 GB

Processore: Intel (R) core (TM) i3-4130 CPU @ 3.40GHz

eseguire questo programma la vostra auto

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

uscita

Max length on your system is 37748734 
+0

Sì, l'ho eseguito e ho ottenuto lo stesso identico valore -> 37748734. Il mio sistema è anche un C2D e7500 e 4 giga di RAM. Sono in esecuzione finestre a 32 bit. L'intero VALORE MAX è 2147483647. – avinashkr

+0

Ho eseguito e ottenuto risposta diversa da I post: 301989886, macchina x86_64 8 GB Ram, Java 1.8 e processore 4 GHz. Lo stesso numero ottenuto su altro sistema x86_64. –

+0

Ciò che importa è l'impl della classe StringBuffer nella tua versione e piattaforma JVM ... quando ha bisogno di espandere la sua capacità, può usare un fattore di carico e, potrebbe usare Integer.MAX_VALUE (2^31 - 1 come tutti puntano out) per la capacità massima prima di esplodere ... quindi se non si ottiene tale valore è perché l'implementazione sta semplicemente espandendo l'array fino a quando non rileva un overflow ... questo tenta di Integer.MAX_VALUE prima di soffiare: http: // grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/AbstractStringBuilder.java#AbstractStringBuilder.expandCapacity%28int%29 – Renato

Problemi correlati