1."=="既可以比较基本数据类型也可以比较引用数据类型。比较基本数据数据类型时,比较的是值得大小,与类型无关。比较引用数据类型时,比较的是内存地址。
//基本数据类型
int i = 10;
int j = 10;
double d = 10.0;
char c = 10;
System.out.println(i == j); //true
System.out.println(i == d); //true
System.out.println(i == c); //true
//引用数据类型
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2); //false
//可以理解为str1和str2指向内存中两块不同的空间,
//所以str1和str2存储的地址值不相同,所以二者不相等。
2.equals属于,java.lang.Object类里的方法,如果该方法没有被重写默认也是==,我们可以看到String等类的equals方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equals是比较值得错误观点。
//Jeava中所有的类都直接或间接的继承自Object类
//Object类中equals()的定义
public boolean equals(Object obj){
return(this == obj);
}
//obj是一个引用,存储的是对象的地址,this同理。
//所以该方法如果不被重写,作用与==相同。
3.具体要看自定义类里有没有重写Object得equals方法来判断。像String, Date, File, 包装类都重写了Object类中的equals方法,重写后比较的是两个对象的实体内容是否相同。
4.通常情况下,重写equals方法,会比较类中的相应属性是否都相等。
public class Customer {
String name;
int age;
@Override
public boolean equals(Object obj) {
if (this == obj) { //两者指向内存中同一块空间
return true;
}
if (!(obj instanceof Customer)) {//对象obj不属于类Customer
return false;
}
Customer other = (Customer) obj;//强制类型转换
return age == other.age && Objects.equals(name, other.name);
}
}
eclipse自动生成equals方法:
source -> Generate hashCode() and equals()
以上内容总结自b站,宋红康老师的视频