String.equalsIgnoreCase: примеры (JAVA)
String.equalsIgnoreCase(String anotherString): booleanОписание метода String.equalsIgnoreCase
Метод String.equalsIgnoreCase в Java выполняет сравнение двух строк на равенство без учёта регистра символов. Подходит для ситуаций, когда требуется проверить, эквивалентны ли строки с учётом только буквенного регистра, например при проверке команд, ключей или пользовательского ввода.
Сигнатура метода:
public boolean equalsIgnoreCase(String anotherString)
Параметры:
- anotherString - строка для сравнения с текущим экземпляром. Может быть null.
Возвращаемое значение:
- true - если строки имеют одинаковую длину и соответствующие символы равны при игнорировании регистра согласно Unicode-мэппингу, или если ссылки на объекты идентичны.
- false - в остальных случаях, включая ситуацию, когда anotherString равна null.
Особенности реализации и поведение:
- Сравнение выполнено без учёта локали и опирается на внутренние операции с символами (реализовано через
regionMatches(true, ...)). Это означает использование стандартных Unicode-преобразований регистра, а не локаль-специфичных правил. - Если длины строк отличаются, метод сразу вернёт false. Следовательно, пары символов, которые при изменении регистра меняют длину (например, сочетания с лигатурами), не будут считаться равными, если длины различны.
- Метод не бросает исключение при передаче null в качестве аргумента; он возвращает false. Однако вызов метода на ссылке null приведёт к
NullPointerException. - Для учёта локали и специальных случаев лучше использовать преобразование регистра с явным указанием локали или использовать
Collatorдля сложных языковых сравнений.
Короткие примеры использования equalsIgnoreCase
Несколько простых сценариев с кодом и результатом.
Обычное сравнение с разным регистром:
String a = "Hello";
String b = "heLLo";
System.out.println(a.equalsIgnoreCase(b));
true
Разная длина возвращает false:
String a = "test";
String b = "tests";
System.out.println(a.equalsIgnoreCase(b));
false
Сравнение с null аргументом:
String a = "abc";
String b = null;
System.out.println(a.equalsIgnoreCase(b));
false
Вызов на null-ссылке вызывает исключение:
String a = null;
String b = "abc";
System.out.println(a.equalsIgnoreCase(b));
Exception in thread "main" java.lang.NullPointerException
at ...Похожие методы в Java
Краткое сравнение с похожими способами сравнения строк в Java и когда их выбирать.
- String.equals - точное сравнение с учётом регистра. Используется, когда регистр важен.
- String.compareToIgnoreCase - лексикографическое сравнение без учёта регистра, возвращает целое значение для упорядочивания. Подходит для сортировки или сравнения порядков.
- String.regionMatches(boolean ignoreCase,...) - позволяет сравнивать подстроки с опцией игнорирования регистра. Полезно для сравнения частей строк без выделения новых объектов.
- Collator (java.text) - учёт локали и языковых правил при сравнении. Предпочтительно для пользовательских интерфейсов и сортировки с языковыми особенностями.
Аналоги в других языках
Короткие примеры и отличия от Java-подхода.
PHP - функция strcasecmp:
var_dump(strcasecmp('Hello', 'heLLo'));
int(0) // 0 означает равенство без учёта регистра
Замечание: возвращается число, а не boolean.
JavaScript - обычно используют приведение в один регистр:
console.log('Hello'.toLowerCase() === 'heLLo'.toLowerCase());
true
Или localeCompare с опциями:
console.log('Hello'.localeCompare('heLLo', undefined, {sensitivity: 'accent'}) === 0);
true
Python - методы .lower() и .casefold():
print('Hello'.lower() == 'heLLo'.lower())
print('ß'.lower() == 'SS'.lower())
print('ß'.casefold() == 'ss'.casefold())
True False True
Замечание: casefold() обеспечивает более агрессивную нормализацию под Unicode и предпочтительнее для безрегистрированных сравнений.
C# - использование String.Equals с параметром сравнения:
Console.WriteLine(string.Equals("Hello", "heLLo", StringComparison.OrdinalIgnoreCase));
True
Go - функцию strings.EqualFold:
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Println(strings.EqualFold("Hello", "heLLo"))
}
true
Kotlin - встроенная опция в equals:
println("Hello".equals("heLLo", ignoreCase = true))
true
Lua - нет встроенного; используют приведение регистра:
print(string.lower('Hello') == string.lower('heLLo'))
true
Отличия от Java: в ряде языков имеются специальные функции с учётом Unicode (Python casefold, Go EqualFold), в других приходится явным образом приводить регистр, что создаёт новые строки. Java-метод встроен и не создаёт промежуточных строк при сравнении.
Типичные ошибки при использовании
Распространённые ошибки и примеры с результатами.
Вызов метода на null-ссылке:
String s = null;
System.out.println(s.equalsIgnoreCase("abc"));
Exception in thread "main" java.lang.NullPointerException
at ...
Ожидание эквивалентности символов разной длины (пример с немецким ß):
System.out.println("ß".equalsIgnoreCase("ss"));
false
Неправильное сравнение с учётом локали (турецкая буква I):
String a = "İ"; // латинская буква I с точкой
String b = "i";
System.out.println(a.equalsIgnoreCase(b));
false
Комментарий: для локаль-специфичных случаев следует применять преобразование регистра с указанием Locale или Collator, а не полагаться на equalsIgnoreCase.
Неоптимальное использование: приведение двух строк к одному регистру создаёт объекты:
System.out.println(a.toLowerCase().equals(b.toLowerCase()));
// Работает, но менее эффективно чем a.equalsIgnoreCase(b)
Изменения и совместимость
Метод существует в Java с очень ранних версий и семантика не менялась. Основные моменты:
- Никаких функциональных изменений в сигнатуре или поведении в последних релизах Java не вводилось.
- Поведение относительно Unicode может эволюционировать вместе с обновлениями реализованной версии Unicode в JVM. Это означает, что сопоставления регистра для нововведённых символов могут менять результаты при обновлении Java-версии.
- Если требуется строгое поведение с учётом текущей локали, рекомендуется использовать локаль-специфичные операции.
Расширенные и редкие варианты применения
Несколько продвинутых приёмов с кодом и пояснениями.
1) Проверка префикса без учёта регистра с помощью regionMatches (без выделения новых строк):
String s = "UnImPoRtAnT";
boolean starts = s.regionMatches(true, 0, "unimport", 0, 8);
System.out.println(starts);
true
Пояснение: полезно для поиска префикса без создания временных строк.
2) Поиск подстроки без учёта регистра с использованием регулярных выражений и флагов Unicode:
import java.util.regex.*;
Pattern p = Pattern.compile(Pattern.quote("№") + "?test", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
Matcher m = p.matcher("This is TEST №test");
while (m.find()) System.out.println(m.group());
TEST №test
Пояснение: помогает учитывать специальные символы и Unicode-регистр.
3) Сравнение с учётом локали (турецкий пример):
String a = "I";
String b = "ı"; // латинская маленькая без точки
System.out.println(a.toLowerCase(Locale.forLanguageTag("tr")).equals(b.toLowerCase(Locale.forLanguageTag("tr"))));
System.out.println(a.equalsIgnoreCase(b));
true false
Пояснение: equalsIgnoreCase не учитывает локаль, поэтому для турецких I/İ требуется локаль-специфичное приведение регистров.
4) Использование нормализации Unicode перед сравнением для сравнения визуально равных символов:
import java.text.Normalizer;
String s1 = "e\u0301"; // e + combining acute
String s2 = "\u00E9"; // precomposed é
boolean eq = Normalizer.normalize(s1, Normalizer.Form.NFC).equalsIgnoreCase(Normalizer.normalize(s2, Normalizer.Form.NFC));
System.out.println(eq);
true
Пояснение: нормализация устраняет различия представления одного и того же графема.
5) Использование при хранении ключей в коллекциях: хранение ключей в нормализованном регистре или применение Case-insensitive Comparator для TreeMap:
Map map = new HashMap<>();
map.put("Key", "value");
String lookup = "key";
// Надежнее и эффективнее использовать equalsIgnoreCase при сравнении, но для быстрых запросов лучше нормализовать ключы при вставке
System.out.println(map.get(lookup.toLowerCase()));
// Или поддерживать отдельную структура: Map with lowercased keys
null // потому что ключи не были нормализованы при вставке
Пояснение: для поиска без учёта регистра рекомендуется нормализовать ключи при вставке или использовать специализированный контейнер.
6) Производительность: при частых операциях сравнения лучше применять equalsIgnoreCase, чтобы избежать создания временных объектов при вызове toLowerCase() или toUpperCase() для обеих строк.
джава String.equalsIgnoreCase function comments
- джава String.equalsIgnoreCase - аргументы и возвращаемое значение
- Функция java String.equalsIgnoreCase - описание
- String.equalsIgnoreCase - примеры
- String.equalsIgnoreCase - похожие методы на java
- String.equalsIgnoreCase на javascript, c#, python, php
- String.equalsIgnoreCase изменения java
- Примеры String.equalsIgnoreCase на джава