Las cadenas consumen mucha memoria en cualquier aplicación. Cada vez que el recolector de elementos no utilizados visita objetos de cadena, toma nota de las matrices de caracteres. Toma su valor hash y lo almacena junto con una referencia débil a la matriz. Tan pronto como encuentra otro String que tiene el mismo código hash, los compara carácter por carácter. Si también coinciden, se modificará un String y apuntará a la matriz de caracteres del segundo String. Ya no se hace referencia a la primera matriz de caracteres y se puede recolectar basura.
Grupo de cuerdas:
Todas las cadenas utilizadas por el programa Java se almacenan aquí. Si dos variables se inicializan con el mismo valor de cadena. No se crean dos cadenas en la memoria, solo habrá una copia almacenada en la memoria y ambas apuntarán a la misma ubicación de memoria.
Entonces, Java ya se encarga de no crear cadenas duplicadas en el montón al verificar si la cadena existe en el grupo de cadenas. Entonces, ¿cuál es el propósito de la deduplicación de cadenas?
Si hay un código de la siguiente manera
String myString_1 = new String("Hello World"); String myString_2 = new String("Hello World");se crean dos cadenas en la memoria aunque sean iguales. No puedo pensar en ningún otro escenario que no sea este en el que la deduplicación de cadenas sea útil. Obviamente debo estar perdiendo algo. ¿Qué me estoy perdiendo?
Gracias de antemano
El conjunto de cadenas se aplica solo a las cadenas que se le agregan explícitamente o que se usan como constantes en la aplicación. No se aplica a cadenas creadas dinámicamente durante la vigencia de la aplicación. Sin embargo, la deduplicación de cadenas se aplica a todas las cadenas.
El grupo de cadenas se refiere a las constantes de cadena que se conocen en tiempo de compilación.
La deduplicación de cadenas lo ayudaría si recupera (o construye) la misma cadena un millón de veces en tiempo de ejecución, por ejemplo, leyéndola desde un archivo, una solicitud HTTP o de cualquier otra forma.
La deduplicación de cadenas disfruta del nivel adicional de direccionamiento indirecto integrado en String :
String distintos que comparten el mismo contenido . Esto se traduce en la eliminación de una limitación de desduplicación en la creación: su aplicación podría seguir creando nuevos objetos String con contenido idéntico mientras usa muy poca memoria adicional, porque el contenido de las cadenas se compartiría. Este proceso se puede realizar en un horario completamente independiente, por ejemplo, en segundo plano, mientras que su aplicación no necesita muchos de los recursos de la CPU. Dado que la identidad del objeto String no cambia, la desduplicación se puede ocultar por completo desde su aplicación.