Подтвердить что ты не робот

Equals (...) и equalsIgnoreCase (...)

Почему у нас есть equals() и equalsIgnoreCase() как два разных метода, когда equals() может быть перегружен специальным аргументом ignoreCase для обеспечения функциональности equalsIgnoreCase()?

4b9b3361

Ответ 1

Метод equals() наследуется от Object, поэтому его подпись не должна изменяться. equals() часто может использоваться без фактического знания конкретного класса объекта, например. при повторении через коллекцию объектов (особенно до генериков Java 5). Таким образом, вы даже не увидите другой equals(), не опуская ваш объект на String.

Это был дизайнерский выбор от создателей Java, чтобы сделать идиом использования equals() применимым точно таким же образом для всех объектов.

Кроме того, IMO

if (string1.equalsIgnoreCase(string2)) ...

более читабельна, тем самым менее подвержена ошибкам, чем

if (string1.equals(string2, true)) ...

Конечно, в ваших собственных классах вы можете добавлять equals() с другой подписью (например, поверх стандартного equals()).

Ответ 2

equalIgnoreCase() используется для игнорирования Case, чувствительного к нашим String. Но equals() возвращает только true, в то время как тот же случай String

ех,

String value="java";
if(value.equals("JAva")
{
    System.out.println("Return True");
}
else
{
    System.out.println("Return False");
}

Ans: Возвращает False

но другой,

if(value.equalIgnoreCase("JAva")
{
    System.out.println("Return True");
}
else
{
    System.out.println("Return False");
}

Ans: Возвращает true

Ответ 3

Совершенно возможно сделать то, что вы предлагаете, но разработчики языка решили пойти другим путем, и, следовательно, мы имеем equalsIgnoreCase(otherString) вместо equals(otherString, StringConstants.IGNORE_CASE) или equals(otherString, true).

Ответ 4

Так как метод equals() наследуется от Object.

Если бы они сделали это, как вы предполагаете, у нас было бы что-то вроде этого:

public final class String {

    public boolean equals () { ... }

    public boolean equals (boolean ignoreCase) { ... }

} 

И без чтения документации было бы невозможно понять, какой метод equals() (который без параметра).

Ответ 5

Основной тест при переопределении метода с дополнительными параметрами заключается в том, что я ожидаю, что любой метод переопределит выполнение точно такой же, как метод, который он переопределяет. Equals(), будучи полученным из Object, имеет контракт, за которым он должен следовать. Два объекта, которые равны(), должны иметь одинаковые хэш-коды. Я не думаю, что два объекта, которые нечувствительны к регистру, должны иметь один и тот же хэш-код, поэтому я считаю, что переопределение здесь является неправильным.

Ответ 6

    // Demonstrate equals() and equalsIgnoreCase(). 
    class equalsDemo { 
    public static void main(String args[]) { 
    String s1 = "Hello"; 
    String s2 = "Hello"; 
    String s3 = "Good-bye"; 
    String s4 = "HELLO"; 
    System.out.println(s1 + " equals " + s2 + " -> " + 
    s1.equals(s2)); 
    System.out.println(s1 + " equals " + s3 + " -> " + 
    s1.equals(s3)); 
    System.out.println(s1 + " equals " + s4 + " -> " + 
    s1.equals(s4)); 
    System.out.println(s1 + " equalsIgnoreCase " + s4 + " -> " + 
    s1.equalsIgnoreCase(s4)); 
    } 
}

Результат программы показан здесь:

Hello equals Hello -> true 
Hello equals Good-bye -> false 
Hello equals HELLO -> false 
Hello equalsIgnoreCase HELLO -> true

Ответ 7

Я думаю, они просто выбрали одну из альтернатив..NET выбрал другую. StringComparison.InvariantCultureIgnoreCase и т.д.

Определенно, что вы предлагаете и [даже лучше, чем] внедренная .NET была бы более гибкой для разных культур и т.д. На самом деле я даже не знаю, какую культуру они используют в этом случае игнорировать. Думаю, нынешняя культура.