Java LanguageInstrumentos de cuerda


Introducción

Las cadenas ( java.lang.String ) son fragmentos de texto almacenados en su programa. Las cadenas no son un tipo de datos primitivo en Java , sin embargo, son muy comunes en los programas Java.

En Java, las cadenas son inmutables, lo que significa que no se pueden cambiar. (Haga clic aquí para obtener una explicación más detallada de la inmutabilidad.)

Observaciones

Como las cadenas de Java son inmutables , todos los métodos que manipulen una String devolverán un nuevo objeto de String . No cambian la String original. Esto incluye los métodos de subcadena y reemplazo que los programadores de C y C ++ esperan que muten el objeto String destino.


Utilice un StringBuilder lugar de String si desea concatenar más de dos objetos String cuyos valores no se pueden determinar en tiempo de compilación. Esta técnica es más eficaz que crear nuevos objetos String y concatenarlos porque StringBuilder es mutable.

StringBuffer también se puede utilizar para concatenar objetos String . Sin embargo, esta clase tiene menos rendimiento porque está diseñada para ser segura para subprocesos y adquiere un mutex antes de cada operación. Dado que casi nunca necesita seguridad para subprocesos al concatenar cadenas, es mejor usar StringBuilder .

Si puede expresar una concatenación de cadenas como una sola expresión, entonces es mejor usar el operador + . El compilador de Java convertirá una expresión que contenga + concatenaciones en una secuencia eficiente de operaciones usando String.concat(...) o StringBuilder . El consejo para usar StringBuilder solo se aplica explícitamente cuando la concatenación involucra expresiones múltiples.


No almacene información confidencial en cadenas. Si alguien puede obtener un volcado de memoria de su aplicación en ejecución, entonces podrá encontrar todos los objetos String existentes y leer su contenido. Esto incluye los objetos de String que son inalcanzables y están en espera de recolección de basura. Si esto es un problema, deberá borrar los datos confidenciales de las cadenas tan pronto como termine. No puedes hacer esto con objetos String ya que son inmutables. Por lo tanto, es recomendable utilizar un objeto char[] para contener datos de caracteres confidenciales y borrarlos (por ejemplo, sobrescribirlos con caracteres '\000' ) cuando haya terminado.


Todas las instancias de String se crean en el montón, incluso las instancias que corresponden a literales de cadena. Lo especial de los literales de cadena es que la JVM garantiza que todos los literales que son iguales (es decir, que constan de los mismos caracteres) estén representados por un solo objeto de String (este comportamiento se especifica en JLS). Esto es implementado por los cargadores de clases JVM. Cuando un cargador de clases carga una clase, explora los literales de cadena que se utilizan en la definición de la clase, cada vez que ve una, comprueba si ya existe un registro en el conjunto de cadenas para este literal (utilizando el literal como una clave) . Si ya existe una entrada para el literal, se usa la referencia a una instancia de String almacenada como el par para ese literal. De lo contrario, se crea una nueva instancia de String y se almacena una referencia a la instancia para el literal (utilizado como clave) en el conjunto de cadenas. (Véase también internado de cadena ).

El conjunto de cadenas se mantiene en el montón de Java y está sujeto a la recolección de elementos no utilizados normal.

Java SE 7

En las versiones de Java anteriores a Java 7, el grupo de cadenas se mantuvo en una parte especial del montón conocido como "PermGen". Esta parte solo fue recogida ocasionalmente.

Java SE 7

En Java 7, el grupo de cadenas se movió fuera de "PermGen".

Tenga en cuenta que los literales de cadena son implícitamente accesibles desde cualquier método que los use. Esto significa que los objetos String correspondientes solo se pueden recolectar si el código en sí es recolectado.


Hasta que Java 8, los objetos String se implementan como una matriz de caracteres UTF-16 (2 bytes por carácter). Hay una propuesta en Java 9 para implementar la String como una matriz de bytes con un campo de marca de codificación para observar si la cadena está codificada como bytes (LATIN-1) o caracteres (UTF-16).

Instrumentos de cuerda Ejemplos relacionados