2010-08-04 18 views
17

Una vez que estudié sobre la ventaja de una cadena que es inmutable debido a algo para mejorar el rendimiento en la memoria.¿Cuál es la ventaja de que una cadena sea inmutable?

¿Alguien me puede explicar esto? No puedo encontrarlo en internet

+1

posible duplicado de [¿Qué se entiende por inmutable?] (Http://stackoverflow.com/questions/279507/what-is-meant-by-immutable). Si bien el título de esa pregunta no es el mismo, incluye una pregunta sobre ventajas y desventajas, que al menos una de las respuestas (por Imagist) cubre bastante bien. –

Respuesta

5

Las cadenas inmutables son baratas de copiar, porque no es necesario copiar todos los datos, solo copie una referencia o un puntero a los datos.

Las clases inmutables de cualquier tipo son más fáciles de trabajar en varios subprocesos, la única sincronización necesaria es la destrucción.

9

Considere la alternativa. Java no tiene calificador const. Si los objetos String fueran mutables, cualquier método al que le pase una referencia a una cadena podría tener el efecto secundario de modificar la cadena. Las cadenas inmutables eliminan la necesidad de copias defensivas y reducen el riesgo de error del programa.

34

inmutabilidad (para cuerdas u otros tipos) puede tener numerosas ventajas:

  • que hace que sea más fácil para razonar sobre el código, ya que se puede hacer suposiciones acerca de variables y argumentos que no se puede de otro modo hacer.
  • Simplifica la programación multiproceso ya que la lectura de un tipo que no puede cambiar es siempre seguro de hacer al mismo tiempo.
  • Permite reducir el uso de la memoria al permitir combinar valores idénticos y hacer referencia a ellos desde múltiples ubicaciones. Tanto Java como C# realizan una secuencia de cadenas para reducir el costo de memoria de cadenas literales incrustadas en el código.
  • Simplifica el diseño y la implementación de ciertos algoritmos (como los que emplean partición de retroceso o partición de espacio de valor) porque el estado previamente calculado se puede reutilizar más adelante.
  • La inmutabilidad es un principio fundamental en muchos lenguajes de programación funcionales: permite ver el código como una serie de transformaciones de una representación a otra, en lugar de una secuencia de mutaciones.

Las cadenas inmutables también ayudan a evitar la tentación de usar cadenas como búferes. Muchos defectos en los programas C/C++ se relacionan con los problemas de desbordamiento del búfer que resultan del uso de matrices de caracteres desnudos para componer o modificar valores de cadena. El tratamiento de cadenas como tipos mutables fomenta el uso de tipos más adecuados para la manipulación de búferes (consulte StringBuilder en .NET o Java).

+1

Pero si utiliza un paradigma [Copiar en la escritura] (http://en.wikipedia.org/wiki/Copy-on-write), tiene las ventajas de cadenas inmutables * y * copias privadas y en contexto modificación, si es necesario, por ejemplo para un análisis rápido 'StringBuilder' es solo una solución para ralentizar la concatenación de cadenas inmutables, y de poco beneficio con respecto al patrón COW asociado con un sistema eficiente de gestión de montones. COW puede permitir que tu acceso a la memoria intermedia sea seguro * y * rápido al mismo tiempo. –

+0

Varios de esos argumentos parecen confundir los parámetros "const" (lo mismo que Java "final") con la inmutabilidad de los objetos referidos. –

+0

@LBushkin, aunque hagas algunos buenos argumentos en tus viñetas, tu párrafo "Las cuerdas inmutables también ayudan a evitar ..." es engañoso. StringBuilder resuelve un problema completamente diferente que la anulación de búfer en C: solo se trata de optimización para la concatenación de cadenas, porque la concatenación de cadenas inmutables es lenta; es necesario crear dos objetos nuevos y copiar todos los caracteres para cada paso de concatenación. – Alexey

0

Piensa en varias cadenas que se sientan en un fondo común. Las variables de cadena apuntan a ubicaciones en el grupo. Si copia una variable de cadena, tanto original como copian comparten los mismos caracteres. Esta eficacia de compartir compensa la ineficacia de la edición de cadenas mediante la extracción de subcadenas y la concatenación.

0

a) Imagine la instalación de StringPool sin hacer que la cadena sea inmutable, no es posible en absoluto porque en el caso de un grupo de cadenas un objeto de cadena/literal, p. "Prueba" ha sido referenciada por muchas variables de referencia, por lo que si cualquiera de ellas cambia el valor, otras se verán afectadas automáticamente, digamos Cadena A = "Prueba" y Cadena B = "Prueba" Ahora Cadena B llamada "Prueba" .toUpperCase() que cambia el mismo objeto en "TEST", por lo que A también será "TEST", lo que no es deseable.
b) Otra razón por la cual Why String es inmutable en Java es permitir que String almacene en caché su código hash, siendo inmutable String en Java almacena en caché su código hash y no calcula cada vez que llamamos el método hashcode de String, lo cual hace que sea muy rápido clave hashmap.

0

Tal vez, mi respuesta es obsoleta, pero probablemente alguien encuentre aquí una nueva información.

Por qué String de Java es inmutable y por qué es bueno:

  • puede compartir una cuerda entre hilos y estar seguro de que nadie de ellos va a cambiar la cadena y confundir otro hilo
  • no lo hace necesito un candado Varios hilos pueden trabajar con cadenas inmutables sin conflictos
  • si acaba de recibir una cadena, puede estar seguro de que nadie cambiará su valor después de eso
  • puede tener muchos duplicados de cadenas: se señalarán a una sola instancia, a solo una copia. Esto ahorra memoria de la computadora (RAM)
  • puede hacer una subcadena sin copiar, - creando un puntero al elemento de una cadena existente. Esta es la razón de Java ejecución de la operación subcadena es tan rápido
  • cadenas inmutables (objetos) son mucho más adecuados para utilizarlos como clave en tablas hash
0

Fundamentalmente, si un objeto o método deseos para pasar información a otro , hay algunas formas en que puede hacerlo:

  1. se puede dar una referencia a un objeto mutable que contiene la información, y que el receptor promete no volver a modificar.

  2. Puede hacer referencia a un objeto que contiene los datos, pero cuyo contenido no le importa.

  3. Puede almacenar la información en un objeto mutable que el destinatario de datos previsto conoce (generalmente uno proporcionado por ese destinatario de datos).

  4. Puede devolver una referencia a un objeto inmutable que contenga la información.

De estos métodos, el # 4 es de lejos el más fácil. En muchos casos, los objetos mutables son más fáciles de trabajar que los inmutables, pero, no hay una forma fácil de compartir con el código "no confiable" la información que está en un objeto mutable sin tener que copiar primero la información a otra cosa. Por el contrario, la información contenida en un objeto inmutable del que se tiene una referencia se puede compartir fácilmente simplemente compartiendo una copia de esa referencia.

Cuestiones relacionadas