Rozdíl mezi metodami String trim() a strip() v Javě 11

Zkrátka: strip() je „Unicode-aware“ evoluce trim().

CSR : JDK-8200378

Problém

String::trim existoval již v počátcích Javy, kdy Unicode ještě nebyl plně vyvinut do podoby standardu, který dnes běžně používáme.

Definice mezery, kterou String::trim používá, je jakýkoli kódový bod menší nebo roven kódovému bodu mezera (\u0020), běžně označovaný jako řídicí znaky ASCII nebo ISO.

Ořezávací rutiny podporující Unicode by měly používat Character::isWhitespace(int).

Dodatečně vývojáři nebyli schopni specificky odstranit bílé místo v odsazení nebo specificky odstranit bílé místo na konci.

Řešení

Zavedení ořezávacích metod, které si uvědomují bílé místo v Unicode a poskytují dodatečnou kontrolu nad tím, zda se jedná pouze o úvodní nebo pouze o koncové místo.

Společným znakem těchto nových metod je, že používají jinou (novější) definici „bílého místa“ než staré metody, například String.trim(). Chyba JDK-8200373.

Z aktuálního JavaDoc pro String::trim není jasné, která definice „mezery“ se v kódu používá. Vzhledem k tomu, že se v blízké budoucnosti objeví další metody trimování, které používají jinou definici mezery, je objasnění nezbytné. String::trim používá definici mezery jako libovolný kódový bod, který je menší nebo roven kódovému bodu znaku mezera (\u0020). Novější metody trimování budou používat definici (bílé) mezery jako libovolný kódový bod, který po předání predikátu Character::isWhitespace vrátí hodnotu true.

Metoda isWhitespace(char) byla do třídy Character přidána s JDK 1.1, ale metoda isWhitespace(int) byla do třídy Character zavedena až s JDK 1.5. V případě, že se jedná o metodu isWhitespace(int), je možné, že se jedná o metodu isWhitespace(int). Druhá metoda (metoda přijímající parametr typu int) byla přidána kvůli podpoře doplňkových znaků. Komentáře Javadocu k třídě Character definují doplňkové znaky (obvykle modelované pomocí „kódového bodu“ založeného na int) oproti znakům BMP (obvykle modelovaným pomocí jednoho znaku):

Soubor znaků od U+0000 do U+FFFF se někdy označuje jako základní vícejazyčná rovina (BMP). Znaky, jejichž kódové body jsou větší než U+FFFF, se nazývají doplňkové znaky. Platforma Java používá reprezentaci UTF-16 v polích znaků a ve třídách String a StringBuffer. V této reprezentaci jsou doplňkové znaky reprezentovány jako dvojice hodnot znaků … Hodnota char tedy představuje kódové body základní vícejazyčné roviny (Basic Multilingual Plane, BMP), včetně náhradních kódových bodů, neboli kódových jednotek kódování UTF-16. Hodnota int představuje všechny kódové body Unicode včetně doplňkových kódových bodů. … Metody, které přijímají pouze hodnotu char, nemohou podporovat doplňkové znaky. … Metody, které přijímají hodnotu int, podporují všechny znaky Unicode včetně doplňkových znaků.

OpenJDK Changeset.

Srovnání benchmarků trim() a strip() – Proč je String.strip() 5x rychlejší než String.trim() pro prázdný řetězec V Javě 11

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.