String.trim: примеры (JAVA)
String.trim: StringОписание метода String.trim()
Метод trim() в Java является частью класса java.lang.String и используется для удаления начальных и конечных пробельных символов из строки. Возвращает новую строку (объект String), из которой удалены все символы с кодом меньше или равным '\u0020' (пробел). К таким символам относятся: пробел, табуляция, перевод строки, возврат каретки и другие управляющие символы ASCII.
Метод не принимает аргументов. Если строка не содержит начальных или конечных пробельных символов, возвращается ссылка на исходный объект (без создания нового). Если все символы являются пробельными, результатом будет пустая строка "".
Обычно trim() применяется для очистки пользовательского ввода, сравнения строк без учёта внешних пробелов, обработки данных из файлов или сетевых запросов. Важно помнить, что метод не изменяет исходную строку, а возвращает новую.
Примеры использования
String s1 = " Hello ";
String trimmed1 = s1.trim();
System.out.println("'" + trimmed1 + "'");'Hello'
String s2 = "\t\n World \r";
String trimmed2 = s2.trim();
System.out.println("'" + trimmed2 + "'");'World'
String empty = " ";
String trimmedEmpty = empty.trim();
System.out.println("is empty: " + trimmedEmpty.isEmpty());is empty: true
String noTrim = "NoSpaces";
String result = noTrim.trim();
System.out.println(result == noTrim); // ссылка на тот же объектtrue
Альтернативные методы в Java
strip() (Java 11 и новее) - удаляет начальные и конечные пробелы по стандарту Unicode, а не только ASCII. Рекомендуется для интернациональных приложений.
stripLeading() и stripTrailing() - удаляют пробелы только слева или справа соответственно.
replaceAll("\\s+", "") - удаляет все пробелы внутри строки, а не только по краям. Используется, когда нужно убрать лишние пробелы везде.
Если требуется удалить только определённые символы, например, только пробелы, но не табуляцию, лучше написать собственную логику с Character.isWhitespace() или регулярным выражением.
Аналоги в других языках
PHP: trim($str) - по умолчанию удаляет обычные пробелы, табуляцию, перевод строки и др. Можно указать список символов вторым аргументом.
$str = " Hello ";
echo trim($str);Hello
JavaScript: str.trim() - удаляет пробельные символы (включая Unicode) с обеих сторон. Аналог Java strip().
let s = " Hello ";
console.log(s.trim());Hello
Python: str.strip() - удаляет пробельные символы (по умолчанию). Можно указать строку символов для удаления.
s = " Hello "
print(s.strip())Hello
SQL: TRIM(expression) или TRIM([LEADING|TRAILING|BOTH] characters FROM string) - стандарт SQL. Удаляет заданные символы (по умолчанию пробелы) с указанных сторон.
SELECT TRIM(' Hello ');Hello
C#: str.Trim() - удаляет пробельные символы. Есть перегрузки для удаления заданных символов.
string s = " Hello ";
Console.WriteLine(s.Trim());Hello
Lua: встроенного метода нет, используется string.gsub(s, "^%s*(.-)%s*$", "%1") или string.match(s, "^%s*(.-)%s*$").
s = " Hello "
print(s:match("^%s*(.-)%s*$"))Hello
Go: strings.TrimSpace(s) - удаляет пробельные символы по Unicode.
s := " Hello "
fmt.Println(strings.TrimSpace(s))Hello
Kotlin: str.trim() - аналогичен Java trim(). Также есть trimIndent() и trimMargin() для многострочных строк.
val s = " Hello "
println(s.trim())Hello
Основное отличие: Java trim() работает только с ASCII-пробелами, тогда как strip() в Java 11 и аналоги в JavaScript, Go, Python работают с Unicode. PHP и C# по умолчанию также используют Unicode-пробелы.
Типичные ошибки
Ошибка 1: игнорирование неизменяемости строк. Метод возвращает новую строку, исходная не меняется.
String s = " text ";
s.trim(); // результат не сохранён
System.out.println(s); // " text "text
Исправление: присвоить результат.
s = s.trim();
System.out.println(s); // "text"text
Ошибка 2: вызов trim() на null.
String s = null;
s = s.trim(); // NullPointerExceptionException in thread "main" java.lang.NullPointerException
Исправление: проверка на null перед вызовом.
if (s != null) s = s.trim();Ошибка 3: ожидание удаления всех пробелов. trim() удаляет только начальные и конечные пробелы. Для удаления всех пробелов нужен replaceAll("\\s+", "").
String s = " H e l l o ";
System.out.println(s.trim()); // "H e l l o"H e l l o
Ошибка 4: замена всех символов с кодом ≤ 0x20 на пустую строку. Иногда удаляются невидимые символы, которые не считаются пробелами в других языках, что может быть неожиданно.
Ошибка 5: использование trim() для удаления только пробелов, но не других разделителей. Для удаления только пробелов (0x20) можно написать s.replaceAll("^ +| +$", "").
Изменения в версиях Java
Метод trim() присутствует с первых версий Java (JDK 1.0). Его поведение не менялось на протяжении многих лет, он по-прежнему базируется на ASCII-пробелах (символы с кодом ≤ 0x20).
В Java 11 были добавлены методы strip(), stripLeading(), stripTrailing() и isBlank(), которые используют Unicode-определение пробела (через Character.isWhitespace()). Это изменение не затронуло trim(), но предоставило более современную альтернативу.
В более поздних версиях (Java 13, 14 и т.д.) метод trim() остаётся без изменений. Рекомендуется использовать strip() для нового кода, если требуется работа с Unicode, но trim() остаётся обратно совместимым и широко используется.
Расширенные примеры
1. Использование в Stream API: обрезка всех строк коллекции.
List list = Arrays.asList(" one ", " two ", "three ");
List trimmed = list.stream().map(String::trim).collect(Collectors.toList());
System.out.println(trimmed); [one, two, three]
2. Комбинирование с другими методами: сравнение строк без учёта регистра и пробелов.
String a = " Hello World ";
String b = "hello world";
boolean eq = a.trim().equalsIgnoreCase(b);
System.out.println(eq); // truetrue
3. Безопасная обработка null с Optional:
String input = null;
String result = Optional.ofNullable(input).map(String::trim).orElse("default");
System.out.println(result);default
4. Разделение строки и обрезка элементов:
String csv = " apple , banana , cherry ";
String[] fruits = csv.split(",");
Arrays.setAll(fruits, i -> fruits[i].trim());
System.out.println(Arrays.toString(fruits));[apple, banana, cherry]
5. Проверка, является ли строка пустой или состоящей только из пробелов (аналог isBlank):
String s = " ";
boolean blank = s.trim().isEmpty();
System.out.println(blank); // truetrue
6. Использование trim() в StringBuilder: перед преобразованием в строку.
StringBuilder sb = new StringBuilder(" data ");
String trimmed = sb.toString().trim();
System.out.println("'" + trimmed + "'");'data'
7. Многократный trim() не меняет результат:
String s = " test ";
String t = s.trim().trim().trim();
System.out.println(t.equals(s.trim())); // truetrue