2012-08-10 32 views
5

¿Por qué el StringBuffer tiene un límite en su tamaño?Tamaño máximo para StringBuffer

Revisé algunos de los enlaces: http://www.coderanch.com/t/540346/java/java/maximum-size-hold-String-buffer.

¿Eso se debe a la variable de miembro de conteo, que es un int?

Supongamos que tenemos 2^31-1 caracteres en StringBuffer y que agregamos algunos caracteres más a ese StringBuffer. La variable miembro del conteo se incrementará por el número de caracteres agregados y si la variable conteo ya está en su máximo (2^31-1), se revertiría a algún valor negativo.

¿Por qué arrojaría un error?

+0

No utilice un StringBuffer cuando se puede utilizar un StringBuilder (tiene el mismo límite, aunque) –

+1

A 2^32-1 StringBuilder tomaría 4 GB. ¿Te gusta crear una cadena tan larga? –

Respuesta

13

porque StringBuffer internamente utiliza una matriz y el número máximo de elementos de un array puede albergar es de 2^31-1 si Incrementar después de llegar a este tope a negativo y arroja el error

+0

¿por qué hay un límite máximo en la cantidad de elementos en una matriz, se menciona eso en las especificaciones de Java? – vjk

+0

@vjk acceso aleatorio a la matriz usa un número entero para la posición. es decir: myArray [8]. ¿Cómo accedería a los elementos en la posición MAX_INT + 1? –

+0

simplemente intente crear una matriz de tamaño de algún valor largo –

0

Si se van a ninguna parte cerca de 2^31 caracteres en tu memoria intermedia lo estás haciendo mal y te habrás quedado sin memoria hace mucho tiempo.

+4

Estoy de acuerdo con usted en el hecho de que lo está haciendo mal. Sin embargo, no hay ninguna razón para pensar que se le va a agotar la memoria. –

4

StringBuffer utiliza un char[].
En Java, una matriz se puede indizar solo a través de un número entero, lo que significa que el valor más alto que puede tener el índice es Integer.MAX_VALUE - 1 (es decir, 2^31 - 1). Lo que significa que el tamaño de una matriz en Java no puede ser mayor que Integer.MAX_VALUE

3

La respuesta es diferente según la arquitectura del sistema.

Esta máquina vieja cuando me envió respuesta en 2012

Longitud máxima de caracteres =

Java Versión: 1.6.0_35

SO: Windows 7

Arquitectura del sistema: 32bits (x86)

RAM: 2 GB

Procesador: Pentium Dual Core E5800 3.20GHz

En 2016

Longitud máxima de caracteres =

Java Versión: 1.8

OS: Ubuntu 14 LTE y Windows 7

System Architecture: 64bits (x86_64)

RAM: 8 GB

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

ejecutar este programa a su 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"); 

salida

Max length on your system is 37748734 
+0

Sí, ejecuté eso y obtuve el mismo valor exacto -> 37748734. Mi sistema también es un C2D e7500 y 4 gigas de ram. Estoy ejecutando ventanas de 32 bits. El número entero de VALOR es 2147483647. – avinashkr

+0

Corrí y recibí una respuesta diferente de la que publiqué: 301989886, máquina x86_64 8 GB Ram, procesador Java 1.8 y 4 GHz. Mismo número obtenido en otro sistema x86_64. –

+0

Lo que importa es la impl de la clase StringBuffer en su versión y plataforma JVM ... cuando necesite expandir su capacidad, puede usar un factor de carga y, podría usar Integer.MAX_VALUE (2^31 - 1 como todos señalan fuera) para la capacidad máxima antes de la explosión ... así que si no obtienes ese valor es porque tu implementación simplemente está expandiendo la matriz hasta que detecta un desbordamiento ... esta prueba Integer.MAX_VALUE antes de volar: http: // grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/AbstractStringBuilder.java#AbstractStringBuilder.expandCapacity%28int%29 – Renato

Cuestiones relacionadas