идентификатор: переменная содержит тот же экземпляр , что и другая переменная.
равенство: два различных объекта могут использоваться как взаимозаменяемые. они часто имеют тот же идентификатор.
Например:
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 равенство определяется методом равно
. Имейте в виду, что если вы реализуете равно , вы также должны реализовать hashCode .
Identity определяет, имеют ли два объекта один и тот же адрес памяти. Равенство определяет, содержат ли два объекта одно и то же состояние.
Если два объекта идентичны, то они также равны, но то, что два объекта равны, не означает, что они используют один и тот же адрес памяти.
Это особый случай для Строки, но это не по теме, и вам нужно спросить кого-нибудь еще, как это работает ;-)
Идентификация означает, что это один и тот же экземпляр объекта, а равенство означает, что сравниваемые вами объекты относятся к разным экземплярам объекта, но содержат одни и те же данные.
Иллюстрация (на 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 - это разные экземпляры (разные распределения в памяти), но на уровне «данных» они равны.
Подумайте о словах «идентичный» и «эквивалентный». Если две вещи идентичны, они идентичны; они одно и то же. Если они эквивалентны, один может быть заменен другим, не влияя на результат; у них одинаковое поведение и свойства.
В Java и подобных языках, которые «пропускают» абстракцию ссылки на объект, вы можете проверить, относятся ли две ссылки к одному и тому же объекту. Если они относятся к одному и тому же объекту, то ссылки идентичны. В Java это оператор ==
.
Существует также метод equals
, который используется для проверки того, имеют ли два объекта одинаковое значение, например, при использовании в качестве ключей для HashSet
(хэш-код одинаковых объектов также должны быть равны). Равные объекты должны иметь одно и то же «значение» и семантику при использовании клиентским кодом.
Чистые объектно-ориентированные языки не имеют сравнения идентичности, поскольку клиентский код обычно не должен заботиться о том, имеют ли два объекта одинаковый адрес памяти. . Если объекты представляют одну и ту же сущность реального мира, тогда это лучше смоделировать с использованием некоторого идентификатора или значения ключа, а не идентификатора, который затем становится частью договора равенства. Отсутствие зависимости от адреса в памяти объекта для представления реальной идентичности упрощает кэширование и распределенное поведение, а подавление ==
устранит множество ошибок при сравнении строк или некоторых случаях использования упаковки примитивов в Java.
Для примитивных типов (int, boolean, char, long, float ...)
== и! = - проверка на равенство
и для объектов
= = и! = - проверка идентичности. [он сравнивает только ссылку]
метод равно
используется для проверки равенства объектов [его можно переопределить для сравнения определенных атрибутов]
я нашел отличную статью по этому поводу http://www.cs.cornell.edu/courses/cs211/2006sp/Lectures/L14-Comparison/L14cs211sp06.pdf
Цитата
Я люблю свиней. Собаки смотрят на нас снизу вверх. Кошки смотрят на нас свысока. Свиньи относятся к нам как к равным. : D
Сэр Уинстон Черчилль
Концепция идентичности довольно философская, поэтому не следует пересматривать ее только в ссылки.
Вы можете сказать, что две идентичности одинаковы, если изменение первой размышлял о втором и наоборот. Конечно, это также включает в себя совместное использование одного и того же адреса памяти, но в целом, хотя идентичность связана с атрибутами объекта, равенство используется для проверки идентичности двух объектов, но это не включает идентичность.
И наоборот. Очевидно, что если два предмета имеют одинаковую идентичность, они также равны (в смысле равенства как взаимозаменяемые).
Можно сказать, что два идентификатора идентичны, если изменение первого отражается на втором и наоборот. Конечно, это также включает в себя совместное использование одного и того же адреса памяти, но в целом, хотя идентичность связана с атрибутами объекта, равенство используется для проверки идентичности двух объектов, но это не включает идентичность.
И наоборот. Очевидно, что если два предмета имеют одинаковую идентичность, они также равны (в смысле равенства как взаимозаменяемые).
Можно сказать, что два идентификатора идентичны, если изменение первого отражается на втором и наоборот. Конечно, это включает также совместное использование одного и того же адреса памяти, но в целом, хотя идентичность связана с атрибутами объекта, равенство используется для проверки идентичности двух объектов, но это не включает идентичность.
И наоборот. Очевидно, что если два предмета имеют одинаковую идентичность, они также равны (в смысле равенства как взаимозаменяемые).
Идентификация: Две ссылки на один и тот же объект ( o1 == o2
).
Равенство: Метод o1.equals (o2)
возвращает истину
. Это не обязательно означает, что два объекта содержат (все) одинаковые данные.
Теоретически можно переопределить метод equals ()
, чтобы он возвращал false
даже для идентичных объекты. equals (null) должен возвращать false.
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
Например,
В StackOverFlow:
личность: Я Майкл, вы севугараджан, значит, мы разные.
равенство: если у нас одинаковая репутация баллов, мы в чем-то равны.