Diferența dintre metodele String trim() și strip() în Java 11

În concluzie: strip() este o evoluție „Unicode-aware” a lui trim().

CSR : JDK-8200378

Problema

String::trim a existat încă din primele zile ale Java, când Unicode nu evoluase complet la standardul pe care îl folosim pe scară largă astăzi.

Definiția spațiului folosită de String::trim este orice punct de cod mai mic sau egal cu punctul de cod spațiu (\u0020), denumit în mod obișnuit caractere de control ASCII sau ISO.

Rutinele de tăiere compatibile cu Unicode ar trebui să folosească Character::isWhitespace(int).

În mod tradițional, dezvoltatorii nu au fost capabili să elimine în mod specific spațiul alb din indentare sau să elimine în mod specific spațiul alb din urmă.

Soluție

Introduceți metode de tăiere care sunt conștiente de spațiile albe Unicode și care oferă un control suplimentar pentru numai la început sau numai la sfârșit.

O caracteristică comună a acestor noi metode este că ele folosesc o definiție diferită (mai nouă) a „spațiului alb” decât o făceau vechile metode, cum ar fi String.trim(). Bug JDK-8200373.

Actualul JavaDoc pentru String::trim nu clarifică ce definiție de „spațiu” este folosită în cod. Având în vedere că în viitorul apropiat vor apărea metode suplimentare de tăiere care utilizează o definiție diferită a spațiului, clarificarea este imperativă. String::trim utilizează definiția spațiului ca fiind orice punct de cod care este mai mic sau egal cu punctul de cod al caracterului spațiu (\u0020.) Metodele de tăiere mai noi vor utiliza definiția spațiului (alb) ca fiind orice punct de cod care returnează true atunci când este trecut la predicatul Character::isWhitespace.

Metoda isWhitespace(char) a fost adăugată la Character cu JDK 1.1, dar metoda isWhitespace(int) nu a fost introdusă în clasa Character până la JDK 1.5. Cea din urmă metodă (cea care acceptă un parametru de tip int) a fost adăugată pentru a suporta caractere suplimentare. Comentariile Javadoc pentru clasa Character definesc caracterele suplimentare (de obicei modelate cu „puncte de cod” bazate pe int) față de caracterele BMP (de obicei modelate cu un singur caracter):

Setul de caractere de la U+0000 la U+FFFF este uneori denumit Planul multilingv de bază (BMP). Caracterele ale căror puncte de cod sunt mai mari decât U+FFFF se numesc caractere suplimentare. Platforma Java utilizează reprezentarea UTF-16 în array-urile de caractere și în clasele String și StringBuffer. În această reprezentare, caracterele suplimentare sunt reprezentate ca o pereche de valori char … Prin urmare, o valoare char reprezintă punctele de cod BMP (Basic Multilingual Plane), inclusiv punctele de cod surogat, sau unitățile de cod ale codificării UTF-16. O valoare int reprezintă toate punctele de cod Unicode, inclusiv punctele de cod suplimentare. … Metodele care acceptă doar o valoare char nu pot suporta caractere suplimentare. … Metodele care acceptă o valoare int suportă toate caracterele Unicode, inclusiv caracterele suplimentare.

OpenJDK Changeset.

Comparație de referință între trim() și strip() – De ce este String.strip() de 5 ori mai rapidă decât String.trim() pentru un șir gol în Java 11

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.