Differenza tra i metodi String trim() e strip() in Java 11

In breve: strip() è l’evoluzione “Unicode-aware” di trim().

CSR : JDK-8200378

Problema

String::trim esiste dai primi giorni di Java quando Unicode non era completamente evoluto allo standard che usiamo oggi.

La definizione di spazio usata da String::trim è qualsiasi punto di codice minore o uguale al punto di codice spazio (\u0020), comunemente indicato come ASCII o caratteri di controllo ISO.

Le routine di trimming sensibili all’Unicode dovrebbero usare Character::isWhitespace(int).

Inoltre, gli sviluppatori non sono stati in grado di rimuovere specificamente gli spazi bianchi di indentazione o di rimuovere specificamente gli spazi bianchi di coda.

Soluzione

Introdurre metodi di trimming che sono consapevoli dello spazio bianco Unicode e forniscono un controllo aggiuntivo di solo leading o solo trailing.

Una caratteristica comune di questi nuovi metodi è che usano una diversa (più nuova) definizione di “spazio bianco” rispetto ai vecchi metodi come String.trim(). Bug JDK-8200373.

L’attuale JavaDoc per String::trim non chiarisce quale definizione di “spazio” viene usata nel codice. Con ulteriori metodi di trimming in arrivo nel prossimo futuro che usano una diversa definizione di spazio, il chiarimento è imperativo. String::trim usa la definizione di spazio come qualsiasi punto di codice che sia minore o uguale al punto di codice del carattere spazio (\u0020.) I nuovi metodi di taglio useranno la definizione di spazio (bianco) come qualsiasi punto di codice che restituisce true quando viene passato al predicato Character::isWhitespace.

Il metodo isWhitespace(char) è stato aggiunto a Character con JDK 1.1, ma il metodo isWhitespace(int) non è stato introdotto nella classe Character fino a JDK 1.5. Quest’ultimo metodo (quello che accetta un parametro di tipo int) è stato aggiunto per supportare i caratteri supplementari. I commenti Javadoc per la classe Character definiscono i caratteri supplementari (tipicamente modellati con “code point” basati su int) rispetto ai caratteri BMP (tipicamente modellati con carattere singolo):

L’insieme di caratteri da U+0000 a U+FFFF è talvolta indicato come il piano multilingue di base (BMP). I caratteri i cui punti di codice sono maggiori di U+FFFF sono chiamati caratteri supplementari. La piattaforma Java usa la rappresentazione UTF-16 negli array di caratteri e nelle classi String e StringBuffer. In questa rappresentazione, i caratteri supplementari sono rappresentati come una coppia di valori char … Un valore char, quindi, rappresenta i punti di codice Basic Multilingual Plane (BMP), compresi i punti di codice surrogati, o unità di codice della codifica UTF-16. Un valore int rappresenta tutti i punti di codice Unicode, compresi i punti di codice supplementari. … I metodi che accettano solo un valore char non possono supportare i caratteri supplementari. … I metodi che accettano un valore int supportano tutti i caratteri Unicode, compresi i caratteri supplementari.

OpenJDK Changeset.

Confronto benchmark tra trim() e strip() – Perché String.strip() è 5 volte più veloce di String.trim() per stringa vuota In Java 11

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.