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

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

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

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

The String.strip(), String.stripLeading(), and String.stripTrailing() methods trim white space [as determined by Character.isWhiteSpace()] off either the front, back, or both front and back of the targeted String.

String.trim() JavaDoc утверждает:

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

Что почти идентично приведенной выше цитате.

В чем именно разница между String.trim() и String.strip() после Java 11?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
141
0
41 921
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вкратце: strip() - это "поддерживающая Unicode" эволюция trim().

CSR: JDK-8200378

Problem

String::trim has existed from early days of Java when Unicode had not fully evolved to the standard we widely use today.

The definition of space used by String::trim is any code point less than or equal to the space code point (\u0020), commonly referred to as ASCII or ISO control characters.

Unicode-aware trimming routines should use Character::isWhitespace(int).

Additionally, developers have not been able to specifically remove indentation white space or to specifically remove trailing white space.

Solution

Introduce trimming methods that are Unicode white space aware and provide additional control of leading only or trailing only.

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

The current JavaDoc for String::trim does not make it clear which definition of "space" is being used in the code. With additional trimming methods coming in the near future that use a different definition of space, clarification is imperative. String::trim uses the definition of space as any codepoint that is less than or equal to the space character codepoint (\u0020.) Newer trimming methods will use the definition of (white) space as any codepoint that returns true when passed to the Character::isWhitespace predicate.

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

The set of characters from U+0000 to U+FFFF is sometimes referred to as the Basic Multilingual Plane (BMP). Characters whose code points are greater than U+FFFF are called supplementary characters. The Java platform uses the UTF-16 representation in char arrays and in the String and StringBuffer classes. In this representation, supplementary characters are represented as a pair of char values ... A char value, therefore, represents Basic Multilingual Plane (BMP) code points, including the surrogate code points, or code units of the UTF-16 encoding. An int value represents all Unicode code points, including supplementary code points. ... The methods that only accept a char value cannot support supplementary characters. ... The methods that accept an int value support all Unicode characters, including supplementary characters.

OpenJDK Набор изменений.


Сравнительный анализ trim() и strip() - Почему String.strip () в 5 раз быстрее String.trim () для пустой строки в Java 11

Интересно, что символ '\ u0000' не удаляется полосой, а удаляется обрезкой.

CHEM_Eugene 05.04.2019 09:20

Почему бы не обновить саму trim () вместо создания нового метода? Он бы работал с существующими приложениями без какого-либо вмешательства разработчика? Или именно по этой причине они решили создать новый метод?

human 04.11.2020 13:35

@human Потому что большая часть идеала Java заключается в максимальной обратной совместимости. Изменение поведения такого метода, как String::trim, принесет неприятные сюрпризы существующим кодовым базам.

Basil Bourque 06.12.2020 09:25

Является ли вселенная персонажей стрипа надмножеством вселенной персонажей Тримма? Другими словами, полосы полосы больше, чем обрезки обрезки?

Dojo 17.04.2021 06: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());
    }
}

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

trim () удаляет все начальные и конечные символы чье значение ASCII меньше или равно 32 («U + 0020» или пробел).

Согласно стандартам Unicode существуют различные символы пробела, имеющие значение ASCII более 32 («U + 0020»). Пример: 8193 (U + 2001).

Чтобы идентифицировать эти пробелы, новый метод isWhitespace (int) был добавлен из Java 1.5 в класс Character. Этот метод использует юникод для идентификации пробелов. Вы можете узнать больше о пробелах Юникода здесь.

Новая полоса методов, добавленная в 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, вы не сможете увидеть аналогичный вывод из-за ограниченного набора Unicode. вы можете попробовать некоторые онлайн-компиляторы для тестирования этого кода.

Справка:Разница между методом обрезки и полосы java

Чем он отличается от двух других ответов?

Smart Manoj 19.12.2020 07:04

Другие вопросы по теме