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 à 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 depuis le 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 rogner l'espace blanc [tel que déterminé par le caractère.isWhiteSpace()] off soit l'avant, arrière, ou à la fois avant et arrière de la cible Chaîne.

String.trim() JavaDoc déclare:

/**
  * 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?

Author: nullpointer, 2018-07-10

2 answers

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

RSE: JDK-8200378

Problème

String:: trim existe depuis les débuts de Java lorsque 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 un point de code inférieur supérieur ou égal au point de code spatial (\u0020), communément appelé en tant que caractères de contrôle ASCII ou ISO.

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

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

Solution

Introduire des méthodes de rognage qui prennent en compte les espaces blancs Unicode et fournir un contrôle supplémentaire de leading uniquement ou de trailing uniquement.

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 actuel pour String:: trim ne précise pas lequel la définition d '"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 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 d'espace (blanc) comme tout point de code qui renvoie true lorsqu'il est passé au prédicat Character::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 avant JDK 1.5. Cette 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 pour la classe Character définissent 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 les points de code 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 Classes String et StringBuffer. Dans cette représentation, supplémentaire les caractères sont représentés par une paire de valeurs char ... Une valeur char, par conséquent, représente les points de code de base du plan multilingue (BMP), 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 caractère la valeur ne peut pas prendre en charge les caractères supplémentaires. ... Les méthodes qui accepter une valeur int prend en charge tous les caractères Unicode, y compris caractères supplémentaires.

, OpenJDK Révision.

 36
Author: 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
Author: Michael Easter, 2018-08-31 10:40:33