equals 和==的区别
==:默认判断的是两个对象的内存地址是否一致,很少用在判断对象,一般用在基本数据类型是否相同
在这里插入图片
描述
equals:是默认调用object里面自带的一个方法,用来判断两个对象是否相等,String类里面重写了equals方法,比较的是字符串里内容。equals我们自己也可以重写
public boolean equals(Object obj) {
return (this == obj);
}//equals源码
package Cainiao;
public class Cat {
String name;
String color;
public Cat(String name ,String color) {
this.name=name;
this.color=color;
}
public static void main(String[] args) {
Cat c1=new Cat("小喵","白色");
Cat c2=new Cat("小喵","白色");
System.out.println(c1==c2);
System.out.println(c1.equals(c2));
}
}
如果要人为两只猫的颜色相等的就是相等的,那么就要重写Object中的equals的方法,调用的就是子类的equals的方法
package Cainiao;
public class Cat {
String name;
String color;
public Cat(String name ,String color) {
this.name=name;
this.color=color;
}
// 这时写@Override会报错,所以注掉
public boolean equals(Cat c) {
if(this.color==c.color) {
return true;
}else {
return false;
}
}
public static void main(String[] args) {
Cat c1=new Cat("小喵","白色");
Cat c2=new Cat("小花","白色");
System.out.println(c1==c2);
System.out.println(c1.equals(c2));
}
}
String 里也重写了equals方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (!COMPACT_STRINGS || this.coder == aString.coder) {
return StringLatin1.equals(value, aString.value);
}
}
return false;
}//String类 里也重写的equals方法
package Cainiao;
public class Test {
public static void main(String[] args) {
String str1="小红";
String str2="小红";//第二的小红并没有单独占用空间
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
}
}
str1 和str2都是String类型,两个名字不同的容器,但里面都是装的都是“小红”,在方法区指向的是同一个地址,就是“小红”所在的位置
package Cainiao;
public class Test {
public static void main(String[] args) {
String str3= new String("小红");
String str4= new String("小红");
System.out.println(str3==str4);//判断的是地址,st3和str4指向的是堆里的两个不同的对象
System.out.println(str3.equals(str4));//true的原因是String类里重写的equals的方法比较的是两个字符串的内容是否一致
}
}
所以字符串的判断一定要用equals,否则无意义
}
[外链图片转存中...(img-KXfYEwLy-1623024043840)]
[外链图片转存中...(img-fHELXXBk-1623024043841)]
所以字符串的判断一定要用equals