java inmutabilidad de cuerdas

  Ayer la entrevista, el entrevistador me preguntó inmutabilidad de cuerdas, respondí un poco peor, y comprobar rápidamente la información con el fin de resumir la nota!

En primer lugar, el principio

  1, el mismo patrón (inmutable)

  En proceso de desarrollo de software paralelo, funcionamiento síncrono parece ser esencial. Cuando varios subprocesos leen y operaciones de escritura al mismo objeto, con el fin de asegurar la exactitud y la consistencia de los datos de objeto, es necesario sincronizar un objeto. operando de forma sincronizada la pérdida de rendimiento del sistema es considerable. Con el fin de eliminar estos funcionamiento síncrono tanto como sea posible, para mejorar el rendimiento de los programas paralelos, puede utilizar un cambio no-sujeto, basándose en la invariancia objeto, todavía se puede asegurar que se mantiene un estado interno en un entorno multiproceso, no hay consistencia en funcionamiento síncrono y corrección. Este es el mismo patrón.

  El mismo modelo es inherentemente multi-hilo amable, su idea central es que una vez que se crea un objeto, su estado interno será nunca cambian. Por lo tanto, hay un hilo puede modificar su estado interno y los datos, mientras que su estado interno y nunca va a cambiar por su cuenta. Sobre la base de estas características, el objeto de la operación multi-roscado constante no requiere control de sincronización.

  También tenga en cuenta, el mismo modo de sólo lectura y atributos son bastante diferentes, el mismo patrón es consistente y tiene más que leer la propiedad de invariancia. Para el atributo de sólo lectura del objeto, el objeto en sí no puede ser modificado por otros hilos, pero el objeto en sí, sino el estado puede modificar su propio ejemplo, el tiempo de supervivencia de un objeto (tiempo de creación de objeto y la diferencia de tiempo entre el tiempo actual) es de sólo lectura, porque nadie hilo de terceros no puede modificar esta propiedad, pero esta propiedad es una variable, porque con el tiempo, el tiempo en que la supervivencia de la División están cambiando. Se requiere que el mismo patrón, por cualquier razón, ya que se crea el objeto, su estado interno y los datos para mantener la estabilidad absoluta.

  2, la forma de lograr los objetos inmutables

  En el lenguaje Java, para lograr el mismo patrón es simple. Una vez creado un objeto de garantizar que no se produzcan cambios, y para asegurar que el mismo trabajo adecuadamente, tome nota de los siguientes cuatro puntos:

    • Setter métodos para eliminar y modificar sus propiedades hasta el final.
    • Toda la propiedad es privado, y con una nota final, no puede ser modificado para garantizar que
    • Asegúrese de que ninguna subclase puede anular modificar su comportamiento.
    • No puede crear un constructor de objetos completa.

Y no es la función final es muy consistente. Se revisa el papel de java en la final.

    • clase modificación final que representa la clase no puede ser heredado, comúnmente conocida como clase Duanzaijuesun, todos los métodos de la clase se convierte automáticamente en último método
    • método de modificación final, una subclase no puede reemplazar este método
    • modificación final de los tipos de datos básicos de las variables, indica que la variable es una constante, el valor no se puede modificar
    • última variable de modificación del tipo de referencia, lo que indica que las referencias no pueden apuntar a otros objetos después se construye el objeto, pero el estado de los puntos de objeto referenciado pueden variar

  Debe tenerse en cuenta que: cuando se modifican los tipos básicos de variables finales, no puede ser re-asignado a los tipos básicos de variables, tipos básicos de variables que no se pueden cambiar. Sin embargo, para los propósitos de la variable tipo de referencia, que contiene sólo una referencia, única garantía final de que la dirección variables de referencia que se hace referencia no cambiará, eso ha sido una referencia al mismo objeto, pero el objeto por completo se puede producir el cambio. Por ejemplo, un punto final a una serie de referencias, debe apuntar a un punto final a partir de la inicialización de la matriz, pero el contenido de la matriz se puede cambiar.

Dos, el código fuente de cuerdas análisis

Los siguientes son algunos de clase String jdk1.8 la fuente. 

