Diferencia entre los métodos String trim() y strip() en Java 11
java-11 (2)
Entre otros cambios, JDK 11 introduce 6 nuevos métodos para la clase java.lang.String:
-
repeat(int)
: repite la cadena tantas veces como lo proporciona el parámetroint
-
lines()
: utiliza un separador para proporcionar líneas desde la cadena fuente -
isBlank()
: indica si la cadena está vacía o solo contiene caracteres de espacio en blanco -
stripLeading()
: elimina el espacio en blanco desde el principio -
stripTrailing()
: elimina el espacio en blanco del final -
strip()
: elimina el espacio en blanco de ambos, el principio y el final de la cadena
En particular,
strip()
ve muy similar a
trim()
.
Según
este artículo
strip*()
métodos de la
strip*()
están diseñados para:
Los métodos String.strip (), String.stripLeading () y String.stripTrailing () recortan el espacio en blanco [según lo determinado por Character.isWhiteSpace ()] en la parte frontal, posterior o en la parte frontal y posterior de la cadena objetivo.
String.trim()
JavaDoc estados:
/**
* Returns a string whose value is this string, with any leading and trailing
* whitespace removed.
* ...
*/
Que es casi idéntica a la cita anterior.
¿Cuál es exactamente la diferencia entre
String.trim()
y
String.strip()
desde Java 11?
Aquí hay una prueba de unidad que ilustra la respuesta de @MikhailKholodkov, utilizando Java 11.
(Tenga en cuenta que
/u2000
está por encima de
/u0020
y no se considera espacio en blanco por
trim()
)
public class StringTestCase {
@Test
public void testSame() {
String s = "/t abc /n";
assertEquals("abc", s.trim());
assertEquals("abc", s.strip());
}
@Test
public void testDifferent() {
Character c = ''/u2000'';
String s = c + "abc" + c;
assertTrue(Character.isWhitespace(c));
assertEquals(s, s.trim());
assertEquals("abc", s.strip());
}
}
En resumen:
strip()
es la evolución de
trim()
"compatible con Unicode".
Problema
String :: trim ha existido desde los primeros días de Java cuando Unicode no había evolucionado completamente al estándar que utilizamos hoy en día.
La definición de espacio utilizado por String :: trim es cualquier punto de código menor o igual que el punto de código de espacio (/ u0020), comúnmente conocido como caracteres de control ASCII o ISO.
Las rutinas de recorte compatibles con Unicode deben usar Character :: isWhitespace (int).
Además, los desarrolladores no han podido eliminar específicamente el espacio en blanco de sangría o eliminar específicamente el espacio en blanco al final.
Solución
Introduzca métodos de recorte que tengan en cuenta el espacio en blanco de Unicode y proporcione un control adicional de solo al inicio o al final.
Una característica común de estos nuevos métodos es que usan una definición diferente (más nueva) de "espacio en blanco" que los métodos antiguos como
String.trim()
.
Error
JDK-8200373
.
El JavaDoc actual para String :: trim no deja claro qué definición de "espacio" se usa en el código. Con métodos de recorte adicionales que vienen en un futuro cercano que usan una definición diferente de espacio, la aclaración es imperativa. String :: trim usa la definición de espacio como cualquier punto de código que es menor o igual que el punto de código del carácter de espacio (/ u0020). Los métodos de recorte más nuevos usarán la definición de espacio (blanco) como cualquier punto de código que devuelva verdadero cuando se pasa al Carácter :: predicado del espacio en blanco.
El método
isWhitespace(char)
se agregó a
Character
con JDK 1.1, pero el método
isWhitespace(int)
no se introdujo en la clase
Character
hasta JDK 1.5.
El último método (el que acepta un parámetro de tipo
int
) se agregó para admitir caracteres suplementarios.
Los comentarios de Javadoc para la clase de
Character
definen caracteres complementarios (generalmente modelados con un "punto de código" basado en int) frente a caracteres BMP (típicamente modelados con un solo carácter):
El conjunto de caracteres de U + 0000 a U + FFFF a veces se conoce como el Plano Multilingüe Básico (BMP). Los caracteres cuyos puntos de código son mayores que U + FFFF se denominan caracteres suplementarios. La plataforma Java usa la representación UTF-16 en arrays de caracteres y en las clases String y StringBuffer. En esta representación, los caracteres suplementarios se representan como un par de valores char ... Un valor char, por lo tanto, representa puntos de código del plano multilingüe básico (BMP), incluidos los puntos de código sustitutos, o unidades de código de la codificación UTF-16. Un valor int representa todos los puntos de código Unicode, incluidos los puntos de código complementarios. ... Los métodos que solo aceptan un valor char no pueden admitir caracteres suplementarios. ... Los métodos que aceptan un valor int admiten todos los caracteres Unicode, incluidos los caracteres complementarios.
OpenJDK Changeset .
Comparación comparativa entre
trim()
y
strip()
-
¿Por qué String.strip () es 5 veces más rápido que String.trim () para una cadena en blanco en Java 11?