Fragmento de una conferencia con un mentor como parte del curso de Codegym University. Inscríbete al curso completo.


"¡Hola, amigo! Hoy analizaremos algunos escenarios más comunes relacionados con el trabajo con cadenas. Por ejemplo, ¿sabe cómo dividir una cadena en varias partes?"

"No te lo voy a decir de inmediato, Ellie. Pero me lo vas a decir a mí, ¿verdad?"

split()método

"Hay varias formas de hacer esto. La primera forma de dividir una cadena en varias partes es usar el split()método. Una expresión regular que define una cadena delimitadora especial debe pasarse como parámetro. Aprenderá en qué consiste una expresión regular la búsqueda de colecciones de Java .

Ejemplo:

Código Resultado
String str = "Good news everyone!";
String[] strings = str.split("ne");
System.out.println(Arrays.toString(strings));
El resultado será una matriz de tres cadenas:
["Good ", "ws everyo", "!"]

Simple, pero a veces este enfoque es excesivo. Si hay muchos delimitadores (por ejemplo, espacios, caracteres de nueva línea, tabulaciones, puntos), entonces debe construir una expresión regular bastante compleja".

"Bueno, seguro. Y si es difícil de leer, entonces es difícil hacer cambios.

StringTokenizerclase

Fragmento de una conferencia con un mentor como parte del curso de Codegym University. Inscríbete al curso completo.


"Java tiene una clase especial cuyo trabajo completo es dividir una cadena en subcadenas.

"Esta clase no usa expresiones regulares: en su lugar, simplemente pasa una cadena que consta de delimitadores. La ventaja de este enfoque es que no divide la cadena completa en partes de una sola vez, sino que se mueve de principio a fin una paso a la vez.

La clase tiene un constructor y dos métodos. Pasamos al constructor una cadena que dividimos en partes y una cadena compuesta por un conjunto de caracteres delimitadores.

Métodos Descripción
String nextToken()
Devuelve la siguiente subcadena
boolean hasMoreTokens()
Comprueba si hay más subcadenas.

"Esta clase de alguna manera me recuerda a la clase Scanner, que también tiene nextLine()métodos hashNextLine().

"Esa es una buena observación que has hecho. Puedes crear un StringTokenizerobjeto con este comando:

StringTokenizer name = new StringTokenizer(string, delimiters);

Donde cadena es la cadena a dividir en partes. Y delimitadores es una cadena, y cada carácter que contiene se trata como un delimitador. Ejemplo:

Código Salida de consola
String str = "Good news everyone!";

StringTokenizer tokenizer = new StringTokenizer(str,"ne");
while (tokenizer.hasMoreTokens())
{
   String token = tokenizer.nextToken();
   System.out.println(token);
}
Good 
ws 
v
ryo
!

"Tenga en cuenta que cada carácter de la cadena que se pasa en la segunda cadena al StringTokenizerconstructor se considera un separador.

String.format()método y StringFormatterclase

"Otro método interesante de la clase String es format().

"Digamos que tiene varias variables almacenando datos. ¿Cómo las muestra en la pantalla en una línea? Por ejemplo, tenemos algunos datos (columna izquierda) y el resultado deseado (columna derecha):

Código Salida de consola
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;
User = {name: Amigo, age: 12 years, friend: Diego, weight: 200 kg.}

El código para dicho programa se verá así:

Código de programa
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;

System.out.println("User = {name: " + name + ", age:" + age + " years, friend: " + friend+", weight: " + weight + " kg.}");

"Estarás de acuerdo conmigo en que el código no es muy legible. Y si los nombres de las variables fueran más largos, el código se volvería aún más difícil:

Código de programa
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;

System.out.println("User = {name: " + user.getName() + ", age:" + user.getAge() + " years, friend: " + user.getFriends().get(0) + ", weight: " + user.getExtraInformation().getWeight() + " kg.}");

"¡Sí, es una lectura difícil!"

"No te preocupes. Esta es una situación común en los programas del mundo real, así que quiero contarte una forma de escribir este código de manera más simple y concisa.

String.format

"La Stringclase tiene un método estático format(): te permite especificar un patrón para ensamblar una cadena con datos. La apariencia general del comando es la siguiente:

String name = String.format(pattern, parameters);

Ejemplo:

