Responde uno:
Una de las preguntas más populares de las entrevistas de Java es: ¿Qué es un objeto inmutable (objeto inmutable), cuáles son los beneficios de los objetos inmutables y en qué circunstancias debería usarse o, más específicamente, por qué la clase String de Java debería establecerse en un? tipo inmutable?
Los objetos inmutables, como sugiere el nombre, son objetos que no se pueden cambiar después de su creación. Un ejemplo típico es la clase String en Java.
Copie el código de código de la siguiente manera:
Cadena s = "ABC";
s.toLowerCase();
Como se indicó anteriormente, s.toLowerCase() no cambia el valor de "ABC", sino que crea una nueva clase de cadena "abc" y luego apunta la nueva instancia a la variable s.
Los objetos inmutables tienen muchas ventajas sobre los objetos mutables:
1). Los objetos inmutables pueden mejorar la eficiencia y seguridad de String Pool. Si sabe que un objeto es inmutable, cuando necesite copiar el contenido del objeto, no necesitará copiarlo en sí, sino solo su dirección. Copiar la dirección (generalmente el tamaño de un puntero) requiere muy poca memoria. y es muy eficiente. No afectará a otras variables que hagan referencia a este "ABC" al mismo tiempo.
2) Los objetos inmutables son seguros para subprocesos múltiples, porque cuando se ejecutan varios subprocesos al mismo tiempo, es probable que otros procesos cambien el valor de un objeto mutable, lo que provocará resultados impredecibles, y el uso de objetos inmutables es esto. situación se puede evitar.
Por supuesto, hay otras razones, pero la razón más importante por la que Java establece String como inmutable es la eficiencia y la seguridad.
Respuesta dos:
Esta es una pregunta antigua pero aún popular. Diseñar String para que sea inmutable en Java es el resultado de tener en cuenta varios factores. Para comprender este problema, es necesario integrar consideraciones estructurales y de seguridad a continuación. , Haré un resumen de varios motivos.
1. La necesidad de un grupo constante de cadenas
El grupo de constantes de cadenas (grupo de cadenas, grupo interno de cadenas, grupo de retención de cadenas) es un área de almacenamiento especial en la memoria del montón de Java. Al crear un objeto de cadena, si el valor de la cadena ya existe en el grupo de constantes, no se creará uno nuevo. objeto, sino una referencia a un objeto existente.
Como se muestra en el siguiente código, solo se creará un objeto String real en la memoria del montón.
Copie el código de código de la siguiente manera:
Cadena s1 = "abcd";
Cadena s2 = "abcd";
El diagrama esquemático es el siguiente:
Si se permite que el objeto de cadena cambie, se producirán varios errores lógicos. Por ejemplo, cambiar un objeto afectará a otro objeto independiente. Estrictamente hablando, la idea de este grupo constante es un método de optimización.
Piense: si el código es el siguiente, ¿s1 y s2 seguirán apuntando al mismo objeto String real?
Copie el código de código de la siguiente manera:
Cadena s1= "ab" + "cd";
Cadena s2= "abc" + "d";
Quizás esta pregunta sea contradictoria para los principiantes, pero considerando que los compiladores modernos realizarán optimizaciones periódicas, todos apuntarán al mismo objeto en el grupo constante. Alternativamente, puede usar herramientas como jd-gui para ver el documento de clase compilado.
2. Permitir que los objetos String almacenen en caché HashCode
El código hash de los objetos String en Java se usa con frecuencia, como en contenedores como hashMap.
La inmutabilidad de la cadena garantiza la unicidad del código hash, por lo que se puede almacenar en caché con confianza. Este también es un método de optimización del rendimiento, lo que significa que no es necesario calcular un nuevo código hash cada vez. Existe el siguiente código en la definición. de la clase String:
Copie el código de código de la siguiente manera:
hash int privado; // usado para almacenar en caché HashCode
3. Seguridad
Muchas clases de Java (bibliotecas) utilizan String como parámetro, como la dirección URL de conexión de red, la ruta del archivo y los parámetros de String requeridos por el mecanismo de reflexión. Si String no se corrige, causará varios riesgos de seguridad.
Si existe el siguiente código:
Copie el código de código de la siguiente manera:
conexión booleana (cadena s) {
si (!isSecure(s)) {
lanzar nueva SecurityException();
}
// Si String se puede modificar en otro lugar, aquí se producirán varios problemas/errores inesperados.
causaProblema(s);
}
En términos generales, las razones por las que String es inmutable incluyen consideraciones de diseño, problemas de optimización de la eficiencia y seguridad. De hecho, esta también es la respuesta a muchos "por qué" en las entrevistas de Java.
Respuesta 3: Beneficios de la inmutabilidad de la clase String
String es la clase más utilizada en todos los idiomas. Sabemos que en Java, String es inmutable y final. Java también guarda un grupo de String en tiempo de ejecución, lo que convierte a String en una clase especial.
Beneficios de la inmutabilidad de la clase String
1. La agrupación de cadenas solo es posible cuando las cadenas son inmutables. La implementación del grupo de cadenas puede ahorrar mucho espacio de almacenamiento dinámico en tiempo de ejecución, porque diferentes variables de cadena apuntan a la misma cadena en el grupo. Pero si la cadena es variable, entonces la internación de cadenas no será posible (Nota del traductor: la internación de cadenas significa que solo se guarda una cadena diferente, es decir, no se guardarán varias cadenas idénticas), porque en este caso, si una variable cambia su valor, los valores de otras variables que apuntan a este valor también cambiarán.
2. Si la cadena es variable, provocará graves problemas de seguridad. Por ejemplo, el nombre de usuario y la contraseña de la base de datos se pasan como cadenas para obtener la conexión a la base de datos, o en la programación de sockets, el nombre del host y el puerto se pasan como cadenas. Debido a que una cadena es inmutable, su valor no se puede cambiar; de lo contrario, los piratas informáticos pueden aprovechar las lagunas y cambiar el valor del objeto al que apunta la cadena, provocando una vulnerabilidad de seguridad.
3. Debido a que las cadenas son inmutables, son seguras para múltiples subprocesos y varios subprocesos pueden compartir la misma instancia de cadena. Esto elimina la necesidad de utilizar la sincronización debido a problemas de seguridad de subprocesos. Las cadenas en sí son seguras para subprocesos.
4. Los cargadores de clases utilizan cadenas y la inmutabilidad proporciona seguridad para que se cargue la clase correcta. Por ejemplo, si desea cargar la clase java.sql.Connection y este valor se cambia a myhacked.Connection, causará daños desconocidos a su base de datos.
5. Debido a que la cadena es inmutable, el código hash se almacena en caché cuando se crea y no es necesario volver a calcularlo. Esto hace que las cadenas sean muy adecuadas como claves en Maps, y las cadenas se pueden procesar más rápido que otros objetos clave. Es por eso que las claves en HashMap suelen utilizar cadenas.
Lo anterior es mi resumen de los beneficios de la inmutabilidad de cadenas.