Funcionamiento interno de cadenas y el método de subcadena - 1

"¡Hola, amigo!"

"Hola, Ellie".

"Le hablaré sobre las subcadenas. Una subcadena es parte de una cadena. Y la operación más común realizada en cadenas (después de combinar varias cadenas juntas) es obtener una subcadena".

7) ¿Cómo obtengo parte de un String?

"El método de subcadena devuelve parte de una Cadena. Este método tiene dos versiones".

"La primera versión devuelve la subcadena especificada por los índices inicial y final. ¡Pero el carácter en el índice final no está incluido! Si pasa los números 1 y 3, la subcadena solo contendrá el segundo y tercer carácter (recuerde que los índices comienzan con 0)."

"La segunda versión devuelve la subcadena a partir del índice pasado hasta el final de la cadena".

Métodos) Ejemplo(s)
String substring(int beginIndex, int endIndex)
String s = "Good news, everyone!";
s = s.substring(1,6);
Resultado:

s == "ood n";
String substring(int beginIndex)
String s = "Good news, everyone!";
s = s.substring(1);

"Es bastante simple. Gracias, Ellie".

"También voy a explicarte el funcionamiento interno de los objetos String".

"Como probablemente ya sepa, String es una clase inmutable. ¿Y qué ventajas nos brinda eso? Da la casualidad de que una de las ventajas clave es la capacidad de obtener una subcadena. Pero lo primero es lo primero".

"Internamente, un objeto String contiene una matriz de caracteres, que no es tan difícil de adivinar. Pero también almacena dos variables más: el índice del primer carácter de la matriz y el número de caracteres. Ahora les diré cuáles son estos se utilizan para".

"Cuando creamos una subcadena usando el método de subcadena , se crea un nuevo objeto de cadena ".

"Pero, en lugar de almacenar una referencia a una nueva matriz de caracteres, el objeto almacena una referencia a la matriz anterior, así como dos variables que utiliza para determinar la parte de la matriz de caracteres original que está asociada con él".

"No entendí nada de eso".

"Cuando se crea una subcadena, la matriz de caracteres no se copia en el nuevo objeto String. En cambio, ambos objetos almacenan una referencia a la matriz de caracteres original. ¡Pero! El segundo objeto también almacena dos variables: su índice inicial en la matriz y el número de caracteres que pertenecen a la subcadena".

"Échale un vistazo:"

Obtener una subcadena Lo que se almacena dentro de la subcadena
String s = "mama";
Lo que está almacenado en s:

char[] value = {'m','a','m','a'};
offset = 0;
count = 4;
String s2 = s.substring(1);
Lo que está almacenado en s2:

char[] value = {'m','a','m','a'};
offset = 1;
count = 3;
String s3 = s.substring(1, 3);
Lo que está almacenado en s3:

char[] value = {'m','a','m','a'};
offset = 1;
count = 2;

"Las tres cadenas almacenan una referencia a la misma matriz de caracteres, pero también almacenan el índice del primer y último carácter que les pertenece. O, más exactamente, el índice del primer carácter y el recuento de caracteres".

"Eso tiene sentido ahora".

"Entonces, si toma una cadena que tiene 10 000 caracteres y crea 10 000 subcadenas de cualquier longitud, estas subcadenas usarán muy poca memoria, porque la matriz de caracteres no está duplicada. Estas cadenas, que esperaría usar mucho de espacio, literalmente solo tomará un par de bytes".

"¡Fresco!"

"¿Pero podrías hacer eso si pudieras modificar Strings?"

"No, alguien podría cambiar la primera Cadena, y luego todas sus subcadenas también cambiarían. Ahora tiene sentido por qué lo hicieron. Esa es una solución realmente genial".

"Me alegra que te guste."