String.toUpperCase: примеры (JAVA)
String.toUpperCase: StringОписание метода toUpperCase
Метод String.toUpperCase в Java выполняет преобразование всех символов строки в верхний регистр с учётом правил Unicode и локали. Доступны две перегрузки: без аргументов и с объектом java.util.Locale. Метод возвращает новую строку с результатом; исходная строка остаётся неизменной.
Сигнатуры:
public String toUpperCase()- использует локаль по умолчанию (Locale.getDefault()).public String toUpperCase(Locale locale)- явное указание локали для корректного преобразования символов, чувствительных к языку.
Аргументы:
locale- объектLocale. Если передатьnull, будет выброшеноNullPointerException.
Возвращаемое значение:
- Новая строка (
String) с символами в верхнем регистре. В некоторых реализациях JVM, если преобразование не меняет строку, может быть возвращён тот же объект, но это не гарантируется и не должно использоваться как опора в логике. - Преобразования выполняются в соответствии с таблицами Unicode, которые зависят от версии JDK и обновляются между релизами.
Поведение и особенности:
- Преобразования зависят от локали. Для некоторых языков (например, турецкого) существует специальная логика для букв I/i.
- Некоторые символы при приведении к верхнему регистру изменяют количество кодовых точек (например, немецкая буква ß может преобразовываться в "SS" в старых реализациях Unicode или в "ẞ" в новых).
- Метод учитывает суррогатные пары и расширенный набор символов Unicode, но конкретные результаты зависят от версии Unicode в JDK.
Короткие примеры использования
Простой пример
String s = "Hello World";
String r = s.toUpperCase();
System.out.println(r);
HELLO WORLD
С локалью по умолчанию и с явной локалью
String s = "i";
String a = s.toUpperCase(Locale.ENGLISH);
String b = s.toUpperCase(new Locale("tr"));
System.out.println(a);
System.out.println(b);
I İ
Пример с немецкой буквой ß
String s = "straße";
System.out.println(s.toUpperCase(Locale.GERMAN));
STRASSE
Пример с греческим сигма
String s = "σς"; // маленькое sigma и финальное sigma
System.out.println(s.toUpperCase(Locale.forLanguageTag("el")));
ΣΣ
Похожие методы в Java
- String.toLowerCase() - обратная операция: преобразует символы в нижний регистр; также есть перегрузка с
Locale. Предпочтительнее при необходимости приведения к нижнему регистру. - Character.toUpperCase(int codePoint) и Character.toUpperCase(char ch) - подходят для обработки отдельных символов или при обходе строки с учётом суррогатных пар. Применяются при по-символьной трансформации и для оптимизации при потоковой обработке.
- java.text.Collator - не преобразует регистр, но полезен для сравнения строк с учётом локали и правил сортировки; применяется при упорядочивании, где регистр не должен исказить результат.
Аналоги в других языках и их отличия
JavaScript
// toUpperCase без локали
console.log('i'.toUpperCase());
// ECMAScript не поддерживает передачу локали в стандартном методе
I
Отличие: в JavaScript нет стандартной версии метода с локалью; поведение зависит от реализаций и Unicode в среде выполнения.
Python
s = 'i'
print(s.upper())
# Для учёта специфики локали можно использовать модуль locale, но метод str.upper() использует Unicode-таблицы
I
Отличие: Python использует Unicode-таблицы для преобразования; локаль обычно не влияет на str.upper().
PHP
echo strtoupper('i');
// Для многобайтных данных рекомендуется mb_strtoupper
echo mb_strtoupper('i', 'UTF-8');
I I
Отличие: для корректной работы с Unicode предпочтительна mb_* версия.
C# (.NET)
string s = "i";
Console.WriteLine(s.ToUpper());
Console.WriteLine(s.ToUpper(new CultureInfo("tr-TR")));
I İ
Сходно с Java: есть перегрузки с культурой (culture) и чувствительность к локали.
Go (Golang)
import ("fmt"; "strings")
fmt.Println(strings.ToUpper("i"))
I
Отличие: в стандартной библиотеке нет прямой поддержки локалей при преобразовании регистра.
Kotlin
val s = "i"
println(s.uppercase())
println(s.uppercase(Locale.forLanguageTag("tr")))
I İ
Kotlin вызывает реализацию платформы Java при запуске на JVM и сохраняет поведение локалей.
Lua и SQL
Lua: string.upper - простая реализация без полного Unicode/локали. SQL: функции зависят от СУБД, многие СУБД применяют правила локали сервера при преобразованиях.
Типичные ошибки и примеры
NullPointerException при вызове на null
String s = null;
System.out.println(s.toUpperCase());
Exception in thread "main" java.lang.NullPointerException
at ...
NullPointerException при передаче null в перегрузку с Locale
String s = "test";
System.out.println(s.toUpperCase(null));
Exception in thread "main" java.lang.NullPointerException
at java.base/java.util.Locale.getDefault(Locale.java:...)
at java.base/java.lang.String.toUpperCase(String.java:...)
Ожидание одинакового поведения на всех локалях
String s = "i";
System.out.println(s.toUpperCase(Locale.ENGLISH));
System.out.println(s.toUpperCase(new Locale("tr")));
I İ
Описание: неверные ожидания могут привести к багам при сравнении строк или обработке имён файлов в разных локалях.
Неправильная зависимость от длины строки после преобразования
String s = "straße";
String r = s.toUpperCase(Locale.GERMAN);
System.out.println(s.length() + " -> " + r.length());
6 -> 6 (или 5 -> 6 в зависимости от версии JDK)
Описание: некоторые символы расширяются в несколько кодовых точек, что влияет на длину и индексы.
Изменения поведения в новых версиях
Поведение метода напрямую зависит от версии Unicode, которая встроена в конкретный релиз JDK. С течением времени обновлялись таблицы соответствий регистров, что могло изменить результаты для отдельных символов (например, обработка немецкой ß или новых заглавных символов). Рекомендация: при критичных преобразованиях учитывать версию JDK и при необходимости использовать Locale.ROOT для стабильно-предсказуемой трансформации без влияния пользовательских региональных настроек.
Расширенные и редкие варианты применения
Пакетная обработка списка строк с учётом локали
List names = List.of("pålle", "i", "straße");
List upper = names.stream()
.map(s -> s.toUpperCase(Locale.forLanguageTag("sv")))
.collect(Collectors.toList());
upper.forEach(System.out::println);
PÄLLE I STRASSE
Использование Locale.ROOT для языко-независимых операций
String file = "i";
// для хранения ключей или сравнения в коде, где важна консистентность
String key = file.toUpperCase(Locale.ROOT);
System.out.println(key);
I
Описание: Locale.ROOT обеспечивает предсказуемость при кросс-платформенной логике.
По-символьная обработка с учётом суррогатных пар
String s = "a𝔊"; // латинская a + математическая заглавная A (символ вне BMP)
StringBuilder sb = new StringBuilder();
int i = 0;
while (i < s.length()) {
int cp = s.codePointAt(i);
int up = Character.toUpperCase(cp);
sb.appendCodePoint(up);
i += Character.charCount(cp);
}
System.out.println(sb.toString());
A???? (результат зависит от исходного кода точки и её верхнего регистра)
Описание: непосредственное использование кодовых точек даёт контроль при работе с расширенными символами.
Сравнение строк в регистро-независимом виде с учётом локали
String a = "straße";
String b = "STRASSE";
boolean eqRoot = a.toUpperCase(Locale.ROOT).equals(b.toUpperCase(Locale.ROOT));
boolean eqGerman = a.toUpperCase(Locale.GERMAN).equals(b.toUpperCase(Locale.GERMAN));
System.out.println(eqRoot + " " + eqGerman);
true true
Описание: в разных локалях и версиях JDK результаты сравнения могут отличаться, поэтому проверка на нужную версию и выбор локали важны.
Оптимизация массовых преобразований
// При больших объёмах данных лучше минимизировать создание промежуточных объектов
StringBuilder out = new StringBuilder(input.length());
int i = 0;
while (i < input.length()) {
int cp = input.codePointAt(i);
int up = Character.toUpperCase(cp);
out.appendCodePoint(up);
i += Character.charCount(cp);
}
String result = out.toString();
(зависит от input)
Описание: ручная обработка кодовых точек может быть эффективнее при необходимости учёта суррогатных пар и минимизации временных объектов.