Вкратце: strip()
это "Unicode-совместимая" эволюция trim()
.
CSR: JDK-8200378
Проблема
String :: trim существовал с первых дней Java, когда Unicode еще не полностью развился до стандарта, который мы широко используем сегодня.
Определение пробела, используемого String :: trim, - это любая кодовая точка, меньшая или равная кодовой точке пробела (\ u0020), обычно называемая управляющими символами ASCII или ISO.
Подпрограммы обрезки с поддержкой Unicode должны использовать Character :: isWhitespace (int).
Кроме того, разработчики не смогли специально удалить пустое пространство отступа или специально удалить конечное пустое пространство.
Решение
Представьте методы обрезки, которые учитывают пробелы Unicode и обеспечивают дополнительный контроль только начальных или конечных элементов.
Общей характеристикой этих новых методов является то, что они используют другое (более новое) определение «пробела», чем старые методы, такие как String.trim()
. Ошибка JDK-8200373 .
Текущий JavaDoc для String :: trim не дает понять, какое определение «пробела» используется в коде. Поскольку в ближайшем будущем появятся дополнительные методы обрезки, использующие другое определение пространства, уточнение является обязательным. String :: trim использует определение пробела как любую кодовую точку, которая меньше или равна кодовой точке символа пробела (\ u0020.) Новые методы обрезки будут использовать определение (белого) пробела как любую кодовую точку, которая возвращает истину при передаче в Предикат Character :: isWhitespace.
Этот метод isWhitespace(char)
был добавлен в Character
JDK 1.1, но isWhitespace(int)
не был представлен в Character
классе до JDK 1.5. Последний метод (тот, который принимает параметр типа int
) был добавлен для поддержки дополнительных символов. Комментарии Javadoc для Character
класса определяют дополнительные символы (обычно моделируемые с помощью «кодовой точки» на основе int) по сравнению с символами BMP (обычно моделируемыми одним символом):
Набор символов от U + 0000 до U + FFFF иногда называют базовой многоязычной плоскостью (BMP). Символы, кодовые точки которых больше, чем U + FFFF, называются дополнительными символами. Платформа Java использует представление UTF-16 в массивах символов и в классах String и StringBuffer. В этом представлении дополнительные символы представлены как пара значений char ... Таким образом, значение char представляет кодовые точки базовой многоязычной плоскости (BMP), включая суррогатные кодовые точки или кодовые единицы кодировки UTF-16. Значение int представляет все кодовые точки Unicode, включая дополнительные кодовые точки. ... Методы, которые принимают только значение char, не могут поддерживать дополнительные символы. ... Методы, которые принимают значение int, поддерживают все символы Unicode, включая дополнительные символы.
OpenJDK набор изменений .
Сравнение результатов между trim()
и strip()
- Почему String.strip () в 5 раз быстрее, чем String.trim () для пустой строки в Java 11
Вот модульный тест, который иллюстрирует ответ @MikhailKholodkov, используя Java 11.
(Обратите внимание, что
\u2000
это указано выше\u0020
и не считается пробеломtrim()
)источник
Как правило, оба метода удаляют начальные и конечные пробелы из строки. Однако разница возникает, когда мы работаем с символами Unicode или многоязычными функциями.
trim () удаляет все начальные и конечные символы , значение ASCII которых меньше или равно 32 ('U + 0020' или пробел).
Согласно стандартам Unicode существуют различные символы пробела, имеющие значение ASCII более 32 ('U + 0020'). Пример: 8193 (U + 2001).
Чтобы идентифицировать эти пробелы, новый метод isWhitespace (int) был добавлен из Java 1.5 в класс Character. Этот метод использует юникод для идентификации пробелов. Вы можете узнать больше о пробелах Unicode здесь .
Новая полоса метода, добавленная в java 11, использует этот метод Character.isWhitespace (int), чтобы охватить широкий диапазон символов пробела и удалить их.
пример
Вывод
Примечание. Если вы работаете на компьютере с Windows, возможно, вы не сможете увидеть аналогичный результат из-за ограниченного набора Unicode. вы можете попробовать некоторые онлайн-компиляторы для тестирования этого кода.
ссылка: разница между методом обрезки и полосы java
источник