¿Por qué las strings de Java son inmutables?

Antes de continuar con el alboroto de la inmutabilidad , echemos un vistazo a la clase String y su funcionalidad un poco antes de llegar a una conclusión.

Así es como funciona una String :

String str = "knowledge";

Esto, como de costumbre, crea una string que contiene «conocimiento» y la asigna a la string de referencia. ¿Suficientemente simple? Realicemos algunas funciones más:

// assigns a new reference to the 
// same string "knowledge"
String s = str;     

Veamos cómo funciona la siguiente declaración:

  str = str.concat(" base");

Esto agrega una string «base» a str. Pero espera, ¿cómo es esto posible, ya que los objetos String son inmutables? Bueno, para su sorpresa, lo es.

Cuando se ejecuta la declaración anterior, la VM toma el valor de String str, es decir, «conocimiento» y agrega «base», dándonos el valor «base de conocimiento». Ahora, dado que las strings son inmutables, la VM no puede asignar este valor a str, por lo que crea un nuevo objeto String, le da un valor de «base de conocimiento» y le da la referencia str.

Un punto importante a tener en cuenta aquí es que, mientras que el objeto String es inmutable, su variable de referencia no lo es. Por eso, en el ejemplo anterior, la referencia se hizo para referirse a un objeto String recién formado.

En este punto del ejemplo anterior, tenemos dos objetos String: el primero que creamos con el valor «conocimiento», señalado por s, y el segundo «base de conocimiento», señalado por str. Pero, técnicamente, tenemos tres objetos String, el tercero es la «base» literal en la instrucción concat.

¿Por qué las strings son de naturaleza inmutable?

Estas son algunas razones más para hacer que String sea inmutable en Java. Estos son:

  • El grupo de strings no puede ser posible si String no es inmutable en Java. JRE ahorra mucho espacio de almacenamiento dinámico. Más de una variable de string en el grupo puede hacer referencia a la misma variable de string. La internación de strings tampoco puede ser posible si la string no fuera inmutable.
  • Si no hacemos que String sea inmutable, supondrá una grave amenaza para la seguridad de la aplicación. Por ejemplo, los nombres de usuario de la base de datos, las contraseñas se pasan como strings para recibir conexiones de la base de datos. Las descripciones del puerto y del host de programación del socket también se pasan como strings. El String es inmutable, por lo que su valor no se puede cambiar. Si la string no permanece inmutable, cualquier pirata informático puede causar un problema de seguridad en la aplicación al cambiar el valor de referencia.
  • El String es seguro para subprocesos múltiples debido a su inmutabilidad. Diferentes subprocesos pueden acceder a una sola «instancia de string». Elimina la sincronización para la seguridad de subprocesos porque hacemos que las strings sean seguras para subprocesos implícitamente.
  • La inmutabilidad brinda la seguridad de cargar la clase correcta mediante Classloader. Por ejemplo, supongamos que tenemos una instancia en la que intentamos cargar la clase java.sql.Connection pero los cambios en el valor de referencia a la clase myhacked.Connection hacen cosas no deseadas en nuestra base de datos.

Datos importantes sobre el uso de strings y memoria

¿Qué pasaría si no tuviéramos otras referencias al “conocimiento”? Habríamos perdido ese String. Sin embargo, todavía habría existido pero se consideraría perdido por no tener referencias. 
Mira un ejemplo más a continuación

Java

// Java Program to demonstrate why
// Java Strings are immutable
 
import java.io.*;
 
class GFG {
    public static void main(String[] args)
    {
        String s1 = "java";
        s1.concat(" rules");
 
        // Yes, s1 still refers to "java"
        System.out.println("s1 refers to " + s1);
    }
}
Producción

s1 refers to java

Explicación:

  1. La primera línea es bastante sencilla: cree una nueva string «java» y remítala a s1.
  2. A continuación, la VM crea otra nueva string de «reglas de Java», pero nada se refiere a ella. Entonces, la segunda String se pierde instantáneamente. No podemos alcanzarlo.

La variable de referencia s1 todavía se refiere a la string original «java».

Casi todos los métodos, aplicados a un objeto String para modificarlo, crean un nuevo objeto String. Entonces, ¿a dónde van estos objetos String? Bueno, estos existen en la memoria, y uno de los objetivos clave de cualquier lenguaje de programación es hacer un uso eficiente de la memoria.

A medida que crecen las aplicaciones, es muy común que los literales de string ocupen una gran área de memoria, lo que puede incluso causar redundancia. Entonces, para hacer que Java sea más eficiente, la JVM reserva un área especial de memoria llamada «Conjunto de constantes de strings».

Cuando el compilador ve un literal de string, busca la string en el grupo. Si se encuentra una coincidencia, la referencia al nuevo literal se dirige a la string existente y no se crea ningún objeto de string nuevo. El String existente simplemente tiene una referencia más. Aquí viene el punto de hacer que los objetos String sean inmutables:

En el grupo de constantes String, es probable que un objeto String tenga una o varias referencias. Si varias referencias apuntan al mismo String sin siquiera saberlo, sería malo que una de las referencias modificara ese valor de String. Es por eso que los objetos String son inmutables.

Bueno, ahora podría decir, ¿qué pasa si alguien anula la funcionalidad de la clase String? Esa es la razón por la que la clase String está marcada como final para que nadie pueda anular el comportamiento de sus métodos.

Publicación traducida automáticamente

Artículo escrito por vaibhav shukla 5 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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