Código Resultado
String.format("Age=%d, Name=%s", age, name);
Age=12, Name=Amigo
String.format("Width=%d, Height=%d", width, height);
Width=20, Height=10
String.format("Fullname=%s", name);
Fullname=Diego

"El format()primer parámetro del método es una cadena de formato que contiene todo el texto deseado junto con caracteres especiales llamados especificadores de formato (como %dy %s) en los lugares donde necesita insertar datos.

"El format()método reemplaza estos especificadores %sde %dformato con los parámetros que siguen a la cadena de formato en la lista de parámetros. Si queremos insertar una cadena, escribimos . %sSi queremos insertar un número, entonces el especificador de formato es %d. Ejemplo:

Código Resultado
String s = String.format("a=%d, b=%d, c=%d", 1, 4, 3);
ses igual a"a=1, b=4, c=3"

"Aquí hay una breve lista de especificadores de formato que se pueden usar dentro de la cadena de formato:

especificador Significado
%s
String
%d
entero: byte, short, int,long
%f
número real: float,double
%b
boolean
%c
char
%t
Date
%%
%personaje

"Estos especificadores indican el tipo de datos, pero también hay especificadores que indican el orden de los datos. Para obtener un argumento por su número (la numeración comienza desde uno), debe escribir " % 1$ d " en lugar de " %d ". Ejemplo:

Código Resultado
String s = String.format("a=%3$d, b=%2$d, c=%d", 11, 12, 13);
ses igual a"a=13, b=12, c=11"

%3$dobtendrá el tercer argumento, %2$dobtendrá el segundo argumento y %dobtendrá el primer argumento. Los especificadores de formato %sy %dse refieren a argumentos independientemente de los especificadores como %3$do%2$s

Grupo de cuerdas

"Cada cadena especificada en el código como un literal de cadena se almacena en un área de memoria llamada StringPoolmientras se ejecuta el programa. StringPoolEs una matriz especial para almacenar cadenas. Su propósito es optimizar el almacenamiento de cadenas:

"Primero, las cadenas especificadas en el código deben almacenarse en algún lugar, ¿verdad? El código consta de comandos, pero los datos (especialmente, las cadenas grandes) deben almacenarse en la memoria por separado del código. Solo las referencias a los objetos de cadena aparecen en el código.

"Segundo, todos los literales de cadena idénticos deben almacenarse en la memoria solo una vez. Y así es como funciona. Cuando la máquina Java carga el código de su clase, todos los literales de cadena se agregan al si aún no están allí. Si StringPoolestán ya está allí, entonces simplemente usamos una referencia de cadena del archivo StringPool.

En consecuencia, si asigna el mismo literal a varias variables de cadena en su código, estas variables contendrán la misma referencia. Se agregará un literal a la StringPoolúnica vez. En todos los demás casos, el código obtendrá una referencia a la cadena ya cargada en el archivo StringPool.

Así es más o menos cómo funciona:

Código Trabajando con StringPoll
String a = "Hello";
String b = "Hello";
String c = "Bye";
String[] pool = {"Hello", "Bye"};
a = pool[0];
b = pool[0];
c = pool[1];

"Es por eso que las variables ay balmacenarán las mismas referencias".

"Espero haberlo entendido todo correctamente.

intern()método.

"Y la mejor parte es que puede agregar mediante programación cualquier cadena al StringPool. Para hacer esto, solo necesita llamar al método Stringde la variable .intern()

"El intern()método agregará la cadena a StringPoolsi aún no está allí, y devolverá una referencia a la cadena en el StringPool.

"¿Y qué sucederá si se agregan dos cadenas idénticas usando StringPoolel intern()método?"

"El método devolverá las mismas referencias. Esto se puede usar para comparar cadenas por referencia. Ejemplo:

Código Nota
String a = new String("Hello");
String b = new String("Hello");
System.out.println(a == b);


false
String a = new String("Hello");
String b = new String("Hello");

String t1 = a.intern();
String t2 = b.intern();
System.out.println(a == b);
System.out.println(t1 == t2);





false
true

Es poco probable que utilice este método con frecuencia. Dicho esto, a la gente le gusta preguntar al respecto en las entrevistas de trabajo.

"Entonces, es mejor saberlo que no saberlo. ¡Gracias, Ellie!"