Java OOP中标识和相等的区别是什么?
在中,标识和相等有什么区别?标识表示它是同一个对象实例,而相等表示您比较的对象与对象的不同实例相同,但恰好包含相同的数据 插图(java) 因此a和b是不同的实例(内存中的不同分配),但在“数据”级别上它们是相等的。Java OOP中标识和相等的区别是什么?,java,oop,object,Java,Oop,Object,在中,标识和相等有什么区别?标识表示它是同一个对象实例,而相等表示您比较的对象与对象的不同实例相同,但恰好包含相同的数据 插图(java) 因此a和b是不同的实例(内存中的不同分配),但在“数据”级别上它们是相等的。 标识:变量保存 与另一个变量的实例相同 相等:可以使用两个不同的对象 可以互换使用。他们经常 有相同的身份证 身份 例如: Integer a = new Integer(1); Integer b = a; a与b相同 在Java中,使用==测试身份。例如,如果(a==b)
- 标识:变量保存 与另一个变量的实例相同
- 相等:可以使用两个不同的对象 可以互换使用。他们经常 有相同的身份证
Integer a = new Integer(1);
Integer b = a;
a
与b
相同
在Java中,使用==
测试身份。例如,如果(a==b)
平等
c
与d
相等但不相同
当然,两个相同的变量总是相等的
在Java中,相等由
equals
方法定义。请记住,如果实现,则还必须实现。标识确定两个对象是否共享相同的内存地址。相等性确定两个对象是否包含相同的状态
如果两个对象相同,那么它们也相等,但仅仅因为两个对象相等,并不意味着它们共享相同的内存地址
字符串有一个特殊情况,但这是离题的,您需要询问其他人它到底是如何工作的;-) 在“泄漏”对象引用抽象的Java和类似语言中,可以测试两个引用是否引用同一个对象。如果它们引用同一对象,则引用是相同的。在Java中,这是
=
操作符
还有一种equals
方法,用于测试两个对象是否具有相同的值,例如当用作HashSet
的键时(相等对象的哈希代码也应相等)。当客户端代码使用相同的对象时,它们应该具有相同的“值”和语义
更纯粹的面向对象语言没有身份比较,因为客户机代码通常不应该关心两个对象是否具有相同的内存地址。如果对象表示相同的真实实体,那么最好使用某个ID或键值而不是标识来建模,标识随后成为equals契约的一部分。不依赖对象的内存地址来表示真实世界的身份简化了缓存和分布式行为,抑制
=
将消除字符串比较中的大量错误或Java中原语装箱的一些用法。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
用于基本类型(int、boolean、char、long、float…)
==和!=是平等测试吗
和对象的
==和!=这是身份测试。[它只比较参考文献]
equals
方法用于对象的相等性测试[可以覆盖它以比较特定属性]
我发现了一篇关于这方面的优秀文章
引用我喜欢猪。狗尊敬我们。猫看不起我们。猪对我们一视同仁D
温斯顿·丘吉尔爵士
身份:对同一对象的两次引用(o1==o2
)
相等:方法o1.equals(o2)
返回true
。这并不一定意味着这两个对象包含(全部)相同的数据
理论上,即使对于相同的对象,也可以重写方法equals()
以返回false
。但这将违反以下规范:
equals方法在非null对象引用上实现等价关系:
- 它是自反的:对于任何非空参考值x,x.equals(x)应该返回true
- 它是对称的:对于任何非空的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true
- 它是可传递的:对于任何非空引用值x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)应该返回true
- 它是一致的:对于任何非空的引用值x和y,x.equals(y)的多次调用始终返回true或false,前提是没有修改对象上equals比较中使用的信息
- 对于任何非空引用值x,x.equals(null)应返回false
身份概念是相当哲学的,这就是为什么你不应该把它仅仅重新归纳为参考 如果对第一个身份的更改反映在第二个身份上,则可以说两个身份相同,反之亦然。当然,这也包括共享相同的内存地址,但一般来说,虽然标识与对象的属性相关,但只要两个对象相同,就使用相等来检查,但这不包括标识 反之亦然,如果两个项目具有相同的身份,那么它们也是相等的(就可互换性而言)。想想“相同”和“等效”这两个词。如果两个事物是相同的,那么它们具有相同的身份;它们是一样的东西。如果它们相等,则可以在不影响结果的情况下用一个替换另一个;它们具有相同的行为和属性。例如 在StackOverFlow中:
- 身份:我是迈克尔,你是 sevugarajan,所以我们不一样
- 平等:如果我们
Integer c = new Integer(1); Integer d = new Integer(1);
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
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)