Différence entre les méthodes String trim () et strip () dans Java 11


104

Entre autres changements, JDK 11 introduit 6 nouvelles méthodes pour la classe java.lang.String:

  • repeat(int)- Répète la chaîne autant de fois que prévu par le intparamètre
  • lines() - Utilise un Spliterator pour fournir paresseusement des lignes à partir de la chaîne source
  • isBlank() - Indique si la chaîne est vide ou ne contient que des espaces blancs
  • stripLeading() - Supprime l'espace blanc du début
  • stripTrailing() - Supprime l'espace blanc de la fin
  • strip() - Supprime l'espace blanc à la fois, au début et à la fin de la chaîne

En particulier, strip()ressemble beaucoup à trim(). Selon cet article, les strip*() méthodes sont conçues pour:

Les méthodes String.strip (), String.stripLeading () et String.stripTrailing () réduisent l'espace blanc [tel que déterminé par Character.isWhiteSpace ()] sur l'avant, l'arrière ou à la fois avant et arrière de la chaîne ciblée.

String.trim() JavaDoc déclare:

/**
  * Returns a string whose value is this string, with any leading and trailing
  * whitespace removed.
  * ...
  */

Ce qui est presque identique à la citation ci-dessus.

Quelle est exactement la différence entre String.trim()et String.strip()depuis Java 11?

Réponses:


106

En bref: strip()est l'évolution "compatible Unicode" de trim().

CSR: JDK-8200378

Problème

String :: trim existe depuis les premiers jours de Java, lorsque Unicode n'avait pas complètement évolué vers la norme que nous utilisons largement aujourd'hui.

La définition de l'espace utilisée par String :: trim est tout point de code inférieur ou égal au point de code d'espace (\ u0020), communément appelé caractères de contrôle ASCII ou ISO.

Les routines de rognage compatibles Unicode doivent utiliser Character :: isWhitespace (int).

De plus, les développeurs n'ont pas été en mesure de supprimer spécifiquement les espaces blancs d'indentation ou de supprimer spécifiquement les espaces blancs de fin.

Solution

Introduisez des méthodes de rognage qui prennent en charge les espaces blancs Unicode et offrent un contrôle supplémentaire du début ou de la fin uniquement.

Une caractéristique commune de ces nouvelles méthodes est qu'elles utilisent une définition différente (plus récente) du terme «espace blanc» que les anciennes méthodes telles que String.trim(). Bogue JDK-8200373 .

Le JavaDoc actuel pour String :: trim n'indique pas clairement quelle définition de «espace» est utilisée dans le code. Avec des méthodes de rognage supplémentaires à venir qui utilisent une définition différente de l'espace, une clarification est impérative. String :: trim utilise la définition de l'espace comme tout point de code qui est inférieur ou égal au point de code du caractère d'espace (\ u0020.) Les nouvelles méthodes de rognage utiliseront la définition de l'espace (blanc) comme tout point de code qui retourne true lorsqu'il est passé au Prédicat Character :: isWhitespace.

La méthode a isWhitespace(char)été ajoutée Characteravec JDK 1.1, mais la méthode isWhitespace(int)n'a été introduite dans la Characterclasse qu'à partir du JDK 1.5. La dernière méthode (celle acceptant un paramètre de type int) a été ajoutée pour prendre en charge les caractères supplémentaires. Les commentaires Javadoc de la Characterclasse définissent des caractères supplémentaires (généralement modélisés avec un "point de code" basé sur int) par rapport aux caractères BMP (généralement modélisés avec un seul caractère):

L'ensemble de caractères de U + 0000 à U + FFFF est parfois appelé le plan multilingue de base (BMP). Les caractères dont les points de code sont supérieurs à U + FFFF sont appelés caractères supplémentaires. La plate-forme Java utilise la représentation UTF-16 dans les tableaux de caractères et dans les classes String et StringBuffer. Dans cette représentation, les caractères supplémentaires sont représentés par une paire de valeurs char ... Une valeur char représente donc les points de code du plan multilingue de base (BMP), y compris les points de code de substitution ou les unités de code du codage UTF-16. Une valeur int représente tous les points de code Unicode, y compris les points de code supplémentaires. ... Les méthodes qui n'acceptent qu'une valeur char ne peuvent pas prendre en charge les caractères supplémentaires. ... Les méthodes qui acceptent une valeur int prennent en charge tous les caractères Unicode, y compris les caractères supplémentaires.

Ensemble de modifications OpenJDK .


Comparaison de référence entre trim()et strip()- Pourquoi String.strip () est-il 5 fois plus rapide que String.trim () pour une chaîne vide en Java 11


6
Il est intéressant de noter que le symbole '\ u0000' n'est pas supprimé par bande, mais supprimé par coupe.
CHEM_Eugene

32

Voici un test unitaire qui illustre la réponse de @MikhailKholodkov, en utilisant Java 11.

(Notez que \u2000c'est ci-dessus \u0020et non considéré comme un espace blanc par 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());
    }
}

0

En général, les deux méthodes suppriment les espaces de début et de fin de la chaîne. Cependant, la différence vient lorsque nous travaillons avec des caractères unicode ou des fonctionnalités multilingues.

trim () supprime tous les caractères de début et de fin dont la valeur ASCII est inférieure ou égale à 32 ('U + 0020' ou espace).

Selon les normes Unicode, il existe différents caractères d'espacement dont la valeur ASCII est supérieure à 32 («U + 0020»). Ex: 8193 (U + 2001).

Pour identifier ces caractères d'espace, une nouvelle méthode isWhitespace (int) a été ajoutée à partir de Java 1.5 dans la classe Character. Cette méthode utilise unicode pour identifier les caractères d'espacement. Vous pouvez en savoir plus sur les caractères d'espacement Unicode ici .

La nouvelle bande de méthode qui est ajoutée dans java 11 utilise cette méthode Character.isWhitespace (int) pour couvrir une large gamme de caractères d'espace blanc et les supprimer.

exemple

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()+"\"");
   }
}

Production

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

Remarque: Si vous exécutez sur une machine Windows, vous ne pourrez peut-être pas voir la sortie similaire en raison d'un jeu Unicode limité. vous pouvez essayer des compilateurs en ligne pour tester ce code.

reference: Différence entre la méthode de coupe et de bande java

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.