Saltar al contenido

Diferencia entre los métodos String trim() y strip() en Java 11

Investigamos en todo el mundo on line para así traerte la solución para tu inquietud, en caso de preguntas deja la pregunta y te respondemos porque estamos para servirte.

Solución:

En breve: strip() es la evolución “consciente de Unicode” de trim().

CSR: JDK-8200378

Problema

String::trim ha existido desde los primeros días de Java cuando Unicode no había evolucionado completamente al estándar que usamos ampliamente hoy en día.

La definición de espacio utilizada 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 los espacios en blanco de sangría o eliminar específicamente los espacios en blanco finales.

Solución

Introduzca métodos de recorte que tengan en cuenta los espacios en blanco de Unicode y proporcione un control adicional de solo el inicio o el 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 aclara qué definición de “espacio” se usa en el código. Con métodos de recorte adicionales en un futuro cercano que utilizan 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 sea 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 (en blanco) como cualquier punto de código que devuelva true
cuando se pasa al predicado Character::isWhitespace.

El método isWhitespace(char) fue añadido a Character con JDK 1.1, pero el método isWhitespace(int) no fue introducido a la Character clase hasta JDK 1.5. El último método (el que acepta un parámetro de tipo int) se agregó para admitir caracteres adicionales. Los comentarios de Javadoc para el Character la clase define caracteres complementarios (típicamente modelados con un “punto de código” basado en int) versus caracteres BMP (típicamente modelados con un solo carácter):

El conjunto de caracteres de U+0000 a U+FFFF a veces se denomina plano multilingüe básico (BMP). Los caracteres cuyos puntos de código son mayores que U+FFFF se denominan caracteres complementarios. La plataforma Java utiliza la representación UTF-16 en matrices de caracteres y en las clases String y StringBuffer. En esta representación, los caracteres complementarios se representan como un par de valores char… Por lo tanto, un valor char 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 complementarios. … Los métodos que aceptan un valor int admiten todos los caracteres Unicode, incluidos los caracteres complementarios.

Conjunto de cambios de OpenJDK.


Comparación comparativa entre trim() y strip() – ¿Por qué String.strip() es 5 veces más rápido que String.trim() para espacios en blanco? string En Java 11

Aquí hay una prueba unitaria que ilustra la respuesta de @MikhailKholodkov, usando Java 11.

(Tenga en cuenta que u2000 está arriba u0020 y no considerado 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 general, ambos métodos eliminan los espacios iniciales y finales de string. Sin embargo, la diferencia surge cuando trabajamos con caracteres Unicode o características multilingües.

trim() elimina todos los caracteres iniciales y finales cuyo valor ASCII es menor o igual a 32 (‘U+0020’ o espacio).

De acuerdo con los estándares Unicode, hay varios caracteres de espacio que tienen un valor ASCII superior a 32 (“U+0020”). Ej: 8193(U+2001).

Para identificar estos caracteres de espacio, se agregó el nuevo método isWhitespace(int) de Java 1.5 en la clase de caracteres. Este método utiliza Unicode para identificar caracteres de espacio. Puede leer más sobre los caracteres de espacio Unicode aquí.

Nueva tira de método que se agrega en java 11 use este método Character.isWhitespace(int) para cubrir una amplia gama de caracteres de espacio en blanco y eliminarlos.

ejemplo

public class StringTrimVsStripTest 
    public static void main(String[] args) 
        String string = 'u2001'+"String    with    space"+ 'u2001';
        System.out.println("Before: "" + string+""");
        System.out.println("After trim: "" + string.trim()+""");
        System.out.println("After strip: "" + string.strip()+""");
   

Producción

Before: "  String    with    space  "
After trim: " String    with    space "
After strip: "String    with    space"

Nota: Si está ejecutando en una máquina con Windows, es posible que no pueda ver una salida similar debido al conjunto limitado de Unicode. puede probar algunos compiladores en línea para probar este código.

referencia: Diferencia entre el método de recorte y eliminación java

Puntuaciones y reseñas

Tienes la posibilidad dar difusión a este post si si solucionó tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *