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

29
задан Basil Bourque 1 October 2018 в 04:21
поделиться

10 ответов

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

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

Идентификатор

Например:

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

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

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

Equality

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

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

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

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

50
ответ дан 28 November 2019 в 00:57
поделиться

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

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

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

15
ответ дан 28 November 2019 в 00:57
поделиться

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

Иллюстрация (на 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 - это разные экземпляры (разные распределения в памяти), но на уровне «данных» они равны.

5
ответ дан 28 November 2019 в 00:57
поделиться

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

2
ответ дан 28 November 2019 в 00:57
поделиться

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

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

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

2
ответ дан 28 November 2019 в 00:57
поделиться

Для примитивных типов (int, boolean, char, long, float ...)
== и! = - проверка на равенство

и для объектов
= = и! = - проверка идентичности. [он сравнивает только ссылку]

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

я нашел отличную статью по этому поводу 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
Сэр Уинстон Черчилль

0
ответ дан 28 November 2019 в 00:57
поделиться

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

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

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

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

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

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

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

0
ответ дан 28 November 2019 в 00:57
поделиться

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

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

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

1
ответ дан 28 November 2019 в 00:57
поделиться

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's 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
0
ответ дан 28 November 2019 в 00:57
поделиться

Например,

В StackOverFlow:

  • личность: Я Майкл, вы севугараджан, значит, мы разные.

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

3
ответ дан 28 November 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: