В чем разница между equals () и equalsIgnoreCase () в StringUtils для commons-lang3-3.6.jar? - PullRequest
0 голосов
/ 29 июня 2018

когда я использую эти два метода, я хочу узнать разницу, и как 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 ]

0 голосов
/ 29 июня 2018

В равных вы видите равенство строк: Пример:

 StringUtils.equals("abc", "abc") = true
 StringUtils.equals("abc", "ABC") = false

В equalsIgnoreCase, как следует из названия, попробуйте сравнить равенство строк без учета регистра:

 StringUtils.equalsIgnoreCase("abc", "abc") = true
 StringUtils.equalsIgnoreCase("abc", "ABC") = true 

Из документов Apache.

0 голосов
/ 29 июня 2018

equalsIgnoreCase (...) игнорировать регистр (UPPER CASER o нижний регистр). так что

"HELLO".equalsIgnoreCase("hello")

Это правда.

0 голосов
/ 29 июня 2018

разница в методе 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);
    }
}
0 голосов
/ 29 июня 2018

equalsIgnoreCase выполняет следующие тесты:

  1. Является ли любая строка пустой? Если это так, верните str1 == str2
  2. Есть ли str1 == str2? Если это так, верните true
  3. Различаются ли длины струн? Если это так, верните false
  4. Сравните эти два значения, используя regionMatches метод CharSequenceUtils, со вторым аргументом ignoreCase, установленным в true

Вы можете найти исходный код для regionMatches здесь . Похоже, что функция сравнивает символы при сравнении, если для ignoreCase установлено значение true.

В отличие от этого, equals вызывает regionMatches со значением false для аргумента ignoreCase, что заставит regionMatches не вводить символы в регистр.

...