Categorías
Basics Diagram Java

¿Por qué String es inmutable en Java?

String es inmutable en Java. Una clase inmutable es simplemente una clase cuyas instancias no se pueden modificar. Toda la información de una instancia se inicializa cuando se crea la instancia y la información no se puede modificar. Hay muchas ventajas de las clases inmutables. Este artículo resume por qué String está diseñado para ser inmutable. Este artículo ilustra el concepto de inmutabilidad en la perspectiva de la memoria, la sincronización y las estructuras de datos.

1. Requisito de la agrupación de cadenas

El grupo de cuerdas (grupo interno de cuerdas) es un área de almacenamiento especial en el área de métodos. Cuando se crea una cadena y si la cadena ya existe en el grupo, se devolverá la referencia de la cadena existente, en lugar de crear un nuevo objeto.

El siguiente código creará solo un objeto de cadena en el montón.

String string1 = "abcd";
String string2 = "abcd";

Así es como se ve:

Si una cadena es mutable, cambiar la cadena con una referencia conducirá a un valor incorrecto para las otras referencias.

2. Almacenamiento en caché de Hashcode

El código hash de una cadena se usa con frecuencia en Java. Por ejemplo, en un HashMap o HashSet. Ser inmutable garantiza que el hashcode siempre será el mismo para que se pueda cobrar sin preocuparse por los cambios, es decir, no es necesario calcular el hashcode cada vez que se utiliza. Esto es más eficiente.

En la clase String, tiene el siguiente código:

private int hash;//this is used to cache hash code.
  Compile y ejecute proyectos Eclipse Java desde la terminal de Linux

3. Facilitar el uso de otros objetos

Para hacer esto concreto, considere el siguiente programa:

HashSet<String> set = new HashSet<String>();
set.add(new String("a"));
set.add(new String("b"));
set.add(new String("c"));
 
for(String a: set)
	a.value = "a";

En este ejemplo, si String es mutable, su valor se puede cambiar, lo que violaría el diseño del conjunto (el conjunto contiene elementos no duplicados). Por supuesto, el ejemplo anterior es solo para fines de demostración y no hay value campo en una clase de cadena real.

4. Seguridad

String se usa ampliamente como parámetro para muchas clases de Java, por ejemplo, conexión de red, apertura de archivos, etc. Si String no fuera inmutable, se cambiaría una conexión o un archivo y esto puede conducir a una seria amenaza a la seguridad. El método pensó que se estaba conectando a una máquina, pero no fue así. Las cadenas mutables también podrían causar un problema de seguridad en Reflection, ya que los parámetros son cadenas.

Aquí hay un ejemplo de código:

boolean connect(string s){
    if (!isSecure(s)) { 
throw new SecurityException(); 
}
    //here will cause problem, if s is changed before this by using other references.    
    causeProblem(s);
}

5. Los objetos inmutables son naturalmente seguros para subprocesos

  Java crea un archivo / directorio

Debido a que los objetos inmutables no se pueden cambiar, se pueden compartir libremente entre varios subprocesos. Esto elimina los requisitos de sincronización.

En resumen, String está diseñado para ser inmutable por razones de eficiencia y seguridad. Esta es también la razón por la que se prefieren las clases inmutables en muchos casos en general.

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *