String.toLowerCase: примеры (JAVA)

Подробности работы toLowerCase в String
Раздел: Строки (String) - преобразование
String.toLowerCase: String

Описание метода

Метод класса String toLowerCase выполняет преобразование всех символов строки в строчные формы в соответствии с правилами Unicode и выбранной локалью. Применяется при подготовке текста к поиску и сравнению без учета регистра, при нормализации идентификаторов, формировании URL-путей и при отображении данных с требованием нижнего регистра.

В Java доступны две перегрузки:

  • String toLowerCase() - используется локаль по умолчанию JVM (Locale.getDefault()).
  • String toLowerCase(Locale locale) - применяется явная локаль, что важно для языков с особой семантикой преобразования регистра (например, турецкий).

Поведение и возвращаемые значения:

  • Метод возвращает новую строку с преобразованными символами. Исходная строка остается без изменений, так как String неизменяем.
  • Если строка не содержит символов, для которых есть изменение регистра, возвращается строка, равная исходной (в реализации возможна оптимизация и возврат той же самой ссылки).
  • Если в качестве аргумента передана null (в перегрузке с локалью), будет выброшено NullPointerException.
  • Преобразование учитывает правила Unicode, включая некоторые контекстно-зависимые отображения (например, греческая сигма), и локаль-специфические правила (например, для турецкого).
  • Результат зависит от версии Unicode, реализованной в конкретной версии JDK. Обновления JDK могут менять отдельные соответствия регистра в соответствии с обновлениями стандарта Unicode.

Рекомендации

Для независимых от локали операций (идентификаторы, ключи, протоколы) предпочтительнее использовать toLowerCase(Locale.ROOT) или Locale.ENGLISH, чтобы избежать неожиданных локаль-специфичных преобразований. Для отображения текста пользователю - указывать локаль, соответствующую пользовательскому окружению.

Короткие примеры

Пример 1. Простой вызов без указания локали

String s = "Hello WORLD";
System.out.println(s.toLowerCase());
hello world

Пример 2. Явная локаль и отличие для турецкого

String s = "TITLE I";
System.out.println(s.toLowerCase(Locale.ENGLISH));
System.out.println(s.toLowerCase(new Locale("tr")));
title i
title ı

Пример 3. Рекомендованный вариант для нормализации ключей

String key = "UserName";
String normalized = key.toLowerCase(Locale.ROOT);
System.out.println(normalized);
username

Пример 4. NullPointerException при null

String s = null;
s.toLowerCase(); // вызовет исключение
Exception in thread "main" java.lang.NullPointerException
    at ...

Похожие функции в Java

  • toUpperCase() - противоположная операция: перевод всех символов в заглавные, также имеет перегрузку с Locale.
  • Character.toLowerCase(int codePoint) - понижение регистра для отдельного кода символа (подходит при работе с кодовыми точками и суррогатными парами).
  • String.equalsIgnoreCase() - сравнение строк без учета регистра; работает для быстрых сравнений, но не всегда заменяет явную нормализацию при сложных правилах локалей.
  • Collator (java.text.Collator) - предпочтительнее при локаль-специфичной сортировке и сравнении, так как учитывает языковые правила порядка и диакритики.

Выбор зависит от задачи: для преобразования текста под хранение или ключи - toLowerCase(Locale.ROOT). Для пользовательского отображения - toLowerCase(userLocale). Для сортировки и логического сравнения локаль-зависимого текста - Collator.

Эквиваленты в других языках

PHP

// однобайтовая версия (работает некорректно с UTF-8)
$str = strtolower('ПрИмер');
// многобайтовая версия
$str2 = mb_strtolower('ПрИмер', 'UTF-8');
echo $str2;
пример

mb_strtolower учитывает кодировку, но поведение по локали ограничено. Для турецких особенностей может потребоваться установка локали или специальная обработка.

JavaScript

console.log('Hello WORLD'.toLowerCase());
console.log('I'.toLowerCase());
console.log('I'.toLocaleLowerCase('tr'));
hello world
i
ı

toLocaleLowerCase поддерживает локаль и в браузерах, и в Node, но детали зависят от реализации.

Python

print('Hello WORLD'.lower())
print('İ'.lower())
print('Straße'.casefold())
hello world
i̇
strasse

В Python рекомендуется casefold() для сравнения без учета регистра, так как оно выполняет более агрессивную нормализацию (например, для немецкого ß).

SQL

SELECT LOWER('Hello WORLD');
hello world

Поведение зависит от СУБД и ее настройке локали и сортировки.

C#

Console.WriteLine("Hello WORLD".ToLower());
Console.WriteLine("Hello WORLD".ToLowerInvariant());
hello world
hello world

В C# есть явная версия ToLowerInvariant() для локаль-независимого результата.

Go

import "strings"
fmt.Println(strings.ToLower("Hello WORLD"))
hello world

Стандартная функция учитывает Unicode-ответвления, но для языко-специфичных правил доступны пакеты x/text.

Kotlin

println("Hello WORLD".lowercase())
println("Hello WORLD".lowercase(Locale.getDefault()))
hello world
hello world

В новых версиях Kotlin используются функции lowercase() и uppercase(). Есть перегрузки с локалью.

Lua

print(string.lower('Hello WORLD'))
hello world

В Lua функция обычно опирается на локаль C и не заботится о UTF-8, поэтому для многобайтовых строк требуется дополнительная библиотека.

Типичные ошибки и ловушки

  • NullPointerException: попытка вызвать метод на null. Пример ниже.
  • Пренебрежение локалью: использование версии без аргумента может привести к неожиданному результату для турецкого и некоторых других языков.
  • Ожидание мутации строки: String неизменяем, метод возвращает новую строку.
  • Неполная нормализация: toLowerCase не удаляет диакритики; для сравнения следует дополнительно применять нормализацию Unicode и/или удаление знаков диакритики.
  • Неправильный выбор для сравнения: для языко-зависимого сравнения и сортировки предпочтительнее использовать Collator, а не простую нормализацию регистра.
  • Производительность: частые вызовы в горячем цикле создают много объектов. При большом объеме возможны оптимизации через кэширование или работу с байтовыми представлениями.

Пример NullPointerException

String s = null;
System.out.println(s.toLowerCase());
Exception in thread "main" java.lang.NullPointerException
    at ...

Изменения в поведении

Сам механизм String.toLowerCase не претерпел радикальных изменений в Java, но результаты могут меняться при обновлениях JDK, поскольку соответствия регистра основаны на версии Unicode, включенной в конкретный релиз JDK. Обновления Unicode приводят к обновлению таблиц соответствий, что может изменить редкие преобразования.

В иных JVM-платформах или в сторонних библиотеках могут появляться функции с расширенной поддержкой локалей или более «полной» нормализацией (case folding). В Kotlin отмечена смена API: рекомендованы функции lowercase() и uppercase() вместо устаревших toLowerCase() и toUpperCase() без локали.

Расширенные примеры и нестандартные сценарии

1. Преобразование для формирования «чистой» ссылки (slug)

Пример java
import java.text.Normalizer;
import java.util.Locale;

String s = "Đặng Văn Lâm";
String slug = Normalizer.normalize(s, Normalizer.Form.NFD)
    .replaceAll("\\p{InCombiningDiacriticalMarks}+", "")
    .toLowerCase(Locale.ROOT)
    .replaceAll("[^a-z0-9]+", "-")
    .replaceAll("(^-|-$)", "");
System.out.println(slug);
dang-van-lam

Нормализация и удаление диакритики помогают получить читаемые URL. Используется Locale.ROOT для предсказуемого результата.

2. Учёт турецкой локали и явная обработка символа I

Пример java
String en = "I";
String tr = en.toLowerCase(new Locale("tr"));
System.out.println(tr + " (unicode: " + (int)tr.charAt(0) + ")");
ı (unicode: 305)

В турецкой локали латинская заглавная I без точки преобразуется в точечно-не содержащую строчную 'ı' (U+0131). Для операций с идентификаторами это влияет на совместимость.

3. Сравнение строк без учета регистра: toLowerCase vs Collator

Пример java
String a = "straße";
String b = "STRASSE";
// Низкоуровневое сравнение через нормализацию
boolean eq1 = a.toLowerCase(Locale.ROOT).equals(b.toLowerCase(Locale.ROOT));
// Для локаль-специфичных правил лучше Collator (пример упрощен)
System.out.println(eq1);
false

В данном случае лучше применять специальные операции сравнения или использовать приведение к форме casefold (в Java отсутствует встроенное casefold, поэтому следует учитывать требования локали и применять дополнительные трансформации).

4. Понижение регистра по кодовым точкам и работа с суррогатами

Пример java
String s = "????????????????????????????"; // некоторые редкие символы могут быть представлены как суррогатные пары
String lower = s.toLowerCase(Locale.ROOT);
System.out.println(lower);
???????????????????????????? эквивалент в нижнем регистре (в зависимости от символов)

При необходимости обработки отдельных кодовых точек следует применять Character.toLowerCase(int) и обход по codePoint.

5. Массовая обработка коллекции с учётом локали

Пример java
List names = Arrays.asList("ALICE", "BOB", "İBRAHİM");
List lower = names.stream()
    .map(s -> s.toLowerCase(Locale.forLanguageTag("tr")))
    .collect(Collectors.toList());
lower.forEach(System.out::println);
alice
bob
ibrahim (с учётом турецких правил)

6. Использование Collator для сортировки вместо toLowerCase

Пример java
Collator coll = Collator.getInstance(Locale.GERMAN);
coll.setStrength(Collator.PRIMARY);
List items = Arrays.asList("ä", "a", "z");
items.sort(coll);
System.out.println(items);
[a, ä, z] (порядок зависит от локали)

Collator учитывает локальные правила сортировки и диакритики, что часто предпочтительнее простого приведения регистра.

джава String.toLowerCase function comments

En
String.toLowerCase Converts all of the characters in this String to lower case