A String trim() és strip() metódusok közötti különbség a Java 11-ben

Röviden: strip() a trim() “Unicode-tudatos” evolúciója.

CSR : JDK-8200378

Problem

A String::trim már a Java korai napjaitól létezik, amikor a Unicode még nem fejlődött teljesen a ma széles körben használt szabványra.

A String::trim által használt szóköz definíciója minden olyan kódpont, amely kisebb vagy egyenlő a szóköz kódponttal (\u0020), amelyet általában ASCII vagy ISO vezérlő karaktereknek neveznek.

Az Unicode-tudatos trimmelési rutinoknak a Character::isWhitespace(int)-t kell használniuk.

A fejlesztők emellett nem voltak képesek kifejezetten eltávolítani a behúzási fehérteret vagy kifejezetten az utána lévő fehérteret.

megoldás

Bevezetni olyan trimmelési módszereket, amelyek ismerik a Unicode fehérteret, és további vezérlést biztosítanak arra, hogy csak az élen vagy csak a végén álljanak.

Az új módszerek közös jellemzője, hogy a “fehérteret” más (újabb) definíciót használnak, mint a régi módszerek, például a String.trim(). Bug JDK-8200373.

A String::trim jelenlegi JavaDoc-ja nem teszi egyértelművé, hogy a kódban a “szóköz” melyik definícióját használják. Mivel a közeljövőben további trimmelési módszerek jönnek, amelyek a szóköz más definícióját használják, a tisztázás elengedhetetlen. A String::trim a szóköz definícióját olyan kódpontként használja, amely kisebb vagy egyenlő a szóköz karakter kódpontjával (\u0020). Az újabb trimmelési módszerek a (fehér) szóköz definícióját olyan kódpontként fogják használni, amely a Character::isWhitespace predikátumnak átadva igazat ad vissza.

A isWhitespace(char) metódus a JDK 1.1-gyel került hozzá a Character osztályhoz, de a isWhitespace(int) metódus csak a JDK 1.5-ben került be a Character osztályba. Ez utóbbi (a int típusú paramétert elfogadó) metódus a kiegészítő karakterek támogatása érdekében került hozzá. A Character osztály Javadoc-kommentárjai definiálják a kiegészítő karaktereket (jellemzően int-alapú “kódponttal” modellezve) a BMP karakterekkel szemben (jellemzően egyetlen karakterrel modellezve):

Az U+0000 és U+FFFF közötti karakterek halmazát néha többnyelvű alapsíknak (BMP) nevezik. Azokat a karaktereket, amelyek kódpontjai az U+FFFF-nél nagyobbak, kiegészítő karaktereknek nevezzük. A Java platform az UTF-16 ábrázolást használja a char tömbökben, valamint a String és StringBuffer osztályokban. Ebben a reprezentációban a kiegészítő karakterek char értékek párjaként jelennek meg … Egy char-érték tehát a Basic Multilingual Plane (BMP) kódpontokat reprezentálja, beleértve az UTF-16 kódolás helyettesítő kódpontjait vagy kódegységeit is. Egy int érték az összes Unicode kódpontot képviseli, beleértve a kiegészítő kódpontokat is. … Azok a módszerek, amelyek csak char értéket fogadnak el, nem támogatják a kiegészítő karaktereket. … Az int értéket elfogadó metódusok támogatják az összes Unicode karaktert, beleértve a kiegészítő karaktereket is.

OpenJDK Changeset.

Benchmark összehasonlítás trim() és strip() között – Miért 5-ször gyorsabb a String.strip(), mint a String.trim() üres karakterlánc esetén In Java 11

.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.