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

В чем разница между идентичностью и равенством в ООП?

В чем разница между идентичностью и равенством в ООП (объектно-ориентированном программировании)?

4b9b3361

Ответ 1

  • идентичность: переменная содержит тот же экземпляр, что и другая переменная.

  • равенство: два разных объекта могут использоваться взаимозаменяемо. они часто имеют одинаковый идентификатор.

тождественность

Например:

Integer a = new Integer(1);
Integer b = a;

a идентичен b.

В Java идентичность проверяется с помощью ==. Например, if( a == b ).

равенство

Integer c =  new Integer(1);
Integer d = new Integer(1);

c равен, но не идентичен d.

Конечно, две одинаковые переменные всегда равны.

В Java равенство определяется методом equals. Имейте в виду, что если вы реализуете equals, вы также должны реализовать hashCode.

Ответ 2

Идентификатор определяет, имеют ли два объекта один и тот же адрес памяти. Равенство определяет, содержит ли два объекта одно и то же состояние.

Если два объекта идентичны, то они также равны, но только потому, что два объекта равны, не означает, что они имеют один и тот же адрес памяти.

Существует специальный случай для строк, но это не относится к теме, и вам нужно спросить кого-то еще о том, как это работает именно;-)

Ответ 3

Идентификация означает, что это один и тот же экземпляр объекта, а равенство означает, что объекты, которые вы сравниваете, относятся к разным экземплярам объекта, но содержат одни и те же данные.

Иллюстрация (в java)

Date a = new Date(123);
Date b = new Date(123);
System.out.println(a==b); //false
System.out.println(a.equals(b)); //true

Итак, a и b - разные экземпляры (разные распределения в памяти), но на уровне "данных" они равны.

Ответ 4

Например,

В StackOverFlow:

  • Личность: Я Майкл, ты sevugarajan, поэтому мы не такие.

  • равенство: если у нас такая же репутация оценки, мы в какой-то мере равны.

Ответ 5

В Java и подобных языках, которые "утешают" абстракцию ссылки объекта, вы можете проверить, ссылаются ли две ссылки на один и тот же объект. Если они относятся к одному и тому же объекту, то ссылки идентичны. В Java это оператор ==.

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

Объектно-ориентированные языки Purer не имеют сопоставления идентичности, так как обычно клиентский код не заботится о том, имеют ли два объекта одинаковый адрес памяти. Если объекты представляют один и тот же объект реального мира, то это лучше моделируется с использованием некоторого идентификатора или ключевого значения, а не идентификатора, который затем становится частью равного контракта. Не полагаясь на адрес памяти объекта, чтобы представлять реальную идентичность, упрощает кеширование и распределенное поведение, а подавление == приведет к удалению множества ошибок при сравнении строк или некоторых применений боксирования примитивов в Java.

Ответ 6

Подумайте о словах "идентичный" и "эквивалентный". Если две вещи идентичны, они имеют одинаковую идентичность; они то же самое. Если они эквивалентны, можно заменить другого, не влияя на результат; они имеют одинаковое поведение и свойства.

Ответ 7

Идентичность: Две ссылки на один и тот же объект (o1 == o2).

Равенство: Метод o1.equals( o2 ) возвращает true. Это не обязательно означает, что два объекта содержат (все) одни и те же данные.

В теории можно переопределить метод equals(), чтобы вернуть false даже для идентичных объектов. Но это нарушит спецификацию Object.equals():

Метод equals реализует отношение эквивалентности для ненулевых ссылок на объекты:

  • Это рефлексивно: для любого ненулевого опорного значения х, x.equals(х) должна возвращать истинное.
  • Он симметричен: для любых непустых опорных значений x и y x.equals(y) должен возвращать true тогда и только тогда, когда y.equals(x) возвращает true.
  • Это транзитивно: для любых непустых опорных значений x, y и z, если x.equals(y) возвращает true, а y.equals(z) возвращает true, тогда x.equals(z) должен возвращать true.
  • Это согласовано: для любых непустых опорных значений x и y несколько вызовов x.equals(y) последовательно возвращают true или последовательно возвращают false, если информация, используемая при равных сравнениях с объектами, не изменяется.
  • Для любого ненулевого опорного значения х, x.equals(NULL) должен возвращать ложь.

