2012-01-09 25 views
9

Java tiene grupo de cadenas, debido a lo cual los objetos de la clase de cadena son inmutables.String POOL en java

Pero mi pregunta se destaca -

¿Cuál era la necesidad de hacer cuerdas de la piscina?

¿Por qué la clase de cadena no se mantuvo como otra clase para mantener sus propios valores?

Es internamente JVM necesita algunas cadenas o es esto un beneficio de rendimiento. Si es así, ¿cómo?

+0

Piensa qué harás si quieres crear una clase inmutable por ti mismo. – Azodious

+0

Bueno, mi pregunta es: hay tantas otras clases inmutables en Java, por qué los diseñadores de Java decidieron hacer String Pool. ¿Es una función para ayudar al rendimiento o fue la necesidad de Java Design? –

Respuesta

6

Un grupo es posible porque las cadenas son inmutables. Pero la inmutabilidad de la Cadena no se ha decidido solo por este grupo. La inmutabilidad tiene muchos otros beneficios. Por cierto, un Double también es inmutable, y no hay un conjunto de dobles.

La necesidad del grupo de cadenas es reducir la memoria necesaria para contener todos los literales de cadena (y las cadenas internas) que utiliza un programa, ya que estos literales tienen muchas posibilidades de ser utilizados muchas veces, en muchos lugares del programa. En lugar de tener miles de copias del mismo literal String, solo tiene miles de referencias al mismo String, lo que reduce el uso de la memoria.

Tenga en cuenta que la clase String no es diferente de otras clases: tiene su propia matriz char. Sin embargo, también puede compartirlo con otras instancias de String cuando se invoca subcadena.

+0

** El doble también es inmutable, y no hay un conjunto de dobles ** Buena elección ... :) Gracias – agpt

+0

¿Qué quiere decir con "cadenas literales que hace un programa"? ¿Estás diciendo que JVM internamente genera muchas cadenas similares incluso cuando la aplicación no funciona con texto y no crea muchos objetos String explícitamente? – James

+1

No, lo que estoy diciendo es precisamente lo inverso: si 200 clases usan el literal de cadena '" "' en su código, solo se crea una instancia, se almacena en el grupo de cadenas y se comparte con todas las clases. –

0

Cuando el compilador ve que se debe crear un nuevo String literal, primero verifica el grupo para una cadena idéntica, si no se encuentra, se crea un nuevo String literal, se hace referencia al String existente.

+0

El compilador no tiene nada que ver con esto, en realidad. Los literales se colocan en el archivo de clase y el grupo los resuelve cuando se carga la clase. –

+1

entonces, ¿qué está diciendo que las cadenas en el conjunto no se refieren si se encuentra una coincidencia? – Harinder

0

el beneficiarían de hacer cadena como inmutable era para la función de seguridad. Lea a continuación

¿Por qué la cadena se ha hecho inmutable en Java?

Aunque, el rendimiento también es un motivo (suponiendo que ya conoce el String pool interno para asegurarse de que el mismo objeto String se usa más de una vez sin tener que crear/volver a reclamarlo muchas veces), pero la razón principal por la cual se ha hecho inmutable String en Java es 'Seguridad'. ¿Sorprendido? Vamos a entender por qué.

Supongamos que debe abrir un archivo seguro que requiera que los usuarios se autentiquen a sí mismos. Digamos que hay dos usuarios llamados 'usuario1' y 'usuario2' y tienen sus propios archivos de contraseñas 'contraseña1' y 'contraseña2', respectivamente. Obviamente, 'usuario2' no debería tener acceso al archivo 'contraseña1'.

Como sabemos, los nombres de los archivos en Java se especifican mediante cadenas. Incluso si crea un objeto 'Archivo', pasa el nombre del archivo como una Cadena solamente y esa Cadena se mantiene dentro del objeto Archivo como uno de sus miembros.

Had String sido mutable, 'user1' podría haber iniciado sesión usando sus credenciales y de alguna manera podría haber logrado cambiar el nombre de su contraseña (un objeto String) de 'contraseña1' a 'contraseña2' antes de que JVM realmente coloque la llamada al sistema nativo del sistema operativo para abrir el archivo. Esto hubiera permitido que 'usuario1' abriera el archivo de contraseñas del usuario2. Es comprensible que hubiera resultado en un gran defecto de seguridad en Java. Entiendo que hay muchas cosas que 'podría haber' aquí, pero ciertamente estarías de acuerdo en que habría abierto una puerta para permitir a los desarrolladores desordenar la seguridad de muchos recursos, ya sea intencionalmente o no intencionalmente.

Con las cadenas inmutables, JVM puede estar seguro de que el miembro de la instancia del nombre de archivo del objeto File correspondiente seguirá apuntando al mismo objeto String "filename" sin modificar. El miembro de la instancia 'filename' que es 'final' en la clase File no se puede modificar para apuntar a ningún otro objeto String que especifique ningún otro archivo distinto al deseado (es decir, el que se usó para crear el objeto File).

+0

Esto no es realmente un motivo de seguridad. La clase File solo necesitaría copiar la cadena con el nombre del archivo en un nuevo objeto String si las cadenas fueran mutables en Java. Es solo una característica de rendimiento que esta copia no es necesaria (y una característica conveniente para los programadores que no pueden olvidar la copia necesaria). –