一、Object类里面的equals方法,,源码如下图所示:
从上面源码图片可以看出Object类里面的equals方法也是使用 == 进行比较。
二、String类里面的equals方法,,源码如下图所示:
三、参考文献:
- 优美的讲解equals和==的区别
- 在java中==和equals()的区别
- 浅谈Java中equals()和==的区别
- Java中equals和==的区别 、链接2
- java:String使用equals和==比较的区别
- 关于==和equals的区别和联系,面试这么回答就可以
四、测试代码:
public class TestEquals {
public static void main(String[] args) {
// 把 abc 存入常量池中
String s1 = "abc";
// 从 常量池中找 abc
String s2 = "abc";
String s3 = s1;
String s4 = new String("abc");
String s5 = new String("abc");
// DogBean里没有重写 equals 方法
// Object 类里的 equals 方法 也是是调用 == 进行比较
DogBean dogBean1 = new DogBean("旺旺");
DogBean dogBean2 = new DogBean("旺旺");
DogBean dogBean3 = dogBean1;
PrintlnUtils.println("s1 hashCode:" + s1.hashCode() + ", s2.hashCode: " + s2.hashCode() + ", s3.hashCode: " + s3.hashCode() + ", s4.hashCode: " + s4.hashCode() + ", s5.hashCode: " + s5.hashCode());
PrintlnUtils.println("s1 identityHashCode:" + System.identityHashCode(s1) + ", s2 identityHashCode:" + System.identityHashCode(s2) + ", s3 identityHashCode:" + System.identityHashCode(s3) + ", s4 identityHashCode:" + System.identityHashCode(s4) + ", s5 identityHashCode:" + System.identityHashCode(s5));
PrintlnUtils.println("s1 == s2 : " + (s1 == s2) + ", s1 == s3 : " + (s1 == s3) + ", s1 == s4 :" + (s1 == s4) + ", s4 == s5 " + (s4 == s5));
PrintlnUtils.println("s1.equals(s2):" + s1.equals(s2) + ", s1.equals(s3):" + s1.equals(s3) + ", s1.equals(s4):" + s1.equals(s4) + ", s4.equals(s5):" + s4.equals(s5));
PrintlnUtils.println("dogBean1.hashCode: "+dogBean1.hashCode()+", dogBean2.hashCode: "+dogBean2.hashCode()+", dogBean3.hashCode: "+dogBean3.hashCode());
PrintlnUtils.println("dogBean1 identityHashCode:"+System.identityHashCode(dogBean1)+",dogBean2 identityHashCode: "+System.identityHashCode(dogBean2)+",dogBean3 identityHashCode: "+System.identityHashCode(dogBean3));
PrintlnUtils.println("dogBean1 == dogBean2 : "+(dogBean1 == dogBean2)+", dogBean1 == dogBean3: "+(dogBean1 == dogBean3));
PrintlnUtils.println("dogBean1.equals(dogBean2) : "+dogBean1.equals(dogBean2)+", dogBean1.equals(dogBean3): "+dogBean1.equals(dogBean3));
/*
java怎么打印一个对象的内存地址: https://blog.csdn.net/minolk/article/details/81873611
在Java一般使用HashCode来代表对象的地址,但是两个相同的对象就不行了,两个相同的对象的hashcode是相同的。
如果要对比两个相同的对象的地址可以使用,System.identityHashCode(传输进去的参数是一个对象)
*/
//s1 hashCode:96354, s2.hashCode: 96354, s3.hashCode: 96354, s4.hashCode: 96354, s5.hashCode: 96354
//
//s1 identityHashCode:1747585824, s2 identityHashCode:1747585824, s3 identityHashCode:1747585824, s4 identityHashCode:1023892928, s5 identityHashCode:558638686
//
//s1 == s2 : true, s1 == s3 : true, s1 == s4 :false, s4 == s5 false
//
//s1.equals(s2):true, s1.equals(s3):true, s1.equals(s4):true, s4.equals(s5):true
//
//dogBean1.hashCode: 381259350, dogBean2.hashCode: 2129789493, dogBean3.hashCode: 381259350
//
//dogBean1 identityHashCode:381259350,dogBean2 identityHashCode: 2129789493,dogBean3 identityHashCode: 381259350
//
//dogBean1 == dogBean2 : false, dogBean1 == dogBean3: true
//
//dogBean1.equals(dogBean2) : false, dogBean1.equals(dogBean3): true
}
/*
"=="操作符的作用
1、用于基本数据类型的比较
2、判断引用是否指向堆内存的同一块地址。
*/
}
public class DogBean {
public int age;
public String name;
public DogBean() {
}
public DogBean(String name) {
this.name = name;
}
public DogBean(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "DogBean{" +
"狗龄 = " + age +
", 狗狗名字 = '" + name + '\'' +
'}';
}
}
public class PrintlnUtils {
public static void println(String text) {
System.out.println(text + "\n");
}
public static void println(String text,String flag) {
System.out.println(text + "\n"+flag);
}
}
运行结果:
总结:
- ==是判断两个变量或实例是否指向同一个内存空间,
- equals是判断两个变量或实例所指向的内存空间的值是否相同
- == 是指对内存地址进行比较 ,equals()是对字符串的内容进行比较
- == 指引用是否相同,equals()指的是值是否相同
欢迎关注我的公众号,不定期推送优质的文章,
微信扫一扫下方二维码即可关注。