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

Entre autres changements, JDK 11 introduit 6 nouvelles méthodes pour java.lang.Classe de chaîne:

  • repeat(int) - répète la chaîne autant de fois que prévu 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 du fin
  • strip() - supprime l'espace blanc du début et de la fin de la chaîne

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

La Chaîne.strip(), String.stripLeading (), et String.stripTrailing() méthodes trim espace blanc [comme déterminé par caractère.isWhiteSpace()] off soit l'avant, arrière, ou à la fois avant et arrière de la cible Chaîne.

String.trim() Javadoc États:

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

, Qui est presque identique à la citation ci-dessus.

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

35
demandé sur nullpointer 2018-07-10 16:28:54

2 réponses

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

RSE: JDK-8200378

Problème

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

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

Les routines de coupe Unicode doivent utiliser Caractère:: isWhitespace (int).

De plus, les développeurs n'ont pas été en mesure de supprimer spécifiquement espace blanc d'indentation ou pour supprimer spécifiquement le blanc de fin espace.

Solution

Introduire des méthodes de rognage qui sont compatibles avec les espaces blancs Unicode et fournir un contrôle supplémentaire de conduite seulement ou de fuite seulement.

Une caractéristique commune de ces nouvelles méthodes est qu'ils utilisent une définition différente (plus récente) de "whitespace" que les anciennes méthodes telles que String.trim(). Bug JDK-8200373 .

Le JavaDoc courant pour String:: trim ne précise pas lequel la définition de "espace" est utilisée dans le code. Avec d'autres méthodes de coupe à venir dans un proche avenir qui utilisent un autre définition de l'espace, clarification est impérative. String:: trim utilise la définition de l'espace comme tout point de code inférieur ou égal à le point de code de caractère d'espace (\u0020.) Plus récentes méthodes de raccord sera utilisez la définition de l'espace (blanc) comme tout point de code qui renvoie true lorsqu'il est passé au caractère:: iswhitespace prédicat.

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 avant JDK 1.5. Cette dernière méthode (celle acceptant un paramètre de type int) a été ajoutée pour supporter des caractères supplémentaires. Les commentaires Javadoc pour la définition de la classe Character 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 des caractères de U+0000 à U+FFFF est parfois appelé comme le plan multilingue de base (BMP). Caractères dont le code pointe sont supérieurs à U + FFFF sont appelés caractères supplémentaires. Java la plate-forme utilise la représentation UTF-16 dans les tableaux de caractères et dans le Classes String et StringBuffer. Dans cette représentation, supplémentaire les caractères sont représentés sous la forme d'une paire de valeurs char ... Une valeur char, par conséquent, représente les points de code BMP (Basic Multilingual Plane, y compris les points de code de substitution, ou les unités de code de L'UTF-16 encodage. Une valeur int représente tous les points de code Unicode, y compris points de code supplémentaires. ... Les méthodes qui n'acceptent qu'un char la valeur ne peut pas prendre en charge les caractères supplémentaires. ... Les méthodes qui accepter une valeur int prendre en charge tous les caractères Unicode, y compris caractères supplémentaires.

, OpenJDK Révision.

36
répondu Mikhail Kholodkov 2018-07-10 20:43:58

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

(notez que \u2000 est au-dessus de \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());
    }
}
4
répondu Michael Easter 2018-08-31 10:40:33