"==的解读:
对于基本类型和引用类型==的效果是不同的,如下所示:
(1)基本类型:比较的是值是否相同;
(2)引用类型:比较的是引用是否相同
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。
"equals的解读:
equals本质上就是==,只是String和integer等重写了equals方法,把它变成了值比较。默认情况下 equals 比较一个有相同值的对象
classCat{
publicCat(String name){
this.name = name;
}
private String name;
public String getName(){
return name;
}
publicvoidsetName(String name){
this.name = name;
}
}
Cat c1 = new Cat("王磊");
Cat c2 = new Cat("王磊");
System.out.println(c1.equals(c2)); // false
结果是 false,为什么呢?看看 equals 源码
publicbooleanequals(Object obj){
return (this == obj);
}
equals 本质上就是 ==。
总结:
== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;
而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。
📌例题1
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/10ad78064f45332ea3446e58585d9cb1.png)
❌(1)p1==p2 False
==可以用在引用类型,也可以用在基本类型
如果是引用类型,判断2个对象是否相等,p1和p2是分别new出来的,所以不相等
✔️(2)p1.names.equals(p2.name)
p1.namess是字符串,字符串将equals方法重写了,比较的是内容,p1的内容与p2相同,因此为真
❌(3)p1.equals(p2)
P1是person,自己定义的类并没有重写equals,这里的equals来自于其父类object,object equals默认两个对象是否相等,所以错误。与(1)类似
✔️(4)s1.equals(s2)
字符串的equals被重写,所以判断内容是否相同,为真。String,integer默认重写了父类Object的equals方法
❌(4)s1==s2
s1和s2不是同一个对象,所以为假
📌例题2
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0041515c35b273052e5b0e857f142e34.png)
✔️(1)it==fl
基本数据类型判断的是值是否相等
✔️(2)it==ch1
大写的A是否等于65
✔️(3)it==ch2
值相等
❌(4)str1==str2
str1和str2不是同一个对象,所以为假
大写的A是否等于65
✔️(4)it==ch2
内容相等
✔️(5)
编译器报错