Las cadenas de caracteres representan una importante fracción de toda la información con la que operan los programas, indistintamente del lenguaje de programación usado. Tanto el almacenamiento de las cadenas como su tratamiento tienen un gran impacto en la mayoría de aplicaciones, de ahí que se demande de los compiladores y máquinas virtuales una representación y gestión lo más eficientes posible de estas.
En Java, String
es el tipo fundamental a la hora de trabajar con cadenas de caracteres. Este usa internamente un vector de tipo char
para almacenar los caracteres (lo podemos comprobar fácilmente abriendo el módulo de clase String.java
), lo cual implica que cada uno de ellos ocupa 2 bytes. De esta forma se facilita la codificación Unicode de 16 bits:
Hay multitud de idiomas basados en el alfabeto occidental, con algunas variaciones, que no precisan más de 256 símbolos distintos, no siendo necesaria la codificación Unicode. En estos casos las cadenas ocupan el doble de lo que en realidad es indispensable, lo cual afecta tanto al espacio necesario para almacenarlas como a la eficiencia de las operaciones que operan sobre ellas.
Una de las novedades introducidas en Java 9 afecta a la representación del tipo String
que, como se aprecia en la imagen siguiente, ha cambiado el tipo char
por byte
para los elementos de la cadena. Esta modificación está documentada en el JEP 254, titulado Compact Strings. La clase String
cuenta con un atributo adicional, llamado coder,
que permite a los métodos que operan sobre cadenas saber si están utilizándose uno o dos bytes por carácter. De esta forma se sigue dando soporte a alfabetos extendidos, al tiempo que se reduce la ocupación en memoria y mejora la eficiencia cuando se opera con alfabetos simplificados:
A diferencia de las compressed strings que se introdujeron en Java 6, y que fueron posteriormente descartadas en la versión 7 debido a los fallos de implementación, las cadenas compactas de Java 9 son una características activada por defecto. Es decir, no tendremos que hacer nada para optimizar nuestro código a la hora trabajar con cadenas de caracteres, simplemente recompilar nuestro código para la nueva versión de la plataforma.
Según distintos análisis realizados, el uso de memoria de las aplicaciones llega a reducirse un 21% y su eficiencia mejora en torno a un 7% tras la introducción de las cadenas compactas. Estos números, lógicamente, variarán de aplicación a aplicación según la cantidad de información textual y las operaciones que se lleve a cabo sobre ellas.
Recomendamos el siguiente vídeo de Aleksey Shipilëv para aquellos interesados en profundizar en esta novedad de Java 9: