2015-10-12 2 views
-5

В java нам нужно сравнить объекты с помощью .equals() вместо ==. Но почему компилятор не может сделать это для нас? Например:Есть ли причина, по которой java-компилятор не может просто заменить .equals for == при сравнении объектов?

if (myString == myOtherString){ 
    doSomething(); 
} 

почему косяк компилятор идти «о, мы сравниваем объекты!», И изменить его к этому:

if (myString.equals(myOtherString)) 

Почему мы делаем это вручную?

Редактировать - Ребята, я знаю разницу между == и .equals(). Вы можете перестать рассказывать мне, насколько я неосведомлен. Мой вопрос заключается в том, почему не просто заменить .equals(), так как вы хотите 99% времени. Я узнал, что бывают случаи, когда полезно знать, являются ли два объекта действительно одной и той же ссылкой.

+10

Потому что несколько раз вы хотите использовать '=='. –

+1

иногда вы хотите знать, действительно ли у вас есть тот же объект, а не только то, что выглядит одинаково. – wastl

+0

Можете ли вы привести пример, где это было бы полезно? – niznuck

ответ

2

Оператор == и equals() часто делают совсем другие вещи. Это только по умолчанию реализация equals() унаследована от Object, которая возвращается к использованию ==. (String - хороший пример: строки equal() часто не ==.) Кроме того, первый пример в вашем коде будет выполняться отлично, если myString - это null, а второй - исключение.

Иногда вам просто нужно знать, связаны ли с двумя объектами ссылки на один и тот же объект, а не на объекты, имеющие «одно и то же содержимое» (смысл которых обычно таков: equals()). Автоматическое преобразование == в equals() было бы плохой идеей.

+0

Уважаемый Ted Hopp, plz помогите мне по адресу: http://stackoverflow.com/questions/33495499/admob-interstitial-matched-requests-is-too-low-10/33510532#33510532 –

0

Есть ли причина, по которой java-компилятор не может просто заменить .equals for == при сравнении объектов?

Java использует как equals() и ==

При использовании == для сравнения объектов, вы сравниваете ссылки ли 2 объекта одного экземпляра.

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

Пример для использования == оптимизации

public boolean equals(square s){ 
    if(this == s){ //If s and this object is the same instance 
     return true; //return true straight away, no further checking needed 
    } 
    return (this.length == s.getLength() && this.breadth == s.getBreadth()); 
} 
+0

'==' проверяет идентичность, ' состояние equals' – Pshemo

0

Существует разница. equals(Object) проверяет, являются ли два объекта равными - т. Е. Имеют одинаковое состояние. Оператор == проверяет, действительно ли две ссылки указывают на тот же объект. Это не является общей UseCase, но это, безусловно, имеет свои обычаи - например, заимствовать у IdentityHashMap's documentation:

Типичное использование этого класса топология сохраняющих граф объекты преобразование, такие как сериализация или глубокое копирование. Чтобы выполнить такое преобразование, программа должна поддерживать «таблицу узлов», которая отслеживает все обработанные объекты, которые уже были обработаны. Таблица узлов не должна приравнивать различные объекты, даже если они оказываются равными.Другим типичным применением этого класса является поддержание прокси-объектов. Например, средство отладки может хотеть поддерживать прокси-объект для каждого объекта в отлаживаемой программе.

Смежные вопросы