标题== 与equals() 的联系
==
号在比较时,无论变量是基本类型还是引用类型,比较的都是变量的值。
- 基本变量的值就是我们看到的值。
- 引用变量的值是一个指向堆内存地址的值,一个指针(Java 没有指针的 概念),一个引用,本质上也是一个值。
默认情况下,从Object继承而来的 equals 方法与 = 是完全等价的,因为底层调用的是 = 号,但我们可以重写equals方法,使其按照我们的需求方式进行比较。
public boolean equals(Object obj) {
return (this == obj);
}
二者的区别
这两个本质上是一样的,非要说区别的话,那就是 equals 是Object 类中的一个方法,支持在子类中按照自己的意愿重写比较逻辑,仅此而已。
==
:判断两个对象是否是同一个。
equals
:(重写后)比较两个变量是否的等价。
示例代码
package com.jj.eq;
import org.junit.jupiter.api.Test;
public class TestEqual {
@Test
public void testEqual() {
String s1 = "abc";//常量池中
String s2 = "abc";//常量池中
/*
1、 == :比较变量的值是否相等.
2、s1和 s2都是引用变量,此时变量的值是,其值是引用对象的地址.
3、"abc" 在常量池中复用,是同一个对象,因此 s1和 s2的值 是用一个引用,因此 s1==s2,返回true
*/
System.out.println(s1 == s2);
/*
s1.equals(s2) : 比较两个对象的值是否相等,即比较两个对象的内容是否相等;true
*/
System.out.println(s1.equals(s2));//比较值变量的值是否相等;true
System.out.println(s1.hashCode());//获取对象的哈希码;96354
System.out.println(s2.hashCode());//获取对象的哈希码;96354
System.out.println("identityHashCode(s1) = "+System.identityHashCode(s1));//获取对象的哈希码;1800031768
System.out.println("identityHashCode(s12) = "+System.identityHashCode(s2));//获取对象的哈希码;1800031768
}
@Test
public void testEqual2() {
/*
s1 和 s2 都是引用变量,它们引用的(值)是堆中的不同对象,因此 s1==s2,返回false
*/
String s1 = new String("good");//堆中,s1指向堆中的对象
String s2 = new String("good");//堆中,s2指向堆中的另一个对象,值与s1的值相同
/*
s1 == s2 : 比较两个对象的地址是否相等,即比较两个对象的地址是否相等;false
*/
System.out.println("(s1 == s2) = " + s1 == s2);//比较对象的地址是否相等;false
/*
s1.equals(s2) : 比较两个对象的值是否相等,即比较两个对象的内容是否相等;true
*/
System.out.println("s1.equals(s2) = " + s1.equals(s2));//比较对象的值是否相等;true
System.out.println("s1.hashCode() = "+s1.hashCode());//获取对象的哈希码;3178685
System.out.println("s2.hashCode() = "+s2.hashCode());//获取对象的哈希码;3178685
System.out.println("identityHashCode(s1) = "+System.identityHashCode(s1));//获取对象的哈希码;1076770748
System.out.println("identityHashCode(s12) = "+System.identityHashCode(s2));//获取对象的哈希码;2041416495
}
@Test
public void testEqual3() {
Integer a = 128;
Integer b = 128;
System.out.println(a == b);// 输出:false, 因为两个对象的值相同,但是内存地址不同,所以不相等
System.out.println(a.hashCode());///获取对象的哈希码;128
System.out.println(b.hashCode());///获取对象的哈希码;128
System.out.println("identityHashCode(a) = "+System.identityHashCode(a));//获取对象的哈希码;2124643775
System.out.println("identityHashCode(b) = "+System.identityHashCode(b));//获取对象的哈希码;1262773598
}
}