Разница между методами trim() и strip() строки в Java 11

среди других изменений JDK 11 вводит 6 новых методов для java.ленг.Класс String:

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

в частности, strip() выглядит очень похоже на trim(). Согласно в этой статье strip*() методы предназначены для:

Строку.strip(), String.stripLeading () и String.stripTrailing() методы обрезки пробела [как определено Характер.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?

2 ответов


короче: strip() является" Unicode-aware " эволюция trim().

CSR: JDK-8200378

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

определение пространства, используемого строкой:: trim-это любая кодовая точка меньше чем или равен кодовой точке пространства (\u0020), обычно называемой как Символы управления ASCII или ISO.

Unicode-aware процедуры обрезки должны использовать Характер:: isWhitespace (int).

кроме того, разработчики так и не смогли вынуть пробел отступа или специфически извлечь отставая белизну пространство.

решение

ввести методы обрезки, которые знают пробел Unicode и обеспечить дополнительный контроль только за ведущими или только трейлинг.

общей характеристикой этих методов является то, что они используют другую (новее) определение "пробелов", чем старые методы, такие как String.trim(). Баг JDK-8200373.

текущий JavaDoc для String:: trim не дает понять, какой в коде используется определение "пространство". С дополнительным методы обрезки в ближайшем будущем, которые используют другой определение пространства, уточнение необходимый. Строка:: trim использует определение пространства как любой кодовой точки, которая меньше или равна кодовая точка пробел (\u0020.) Новые методы обрезки будут используйте определение (белого) пространства как любую кодовую точку, которая возвращает true при передаче предикату Character:: isWhitespace.

метод isWhitespace(char) добавлено Character С JDK 1.1, но метод isWhitespace(int) не был представлен Character класс до JDK 1.5. Последний метод (The one принятие параметра типа int) был добавлен для поддержки дополнительных символов. Комментарии Javadoc для Character класс определяет дополнительные символы (обычно моделируемые с помощью "кодовой точки" на основе int) по сравнению с символами BMP (обычно моделируемыми одним символом):

набор символов от U + 0000 до U+FFFF иногда упоминается в качестве базовой многоязычной плоскости (BMP). Символы, кодовые точки которых больше, чем U+FFFF называются дополнительными письмена. ява платформа использует представление UTF-16 в массивах char и в Классы String и StringBuffer. В этом представлении дополнительные символы представлены в виде пары значений типа char ... Значение char, таким образом, представляет основные многоязычные плоские (BMP) кодовые точки, включая суррогатные кодовые точки или кодовые единицы UTF-16 кодирование. Значение типа int представляет все кодовые точки Unicode, включая доп. точки кода. ... Методы, которые только примите char значение не поддерживает дополнительные символы. ... Методы, которые примите значение int поддержка всех символов Юникода, включая дополнительные символы.

OpenJDK изменений.


вот модульный тест, который иллюстрирует ответ @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());
    }
}