públicos  finales  clase de Cuerda implementos java.io.Serializable, Comparable <String> , CharSequence {    
     
/ ** El valor se utiliza para el almacenamiento de caracteres. * / Privada definitiva carbón valor []; / ** caché el código hash de la cadena * /
privada int de hash; // por defecto a 0 / ** uso serialVersionUID de JDK 1.0.2 para la interoperabilidad * / privada estática última larga serialVersionUID = -6849794470754667710L; / ** ...

  En primer lugar se puede ver, la clase String utilizando el modificador final indica que la clase String no se puede heredar. A continuación, nos centramos en las variables miembro de la clase String valor, el valor es un char [] tipo, por lo que el objeto String en realidad está empaquetado con este conjunto de caracteres. Mirar el valor del modificador, utilizando, no proporcionaron métodos setter privadas, por lo que no se puede modificar el valor externo de la clase String, mientras que también usando el valor final se ha modificado, no se puede modificar el valor dentro de la clase String, que es una vez determinado el valor de un valor inicial, valor apunta a la dirección no se puede cambiar. Sin embargo, la modificación final del contenido tipo de variable por encima de referencia mencionado, podemos único valor de garantía no puede apuntar a otro objeto, pero el objeto apuntado valor de estado se puede cambiar. clase String se puede encontrar buscando en el código fuente, lo inmutable clase String, es crítico porque el ingeniero de Sun, en un método detrás de todas las cuerdas muy cuidado de no tocar el carácter de los elementos de la matriz. Así que la clase String key son inmutables implementación subyacente, en lugar de una final.

En tercer lugar, modificar la cadena es "variable"

  Aunque se modifica el valor final, el valor indicado simplemente no puede ser redirigido a otras referencias. Pero el valor del punto de la matriz puede ser cambiado en circunstancias normales, no tenemos forma de elementos de acceso de la matriz señalado a este valor. Pero, lo que refleja en la reflexión puede Niubi ella. valor de atributo puede ser reflejada en un objeto String, cambiando de este modo la estructura de la matriz cambiando el valor de referencia obtenido.

pública  estática  vacíos principales (args String []) lanza la excepción { 
    string cadena = "Hola Mundo" ; 
    System.out.println ( "STR pre-modificación:" + STR); 
    System.out.println ( "STR antes de la modificación dirección de memoria "+ el System.identityHashCode (str));
     // obtener el valor de campo clase String 
    campo, campo de valor = cadena. clase .getDeclaredField (" valor " );
     // cambiar el valor de la propiedad acceso 
    valueField.setAccessible ( true );
     // Obtener el valor del atributo de valor del objeto str 
    Char valor [] = ( Char []) valueField.get (str);
     //Cambiar el valor de la matriz de caracteres de referencia 
    valor [. 3] = '?' ; 
    System.out.println ( "modificado STR:" + STR); 
    System.out.println ( "dirección de memoria STR antes de la modificación" + el System.identityHashCode (str)); 
} 

// resultados de la ejecución
 // puede verse que la secuencia de cadenas str ha cambiado, pero el str dirección de memoria no cambió. 
Str antes de la modificación: el Hello World 
str antes de las direcciones de memoria de forzado 1922154895 
str modificado: Hel ? O Mundial 
str antes de las direcciones de memoria de forzado 1922154895

 Cuatro, cadena diseñado como una causa de la inmutabilidad

  En Java, la cadena ha diseñado como inmutable es considerado como la memoria, la sincronización resultado de diversos factores, tales como las estructuras de seguridad y de datos, lo siguiente será hacer un resumen de una variedad de factores.

  1, constantes de tiempo de ejecución necesidades de la piscina

  Por ejemplo, la implementación de la cadena s = "abc"; cuando se ejecuta este código, JVM constantes de tiempo de ejecución primeros en la piscina para ver si hay un objeto de cadena "abc", si el objeto ya existe, no se crea un nuevo objeto String "abc", pero s referencias directamente a la constante de tiempo de ejecución de la piscina del objeto String existente "abc", y si no existe el objeto, crear un nuevo objeto String "abc" en la piscina constante de tiempo de ejecución, y luego seleccione ejecutar s frecuentemente citados se crea la cantidad de la piscina del nuevo objeto String.
Por lo que sólo se creará un conjunto de constantes de tiempo de ejecución de un objeto de cadena "abc", lo que ahorra espacio en la memoria.

    2, síncrono

  Dado que los objetos String son inmutables, es seguro multi-roscado, con una instancia de String puede ser compartida por varios subprocesos. Esto no se utiliza debido a la sincronización de hilo de seguridad.

  3, permitiendo que el objeto de caché código hash de cuerdas

  Ver arriba JDK1.8 cadena de código fuente de la clase se puede encontrar que tiene un campo de hash, clase String garantiza la unicidad de la inmutabilidad de código hash, puede amortiguar objeto String código hash con el campo de hash, cada vez que no hay necesidad de volver código hash calculado. Por lo tanto Cadena objeto en Java se utiliza a menudo como un recipiente tal como un HashMap clave.

  4, la seguridad

  Si el objeto String es variable, puede causar serios problemas de seguridad. Por ejemplo, el nombre de usuario y contraseña de base de datos están en la forma de una cadena que se pasa para obtener la conexión a la base de datos, o en la programación del zócalo, el nombre de host y el puerto se pasan como una cadena. Dado que los objetos String son inmutables, por lo que su valor no se puede cambiar, de lo contrario hackers puede perforar lagunas, cambiar el valor de referencia apuntada objeto String, resultando en vulnerabilidades.

 

 

referencia:

1、https://blog.csdn.net/dearKundy/article/details/82355019?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

2、https://blog.csdn.net/qq1404510094/article/details/80303334?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

 

Supongo que te gusta

Origin www.cnblogs.com/DDgougou/p/12588136.html
Recomendado
Clasificación