1. StringTokenizer
clase
Y ahora algunos escenarios más comunes que implican trabajar con cadenas. ¿Cómo se divide una cadena en varias partes? Hay varias formas de hacer esto.
split()
método
La primera forma de dividir una cadena en varias partes es usar el split()
método. Se debe pasar como argumento una expresión regular que defina una cadena delimitadora especial. Aprenderá qué es una expresión regular en la búsqueda Java Multithreading .
Ejemplo:
Código | Resultado |
---|---|
|
El resultado será una matriz de tres cadenas:
|
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. Es difícil de leer y por lo tanto difícil de modificar.
StringTokenizer
clase
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 rompe toda la cadena en pedazos de una sola vez, sino que se mueve de principio a fin un paso a la vez.
La clase tiene un constructor y dos métodos importantes. Pasamos al constructor una cadena que dividimos en partes y una cadena compuesta por un conjunto de caracteres delimitadores.
Métodos | Descripción |
---|---|
|
Devuelve la siguiente subcadena |
|
Comprueba si hay más subcadenas. |
Esta clase recuerda de alguna manera a la clase Scanner, que también tiene nextLine()
y hasNextLine()
métodos.
Puede crear un StringTokenizer
objeto con este comando:
StringTokenizer name = new StringTokenizer(string, delimiters);
¿ Dónde string
se va a dividir la cuerda en partes? Y delimiters
es una cadena, y cada carácter que contiene se trata como un delimitador. Ejemplo:
Código | Salida de consola |
---|---|
|
|
Tenga en cuenta que cada carácter de la cadena que se pasa como la segunda cadena al StringTokenizer
constructor se considera un separador.
2. String.format()
método y StringFormatter
clase
Otro método interesante de la clase String es format()
.
Digamos que tiene varias variables almacenando datos. ¿Cómo los 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 |
---|---|
|
|
Su código probablemente se verá así:
Código de programa |
---|
|
Tal código no es muy legible. Y si los nombres de las variables fueran más largos, el código sería aún más difícil:
Código de programa |
---|
|
No es muy legible, ¿verdad?
Pero esta es una situación común en los programas del mundo real, así que quiero contarles una forma de escribir este código de manera más simple y concisa.
String.format
La clase String tiene un método estático format()
: le 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 |
---|---|
|
|
|
|
|
|
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 %d
y %s
) en los lugares donde necesita insertar datos.
El format()
método reemplaza estos %s
y %d
los especificadores de formato con los parámetros que siguen a la cadena de formato en la lista de parámetros. Si queremos insertar una cadena, entonces escribimos %s
. Si queremos insertar un número, entonces el especificador de formato es %d
. Ejemplo:
Código | Resultado |
---|---|
|
s es 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 |
---|---|
|
String |
|
entero: byte , short , int ,long |
|
número real: float ,double |
|
boolean |
|
char |
|
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 " " en lugar de " ". Ejemplo:%1$d
%d
Código | Resultado |
---|---|
|
s es igual a"a=13, b=12, c=11" |
%3$d
obtendrá el tercer argumento, %2$d
obtendrá el segundo argumento y %d
obtendrá el primer argumento. Los especificadores de formato %s
y %d
se refieren a argumentos independientemente de los especificadores como %3$d
o%2$s
3. Piscina de cuerdas
Cada cadena especificada en el código como un literal de cadena se almacena en un área de memoria llamada StringPool
mientras se ejecuta el programa. StringPool
es 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 objetos de cadena aparecen en el código.
En segundo lugar, 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 su código de clase, todos los literales de cadena se agregan a StringPool
si aún no están allí. Si ya están allí, simplemente usamos una referencia de cadena del archivo StringPool
.
En consecuencia, si asigna el mismo literal a varias String
variables 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 StringPool |
---|---|
|
|
Es por eso que las variables a
y b
almacenarán las mismas referencias.
intern()
método
Y la mejor parte es que puede agregar mediante programación cualquier cadena al archivo StringPool
. Para hacer esto, solo necesita llamar al método String
de la variable intern()
.
El intern()
método agregará la cadena a StringPool
si aún no está allí y devolverá una referencia a la cadena en el StringPool
.
Si se agregan dos cadenas idénticas usando StringPool
el intern()
método, el método devuelve la misma referencia. Esto se puede usar para comparar cadenas por referencia. Ejemplo:
Código | Nota |
---|---|
|
|
|
|
Es poco probable que utilice este método con frecuencia, pero a la gente le encanta preguntar al respecto en las entrevistas . Así que es mejor saberlo que no saberlo.
GO TO FULL VERSION