学无止境,周末也得学习,今天看大佬们的博客看见个有趣的东西,也是Java面试的基础面试题,于是兴趣就来了,整理了一下我自己对于“==”和equals的初步理解吧。
1、物理上相等,即就是同一对象
2、逻辑上相等,不是同一对象,但是对象的内容相等(如字面量相等)
“==”可用于判断基本数据类型的相等性,也可判断需要比较的两个对象的引用地址是否相等,得出两个对象是否为同一对象。
代码如下(示例):
public class Test01 {
public static void main(String[] args) {
// 创建一个对象,两个变量都引用这个这个对象
String str1 = new String();
String str2 = str1;
System.out.println("两变量引用一对象比较结果为:"+(str1==str2));
// 创建两个对象,两个变量分别引用这个这两个对象
String str3 = new String();
String str4 = new String();
System.out.println("两个变量分别引用两个对象比较结果为:"+(str3==str4));
}
}
代码如下(输出):
两变量引用一对象比较结果为:true
两个变量分别引用两个对象比较结果为:false
当一个对象两个变量都引用的时候比较它们两内存地址是相同的,所以两个变量则值是相等的,返回的是true。当两个变量分别引用两个对象时,比较它们两内存地址是不相同的,所以两个变量则值是不相等的,返回的是false。
equals方法默认比较的是对象的引用地址,从根源来说equals的作用和“==”是相同的。
equals方法原码如下
从原码可以看见equals的方法就是“==”一样的
所以想要这个方法发挥作用——比较对象内容,就得重写这个方法
首先我们建立一个学生类,在学生类中将从祖宗类object继承过来的equals重写,左键里面source 里面就有一个Generate hashCode开头的点一下全选编辑好的 属性就可以直接生成重写代码
代码如下(示例):
public class Student {
private String name;
private String id;
public Student() {
}
public Student(String name, String id) {
super();
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
// 重写hashCode方法
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
// 重写equals方法
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
代码如下(测试):
public class Test02 {
public static void main(String[] args) {
Student student01 = new Student("张三", "123456789");
Student student02 = new Student("张三", "123456789");
Student student03 = new Student("张三", "987654321");
System.out.println("student01和student02相比结果为:"+student01.equals(student02));
System.out.println("student01和student03相比结果为:"+student01.equals(student03));
}
}
代码如下(输出):
student01和student02相比结果为:true
student01和student03相比结果为:false
经过我们的重写的方法后equals方法终于发挥了它应有的作用,对比的是字面内容了,就比如student01和student02,一看就是一个人,姓名和身份证号都一样,比较返回的就应该是true ,但是如果不重写比较的就是内存地址了,返回的是false 这与我们的现实生活一点都不符合,而重写后的equals就符合我们所认同的信息了。
“= =”和重写后equals方法的区别是:
"= ="是一个运算符,即可以比较基本数据类型,也可以比较引用数据类型,基本数据类型比较的是值,引用数据类型比较的是两个被比较对象的内存地址。
equals是一个方法,只能比较引用数据类型,比较两个对象中的属性(字面量是否一致)。
如果不重写equals,那么它的功能就和“==”没有区别,就没有多大意义。