В чем разница между equals() и equalsIgnoreCase() в StringUtils для commons-lang3-3.6.jar?
Когда я использую эти два метода, я хочу знать разницу, и как equalsIgnoreCase() игнорирует случай двух строк. Но я даже не нахожу разницы в исходном коде, отличается только порядок кода. Кто может помочь мне проанализировать разницу в исходном коде и как он игнорирует регистр? Благодарю. Вот исходный код:
public static boolean equals(CharSequence cs1, CharSequence cs2) {
if (cs1 == cs2) {
return true;
} else if (cs1 != null && cs2 != null) {
if (cs1.length() != cs2.length()) {
return false;
} else {
return cs1 instanceof String && cs2 instanceof String ? cs1.equals(cs2) : CharSequenceUtils.regionMatches(cs1, false, 0, cs2, 0, cs1.length());
}
} else {
return false;
}
}
public static boolean equalsIgnoreCase(CharSequence str1, CharSequence str2) {
if (str1 != null && str2 != null) {
if (str1 == str2) {
return true;
} else {
return str1.length() != str2.length() ? false : CharSequenceUtils.regionMatches(str1, true, 0, str2, 0, str1.length());
}
} else {
return str1 == str2;
}
}
4 ответа
Разница в методе CharSequenceUtils.regionMatches
, Второй параметр ignoreCase
static boolean regionMatches(CharSequence cs, boolean ignoreCase, int thisStart,
CharSequence substring, int start, int length) {
if (cs instanceof String && substring instanceof String) {
return ((String) cs).regionMatches(ignoreCase, thisStart, ((String) substring), start, length);
} else {
// TODO: Implement rather than convert to String
return cs.toString().regionMatches(ignoreCase, thisStart, substring.toString(), start, length);
}
}
equalsIgnoreCase(...) игнорирует регистр (верхний регистр или нижний регистр). .чтобы
"HELLO".equalsIgnoreCase("hello")
Правда.
equalsIgnoreCase
выполняет следующие тесты:
- Является ли любая строка пустой? Если так, верните
str1 == str2
- Есть ли
str1 == str2
? Если так, верните истину - Различаются ли длины струн? Если это так, верните false
- Сравните два, используя
regionMatches
методCharSequenceUtils
со вторым аргументом,ignoreCase
установить в true
Вы можете найти исходный код для regionMatches
здесь Похоже, что эта функция улучшает символы при сравнении, если ignoreCase
установлен в true.
В отличие от equals
Запускает regionMatches
с ложным для ignoreCase
аргумент, который вызовет regionMatches
не расстраивать персонажей.
В равных вы видите равенство строк: Пример:
StringUtils.equals("abc", "abc") = true
StringUtils.equals("abc", "ABC") = false
В equalsIgnoreCase, как следует из названия, попробуйте сравнить равенство строк без учета регистра:
StringUtils.equalsIgnoreCase("abc", "abc") = true
StringUtils.equalsIgnoreCase("abc", "ABC") = true