¿Por String de Java diseñado para ser inmutable?

Original a partir de: ¿Por qué es una cadena inmutable en Java?

Se deriva de Java y Android entrevistas hechas a menudo de un tema. En el lenguaje Java, cuerdas es una constante de cadena, StringBuilder es una variable de cadena, ¿por qué cadena diseñado para ser inmutable (inmutable)?

Toda la información se inicializa cuando Java, la clase String es inmutable, inmutable clase es una instancia de una clase no puede ser modificado, se crea la instancia, y no puede ser modificado. Este diseño tiene muchas ventajas, este artículo desde la memoria, sincronización y estructura de datos se resumen las razones por las cuales la clase String diseñado para ser inmutable.

1, espera una piscina constante de cadena

piscina constante de cadena es un área de almacenamiento especial. Cuando se crea una cadena, si la cadena ya existe en la piscina, a continuación, devuelve una referencia a una cadena existente, pero no crea un nuevo objeto.
El siguiente código sólo crean un objeto de cadena en el montón:

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

Diagrama es la siguiente:
Escribir imágenes describen aquí
si la cadena es variable, con un cambio de valor de referencia dará lugar a una cadena de error otras referencias.

2, caché HashCode

Una cadena almacenada en Java suelen utilizar valor HashCode, por ejemplo, en un HashMap o HashSet. Estática puede HashCode única garantía, no consideran el cambio en él. Esto significa que no cada vez que lo utilice cuando se calculan HashCode, mejorar la eficiencia operativa.
códigos de cadena en la clase siguiente:

private int hash;//this is used to cache hash code.

3, para promover el uso de otros objetos

El siguiente programa se especifica:

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 la cadena es variable, sería contrario al conjunto de diseño (el conjunto de elementos comprende un no repetitivo). Por supuesto, los ejemplos anteriores se utilizan simplemente para demostración, no hay ninguna clase string campo de valor real.

4, la seguridad

Cadena se utiliza ampliamente en muchos parámetros de clase Java, tales como conexiones de red, los archivos abiertos y similares. Si la cadena no es inmutable, de conexión o de archivos de cambios se llevan a una grave amenaza de seguridad. Él cree que está conectado a una máquina, no lo es. Debido a que el argumento es una cadena, la variable de cadena puede conducir a problemas de seguridad en la reflexión. (Inmutabilidad de manera que puede ser compartida entre los diferentes hilos, y el hilo de seguridad, a los usuarios ayudar a reducir el desarrollo de la sincronización de subprocesos)
ejemplo es como sigue:

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, objetos inmutables son naturalmente thread-safe

Dado que los objetos inmutables no se pueden cambiar, para que puedan compartir múltiples hilos libertad. Esto elimina el requisito de que deben estar sincronizados.

resumen

En resumen, cadena está diseñado para ser inmutables factores de eficiencia y seguridad. Es por esto que en muchos casos la clase preferida es la causa de la clase inmutable.

Por supuesto, diferentes escenarios de uso reflejan la característica inmutable ventaja no es la misma. Podemos recordar sus propios proyectos utilizan escenario, piensan más en este tipo de problemas.

Publicado 59 artículos originales · ganado elogios 88 · vistas 190 000 +

Supongo que te gusta

Origin blog.csdn.net/geofferysun/article/details/78104676
Recomendado
Clasificación