Вкратце: 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