Різниця між методами обрізки рядків () та strip () на Java 11


104

Серед інших змін, JDK 11 представляє 6 нових методів для класу java.lang.String:

  • repeat(int)- Повторює рядок стільки разів, скільки передбачено intпараметром
  • lines() - Використовує Spliterator для лінивого надання рядків з вихідного рядка
  • isBlank() - Вказує, чи рядок порожній чи містить лише пробіли
  • stripLeading() - Видаляє пробіл з початку
  • stripTrailing() - Видаляє пробіл з кінця
  • strip() - Вилучає пробіл з обох, початку та кінця рядка

Зокрема, strip()виглядає дуже схоже на trim(). Відповідно до цієї статті strip*() методи призначені для:

Методи String.strip (), String.stripLeading () та String.stripTrailing () обрізають пробіл [як визначено Character.isWhiteSpace ()] від передньої, задньої або передньої та задньої частини цільового рядка.

String.trim() JavaDoc заявляє:

/**
  * Returns a string whose value is this string, with any leading and trailing
  * whitespace removed.
  * ...
  */

Що майже ідентично цитаті вище.

Яка саме різниця між String.trim()та String.strip()Java 11?

Відповіді:


106

Коротше кажучи: strip()це "розуміння Unicode" еволюції trim().

КСВ: JDK-8200378

Проблема

String :: обробка існує з ранніх днів Java, коли Unicode не повністю розвинувся до стандарту, який ми широко використовуємо сьогодні.

Визначення простору, що використовується String :: trim - це будь-яка точка коду, менша або рівна кодовій точці космосу (\ u0020), яку зазвичай називають ASCII або ISO контрольними символами.

Підпрограми обрізки, які знають Unicode, повинні використовувати символ :: isWhitespace (int).

Крім того, розробники не змогли спеціально видалити пробіл з відступом або спеціально вилучити пробіл.

Рішення

Введіть методи обрізки, які знають пробіл Unicode, і забезпечують додатковий контроль лише для провідних чи задніх.

Загальною характеристикою цих нових методів є те, що вони використовують інше (новіше) визначення поняття "пробіл", ніж старі методи, такі як String.trim(). Баг JDK-8200373 .

У поточному обробці JavaDoc для String :: не зрозуміло, яке визначення поняття "пробіл" використовується в коді. Якщо в найближчому майбутньому з'являться додаткові способи обрізки, які використовують інше визначення простору, уточнення є обов'язковим. String :: trim використовує визначення простору як будь-якої кодової точки, яка менше або дорівнює кодовій точці символів пробілу (\ u0020.) Більш нові методи обрізки використовуватимуть визначення (білого) простору як будь-якої кодової точки, яка повертає істинне, коли передається в Символ :: присудокWhitespace.

Метод isWhitespace(char)було додано до CharacterJDK 1.1, але метод isWhitespace(int)не був введений у Characterклас до JDK 1.5. Останній метод (той, що приймає параметр типу int) був доданий для підтримки додаткових символів. Зауваження Javadoc для Characterкласу визначають додаткові символи (як правило, змодельовані на основі коду "кодова точка") проти символів BMP (як правило, модельованих одним символом):

Набір символів від U + 0000 до U + FFFF іноді називають базовою багатомовною площиною (BMP). Символи, кодові точки яких перевищують U + FFFF, називаються додатковими символами. Платформа Java використовує представлення UTF-16 в масивах char та в класах String і StringBuffer. У цьому поданні додаткові символи представлені як пара знакових знаків ... Значення char, отже, являє собою кодові точки базової багатомовної площини (BMP), включаючи сурогатні кодові точки або кодові одиниці кодування UTF-16. Значення int представляє всі кодові точки Unicode, включаючи додаткові кодові точки. ... Методи, які приймають лише значення char, не можуть підтримувати додаткові символи. ... Методи, які приймають значення int, підтримують усі символи Unicode, включаючи додаткові символи.

Набір змін OpenJDK .


Порівняння порівняння між trim()і strip()- Чому String.strip () у 5 разів швидше, ніж String.trim () для порожнього рядка на Java 11


6
Цікаво, що символ "\ u0000" не видаляється смужкою, а видаляється обрізкою.
CHEM_Eugene

32

Ось блок-тест, який ілюструє відповідь @MikhailKholodkov, використовуючи Java 11.

(Зауважте, що \u2000вище \u0020та не вважається пробілом trim())

public class StringTestCase {
    @Test
    public void testSame() {
        String s = "\t abc \n";

        assertEquals("abc", s.trim());
        assertEquals("abc", s.strip());
    }

    @Test
    public void testDifferent() {
        Character c = '\u2000';
        String s = c + "abc" + c;

        assertTrue(Character.isWhitespace(c));
        assertEquals(s, s.trim());
        assertEquals("abc", s.strip());
    }
}

0

Як правило, обидва способи видаляють провідні та кінцеві пробіли з рядка. Однак різниця виникає, коли ми працюємо з унікодними характеристиками або багатомовними функціями.

trim () видаляє всі провідні та кінцеві символи , значення ASCII яких менше або дорівнює 32 ('U + 0020' або пробіл).

Відповідно до стандартів Unicode є різні символи простору, значення яких ASCII більше 32 ('U + 0020'). Наприклад: 8193 (U + 2001).

Для ідентифікації цих символів простору, новий Java isWhitespace (int) був доданий з Java 1.5 в класі символів. Цей метод використовує unicode для ідентифікації просторових символів. Докладніше про символи простору унікоду ви можете прочитати тут .

Нова методична смужка, яка додається в java 11, використовує цей метод Character.isWhitespace (int), щоб охопити широкий діапазон символів пробілу та видалити їх.

приклад

public class StringTrimVsStripTest {
    public static void main(String[] args) {
        String string = '\u2001'+"String    with    space"+ '\u2001';
        System.out.println("Before: \"" + string+"\"");
        System.out.println("After trim: \"" + string.trim()+"\"");
        System.out.println("After strip: \"" + string.strip()+"\"");
   }
}

Вихід

Before: "  String    with    space  "
After trim: " String    with    space "
After strip: "String    with    space"

Примітка. Якщо ви працюєте на машині Windows, можливо, ви не зможете побачити подібний вихід через обмежений набір юнікоду. ви можете спробувати деякі онлайн-компілятори для тестування цього коду.

довідка: Різниця між обробкою та стриповим методом java

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.