web-dev-qa-db-fra.com

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

Parmi d'autres modifications, 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 fournie par le paramètre int
  • lines() - Utilise un Spliterator pour fournir paresseusement des lignes de la chaîne source
  • isBlank() - Indique si la chaîne est vide ou ne contient que des espaces
  • stripLeading() - Supprime l'espace blanc du début
  • stripTrailing() - Supprime l'espace blanc de la fin
  • strip() - Supprime l'espace blanc des débuts et des fins de chaîne

strip() est très similaire à trim(). Selon cet articlestrip*() les méthodes sont conçues pour:

Les méthodes String.strip (), String.stripLeading () et String.stripTrailing () réduisent les espaces [comme déterminé par Character.isWhiteSpace ()] devant, derrière ou les deux côtés de la chaîne cible.

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?

72
Mikhail Kholodkov

En bref: strip() est une évolution "Unicode-aware" de trim().

CSR: JDK-8200378

Problème

String :: trim existe depuis les débuts de Java, alors qu'Unicode n'avait pas complètement évolué pour devenir le standard que nous utilisons couramment 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é ASCII ou caractères de contrôle ISO.

Les routines de découpage compatibles avec Unicode doivent utiliser Character :: isWhitespace (int).

En outre, les développeurs n'ont pas été en mesure de supprimer spécifiquement les espaces blancs d'indentation ni spécifiquement les espaces de fin.

Solution

Introduisez des méthodes de rognage qui prennent en compte les espaces blancs Unicode et fournissez un contrôle supplémentaire sur le mien ou le fin.

Une caractéristique commune de ces nouvelles méthodes est qu’elles utilisent une définition (plus récente) du terme "espace" par rapport aux anciennes méthodes telles que String.trim(). Bug JDK-820037 .

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 dans un avenir proche 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 inférieur ou égal au caractère de code (\ u0020). Les méthodes de rognage les plus récentes utilisent la définition de l'espace (blanc) comme tout point de code renvoyant la valeur true lorsqu'il est passé à la Caractère :: Prédicat isWhitespace.

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

L'ensemble de caractères de U + 0000 à U + FFFF est parfois appelé plan multilingue de base (BMP). Les caractères dont les points de code sont supérieurs à U + FFFF sont appelés des caractères supplémentaires. La plateforme 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 de caractères ... Une valeur de caractères représente donc les points de code BMP (Basic Multilingual Plane), 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 acceptent uniquement une valeur de caractère ne peuvent pas prendre en charge des 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.

OpenJDK Changeset .


Comparaison de benchmark entre trim() et strip() - Pourquoi String.strip () est 5 fois plus rapide que String.trim () pour une chaîne vide In Java 11

73
Mikhail Kholodkov

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

(Notez que \u2000 est supérieur à _\u0020_ et n'est pas considéré comme un espace 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());
    }
}
_
18
Michael Easter