Forskel mellem String trim() og strip() metoderne i Java 11

Kort sagt: strip() er en “Unicode-bevidst” videreudvikling af trim().

CSR : JDK-8200378

Problem

String::trim har eksisteret fra Java’s tidlige dage, da Unicode ikke var fuldt udviklet til den standard, som vi i dag bruger i vid udstrækning.

Definitionen af mellemrum, der anvendes af String::trim, er ethvert kodepunkt, der er mindre end eller lig med mellemrumskodepunktet (\u0020), almindeligvis benævnt ASCII- eller ISO-kontroltegn.

Unicode-bevidste trimningsrutiner bør anvende Character::isWhitespace(int).

Dertil kommer, at udviklere ikke har været i stand til specifikt at fjerne hvidt mellemrum ved indrykning eller specifikt at fjerne hvidt mellemrum ved afslutning.

Løsning

Indfør trimningsmetoder, der er opmærksomme på Unicode-whitespace, og som giver yderligere kontrol med kun at føre eller kun at efterlade.

Et fælles træk ved disse nye metoder er, at de bruger en anden (nyere) definition af “whitespace” end gamle metoder som f.eks. Fejl JDK-8200373.

Den nuværende JavaDoc for String::trim gør det ikke klart, hvilken definition af “mellemrum” der anvendes i koden. Da der i den nærmeste fremtid vil komme yderligere trimningsmetoder, som anvender en anden definition af “space”, er det absolut nødvendigt med en præcisering. String::trim bruger definitionen af mellemrum som ethvert kodepunkt, der er mindre end eller lig med kodepunktet for mellemrumstegn (\u0020). Nyere trimningsmetoder vil bruge definitionen af (hvidt) mellemrum som ethvert kodepunkt, der returnerer sandt, når det overføres til prædikatet Character::isWhitespace.

Metoden isWhitespace(char) blev tilføjet til Character med JDK 1.1, men metoden isWhitespace(int) blev ikke indført i Character-klassen før JDK 1.5. Sidstnævnte metode (den, der accepterer en parameter af typen int) blev tilføjet for at understøtte supplerende tegn. Javadoc-kommentarerne til Character-klassen definerer supplerende tegn (typisk modelleret med int-baseret “kodepunkt”) i forhold til BMP-tegn (typisk modelleret med enkelttegn):

Sættet af tegn fra U+0000 til U+FFFFFF kaldes nogle gange for BMP (Basic Multilingual Plane). Tegn, hvis kodepunkter er større end U+FFFFFF, kaldes supplerende tegn. Java-platformen anvender UTF-16-repræsentationen i char-arrays og i klasserne String og StringBuffer. I denne repræsentation repræsenteres supplerende tegn som et par char-værdier … En char-værdi repræsenterer derfor BMP-kodepunkter (Basic Multilingual Plane), herunder surrogatkodepunkterne eller kodenhederne i UTF-16-kodningen. En int-værdi repræsenterer alle Unicode-kodepunkter, herunder supplerende kodepunkter. … De metoder, der kun accepterer en char-værdi, kan ikke understøtte supplerende tegn. … De metoder, der accepterer en int-værdi, understøtter alle Unicode-tegn, herunder supplerende tegn.

OpenJDK Changeset.

Benchmark-sammenligning mellem trim() og strip() – Hvorfor er String.strip() 5 gange hurtigere end String.trim() for blank string In Java 11

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.