https://yuanjiaoc.com/tutorial/article/10008https://yuanjiaoc.com/tutorial/article/10008
介绍
对象比较是面向对象编程语言的一个基本特性。
在本教程中,我们将探索允许比较对象的Java语言的一些特性。我们还将研究三方库中的此类特性。
==和!=操作符
让我们从==和!=操作符开始,它们可以分别判断两个Java对象是否相同。
基本数据类型
对于基本数据类型,相同意味着具有相同的值:
assertThat(1 == 1).isTrue();
由于自动开箱,这也适用于比较原始值与其包装类型对应的值:
Integer a = new Integer(1);
assertThat(1 == a).isTrue();
如果两个整数有不同的值,==操作符将返回false,而!=操作符将返回true。
对象
假设我们想比较两个具有相同值的Integer包装类型:
Integer a = new Integer(1);
Integer b = new Integer(1);
assertThat(a == b).isFalse();
通过比较两个对象,这些对象的值不是1。相反,它们在堆栈中的内存地址是不同的,因为两个对象都是使用new操作符创建的。如果我们将a赋值给b,则会得到不同的结果:
Integer a = new Integer(1);
Integer b = a;
assertThat(a == b).isTrue();
现在让我们看看当我们使用工厂方法Integer#valueOf时会发生什么:
Integer a = Integer.valueOf(1);
Integer b = Integer.valueOf(1);
assertThat(a == b).isTrue();
在这种情况下,它们被认为是相同的。这是因为valueOf()方法将Integer存储在缓存中,以避免创建太多具有相同值的包装器对象。因此,该方法为两个调用返回相同的Integer实例。 Java的字符串也是这样:
assertThat("Hello!" == "Hello!").isTrue();
但是,如果它们是使用new操作符创建的,那么它们就不一样了。
最后,两个空引用被认为是相同的,而任何非空对象被认为与空不同:
assertThat(null == null).isTrue();
assertThat("Hello!" == null).isFalse();
当然,相等操作符的行为可能是有限的。如果我们想要比较两个映射到不同地址的对象,并且根据它们的内部状态认为它们是相等的,该怎么办?我们将在下一节中看到如何做到这一点。
Object#equals 方法
。。。。。
转载地址:Java对象的比较|猿教程|