179 votes

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

Parmi les autres changements, JDK 11 lance 6 nouvelles méthodes pour java.lang.Classe String:

  • repeat(int) - Répète la Corde autant de fois que fourni par l' int paramètre
  • lines() - Utilise un Spliterator paresseusement fournir des lignes à partir de la source de la chaîne
  • isBlank() - Indique si la Chaîne est vide ou ne contient que des caractères d'espace blanc
  • stripLeading() - Permet de supprimer l'espace blanc à partir de début
  • stripTrailing() - Permet de supprimer l'espace blanc à partir de la fin
  • strip() - Permet de supprimer l'espace blanc à partir de deux, début et fin de chaîne

En particulier, strip() ressemble très fort à trim(). Selon cet article, strip*() méthodes visent à:

La Chaîne De Caractères.strip(), String.stripLeading () et String.stripTrailing() les méthodes de garniture espace blanc [tel que déterminé par le Personnage.isWhiteSpace()] désactiver l'avant, l'arrière ou à l'avant et à l'arrière de l'objectif Chaîne de caractères.

String.trim() JavaDoc états:

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

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

Qu'est-ce exactement la différence entre String.trim() et String.strip() depuis Java 11?

187voto

Mikhail Kholodkov Points 3238

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

LA RSE : JDK-8200378

Problème

String::trim a existé dès les premiers jours de Java lors de l'Unicode n'avait pas évolué à la norme, nous avons largement utilisé aujourd'hui.

La définition de l'espace utilisé par la Chaîne de caractères::trim est à tout point de code moins égale ou supérieure à l'espace de point de code (\u0020), communément appelée ASCII ou ISO caractères de contrôle.

Unicode parage des routines doivent utiliser Personnage::isWhitespace(int).

En outre, les développeurs n'ont pas été en mesure d'éliminer spécifiquement l'indentation espace blanc ou de supprimer fuite des blancs de l'espace.

Solution

Introduire des méthodes de raccord qui sont en Unicode espace blanc au courant et de fournir un contrôle supplémentaire de conduire uniquement à droite ou à gauche seulement.

Une caractéristique commune de ces nouvelles méthodes est qu'ils utilisent un autre (plus récente) de la définition de "espace" que faisaient les anciennes méthodes telles que l' String.trim(). Bug JDK-8200373.

L'actuel JavaDoc de String::trim ne précise pas qui définition de "l'espace" est utilisé dans le code. Avec d'autres méthodes de raccord à venir dans un avenir proche qui utilisent une autre définition de l'espace, la clarification est impératif. String::trim utilise la définition de l'espace comme tout codepoint qui est inférieure ou égale à le caractère espace codepoint (\u0020.) Nouveaux parage des méthodes de utiliser la définition de (blanc) de l'espace comme tout codepoint qui retourne true lorsqu'il est passé au Personnage::isWhitespace prédicat.

La méthode isWhitespace(char) a été ajouté à l' Character avec le JDK 1.1, mais la méthode isWhitespace(int) n'a pas été introduit à l' Character classe jusqu'à la JDK 1.5. La méthode de ce dernier (l'un acceptant un paramètre de type int) a été ajoutée à l'appui de caractères supplémentaires. Les commentaires Javadoc pour l' Character classe de définir des caractères supplémentaires (généralement modélisés avec des int à base de "code") par rapport BMP caractères (généralement modélisé avec un seul caractère):

Le jeu de caractères à partir de U+0000 à U+FFFF est parfois appelé comme le Basic Multilingual Plane (BMP). Des personnages dont les points de code sont plus grand que U+FFFF sont appelés des caractères supplémentaires. La Java plate-forme utilise la représentation UTF-16 dans des tableaux de char et dans le String et StringBuffer classes. Dans cette représentation, complémentaire les personnages sont représentés comme une paire de char valeurs ... Un char de la valeur, par conséquent, représente Basic Multilingual Plane (BMP) de points de code, y compris la substitution des points de code, ou code des unités de l'UTF-16 l'encodage. Une valeur int représente tous les points de code Unicode, y compris code complémentaire des points. ... Les méthodes qui n'acceptent qu'un char la valeur ne peut pas en charge les caractères supplémentaires. ... Les méthodes qui accepter une valeur int soutien de tous les caractères Unicode, y compris les caractères supplémentaires.

OpenJDK Ensemble De Modifications.


La comparaison entre trim() et strip() - Pourquoi est-Chaîne.strip() 5 fois plus rapide que la Chaîne.trim() pour la chaîne vide En Java 11

53voto

Michael Easter Points 7482

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X