Ответ 9

x == y истинно, только если имеется тот же объект, на который ссылаются переменные x и y.

x.equals(y) зависит от реализации x.equals() и обычно менее строг, чем выше, поскольку он сравнивает содержимое объекта. (В Java, если x.equals(y), также должно быть верно, что x.hashCode() == y.hashCode();)

Пример:

Integer w = new Integer(3);
Integer x = new Integer(1);
Integer y = x;
Integer z = new Integer(1);

// all of these evaluate to true
y.equals(x) // it the same object, of course the content is same
x.equals(z) // different objects, same content (`1`)
z.equals(y)
!w.equals(x); // the content is different (`3` vs `1`)
!w.equals(y);
!w.equals(z);
x == y // same object
z != x // different objects
y != z
w != x

Ответ 10

For primitive types ( int , boolean , char, long , float ... )
== и!= - тест равенства

and for Objects
== и!= - тест идентичности. [сравнивает только ссылку]

equals метод используется для теста равенства объектов [его можно переопределить для сравнения конкретных атрибутов]

Я нашел отличную статью об этом http://www.cs.cornell.edu/courses/cs211/2006sp/Lectures/L14-Comparison/L14cs211sp06.pdf

http://ocw.mit.edu/NR/rdonlyres/Electrical-Engineering-and-Computer-Science/6-170Fall-2005/D659DC53-FB1D-403C-8E35-2CAECBED266E/0/lec12.pdf

Цитата
Мне нравятся свиньи. Собаки смотрят на нас. Кошки смотрят на нас сверху вниз. Свиньи относятся к нам как к равным.: D
  Sir Winston Churchill

Ответ 11

Концепция идентичности довольно философская, поэтому вы не должны ее разворачивать только по ссылкам.

Вы можете сказать, что два идентичности одинаковы, если изменение первого отражается на втором и наоборот. Конечно, это включает в себя также совместное использование одного и того же адреса памяти, но в целом, когда идентификация связана с атрибутами объекта, равенство используется для проверки, когда два объекта идентичны, но это не включает идентификатор.

Видимость очевидна, если два элемента имеют одинаковую идентичность, они также равны (в терминах равенства взаимозаменяемости).

Ответ 12

Посмотрите мое видео, которое прекрасно объясняет разницу между Identity и Equality, включая два примера пошагового кодирования: https://www.youtube.com/watch?v=OOpO46_k7Uo

Ответ 13

Одинаковые и равные объекты

Говорят, что два объекта имеют идентичные состояния (глубокое равенство), если графы, представляющие их состояния, идентичны во всех отношениях, включая OID на каждом уровне.

Говорят, что два объекта имеют равные состояния (неглубокое равенство), если графы, представляющие их состояния, одинаковы, включая все соответствующие атомные значения. Однако некоторые соответствующие внутренние узлы в этих двух графах могут иметь объекты с разными OID. Пример: этот пример иллюстрирует разницу между двумя определениями для сравнения состояний объектов на равенство.

o2 = (i 2 , tuple, <a 1 :i 5 , a 2 :i 6 >)
o3 = (i 3 , tuple, <a 1 :i 4 , a 2 :i 6 >)
o4 = (i 4 , atom, 10)
o5 = (i 5 , atom, 10)
o6 = (i 6 , atom, 20)

В этом примере объекты o1 и o2 имеют равные состояния (неглубокое равенство), поскольку их состояния на атомном уровне одинаковы, но значения достигаются через разные объекты o 4 и o 5.

Тем не менее, объекты o1 и o3 имеют идентичные состояния (глубокое равенство), хотя сами объекты не являются таковыми, потому что они имеют различные OID. Точно так же, хотя состояния o4 и o5 идентичны, фактические объекты o4 и o5 равны, но не идентичны, потому что они имеют различные OID.