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

En bref : strip() est l’évolution « Unicode-aware » de trim().

CSR : JDK-8200378

Problème

String::trim a existé dès les premiers jours de Java, lorsque Unicode n’avait pas complètement évolué vers le standard 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 espace (\u0020), communément appelé caractères de contrôle ASCII ou ISO.

Les routines de rognage conscientes d’Unicode devraient utiliser Character::isWhitespace(int).

En outre, les développeurs n’ont pas été en mesure de supprimer spécifiquement l’espace blanc d’indentation ou de supprimer spécifiquement l’espace blanc de fin.

Solution

Introduire des méthodes de rognage qui sont conscientes de l’espace blanc Unicode et fournissent un contrôle supplémentaire de l’avant seulement ou de l’arrière seulement.

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

La JavaDoc actuelle pour String::trim ne permet pas de savoir clairement quelle définition d' »espace » est utilisée dans le code. Avec des méthodes de rognage supplémentaires à venir dans un avenir proche qui utilisent une définition différente de l’espace, la 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 espace (\u0020.) Les méthodes de rognage plus récentes utiliseront la définition de l’espace (blanc) comme tout point de code qui renvoie vrai lorsqu’il est passé au prédicat Character::isWhitespace.

La méthode isWhitespace(char) a été ajoutée à Character avec le JDK 1.1, mais la méthode isWhitespace(int) n’a pas été introduite dans la classe Character avant le JDK 1.5. Cette dernière méthode (celle qui accepte un paramètre de type int) a été ajoutée pour prendre en charge les caractères supplémentaires. Les commentaires Javadoc de la classe Character définissent les caractères supplémentaires (typiquement modélisés par des « points de code » basés sur des int) par rapport aux caractères BMP (typiquement modélisés par un seul caractère) :

L’ensemble des caractères allant 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 BMP (Basic Multilingual Plane), y compris les points de code de substitution, ou les unités de code de l’encodage 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 char ne peuvent pas prendre en charge les caractères supplémentaires. … Les méthodes qui acceptent une valeur int supportent tous les caractères Unicode, y compris les caractères supplémentaires.

OpenJDK Changeset.

Comparaison des benchmarks entre trim() et strip() – Pourquoi String.strip() est 5 fois plus rapide que String.trim() pour une chaîne vide En Java 11

.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.