studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java string

programacion - ¿Cuántos caracteres puede tener Java String?



manual de programacion android pdf (8)

Estoy probando el problema de The Next Palindrome del Juez en línea de Esfera (SPOJ) donde necesito encontrar un palíndromo para un número entero de hasta un millón de dígitos. Pensé en usar las funciones de Java para invertir cadenas, pero ¿permitirían que una cadena fuera tan larga?


¿Ha considerado usar BigDecimal lugar de String para guardar sus números?


Creo que pueden tener hasta 2 ^ 31-1 caracteres, ya que están en una matriz interna, y las matrices están indexadas por enteros en Java.


Debería poder obtener una cadena de longitud Integer.MAX_VALUE (siempre 2147483647 (2 31 - 1) según la especificación Java, el tamaño máximo de una matriz, que la clase String usa para el almacenamiento interno) o la mitad de su tamaño máximo de almacenamiento dinámico ( ya que cada personaje tiene dos bytes), el que sea más pequeño.


Integer.MAX_VALUE es el tamaño máximo de la cadena + depende del tamaño de su memoria pero el problema en el juez en línea de la esfera no tiene que usar esas funciones


Java9 usa byte [] para almacenar String.value, por lo que solo puede obtener cadenas de 1GB en Java9. Java8 por otro lado puede tener cadenas de 2 GB.

Por carácter me refiero a "char" s, algunos personajes no son representables en BMP (como algunos de los emojis), por lo que se necesitarán más (actualmente 2) caracteres.


La parte del montón empeora, mis amigos. No se garantiza que UTF-16 esté limitado a 16 bits y puede expandirse a 32


Si bien, en teoría, puede interpretar caracteres Integer.MAX_VALUE, la JVM está limitada en el tamaño de la matriz que puede usar.

public static void main(String... args) { for (int i = 0; i < 4; i++) { int len = Integer.MAX_VALUE - i; try { char[] ch = new char[len]; System.out.println("len: " + len + " OK"); } catch (Error e) { System.out.println("len: " + len + " " + e); } } }

en Oracle Java 8 actualización 92 impresiones

len: 2147483647 java.lang.OutOfMemoryError: Requested array size exceeds VM limit len: 2147483646 java.lang.OutOfMemoryError: Requested array size exceeds VM limit len: 2147483645 OK len: 2147483644 OK

Nota: en Java 9, Strings usará byte [], lo que significa que los caracteres de varios bytes usarán más de un byte y reducirán aún más el máximo. Si tienes los cuatro puntos de código de bytes, por ejemplo, emojis, solo obtendrás alrededor de 500 millones de caracteres


Si usa el motor de la aplicación de Google, com.google.appengine.api.datastore.Text puede ayudar. Permite que una sola cadena almacene hasta 1 megabyte.