La implementación de la substring(int beginIndex, int endIndex)
El método en JDK 6 es diferente del JDK 7. Esta publicación explica las diferencias. Por razones de simplicidad, el substring()
El método representa el substring(int beginIndex, int endIndex)
método en esta publicación.
1. ¿Qué subcadena () hace?
El método substring (int beginIndex, int endIndex) devuelve una cadena que comienza con beginIndex y termina con endIndex-1.
String x = "abcdef"; x = x.substring(1,3); System.out.println(x); |
Producción:
bc
2. ¿Qué sucede cuando se llama a la subcadena ()?
Es posible que sepa que debido a que x es inmutable, cuando a x se le asigna el resultado de x.substring (1,3), apunta a una nueva cadena como la siguiente:
Sin embargo, este diagrama no es exactamente correcto. Lo que sucede exactamente cuando se llama a substring () es diferente entre JDK 6 y JDK 7.
3. subcadena () en JDK 6
La cadena es compatible con una matriz de caracteres en el back-end. En JDK 6, la clase String contiene 3 campos: valor char[], int offset, int count. Se utilizan para almacenar una matriz de caracteres reales, el primer índice de la matriz, el número de caracteres de la cadena.
Cuando se llama al método substring (), crea una nueva cadena, pero el valor de la cadena aún apunta a la misma matriz en el montón. La diferencia entre las dos cadenas es su valor de recuento y desplazamiento.
El siguiente código está simplificado y solo contiene el punto clave para explicar este problema.
//JDK 6 String(int offset, int count, char value[]) { this.value = value; this.offset = offset; this.count = count; } public String substring(int beginIndex, int endIndex) { //check boundary return new String(offset + beginIndex, endIndex - beginIndex, value); } |
4. Un problema causado por la subcadena () en JDK 6
Si tiene una cadena MUY larga, pero solo necesita una pequeña parte cada vez mediante el uso de subcadena (). Esto causará un problema de rendimiento, ya que solo necesita una pequeña parte, se queda con todo. Para JDK 6, la solución usa lo siguiente, lo que hará que apunte a una subcadena real:
x = x.substring(x, y) + "" |
5. subcadena () en JDK 7
Esto se ha mejorado en JDK 7. En JDK 7, el método substring () realmente crea una nueva matriz en el montón.
//JDK 7 public String(char value[], int offset, int count) { //check boundary this.value = Arrays.copyOfRange(value, offset, offset + count); } public String substring(int beginIndex, int endIndex) { //check boundary int subLen = endIndex - beginIndex; return new String(value, beginIndex, subLen); } |
Las 10 preguntas principales sobre Java String.
Referencias:
1. Cambios en la subcadena
2. Java 6 vs Java 7 cuando la implementación importa