在java中如何判断两个对象是否相等?
1。“==”
Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.println(a==b);
返回结果是?false!因为“==”判断的是对象的句柄(物理地址),并不是对象中的内容!如果想判断对象中的内容是否相等只能用equals,当然对于基本数据类型的比较只能用“==”。
2.equals
还是上面的例子,使用a.equals(b)返回的就是true。如果我们自己创建了一个类Student代码如下:
public class Student {
private String stuName;
private String stuNo;
//get、set方法
public Student(){}
public Student(String stuName,String stuNo){
this.stuName = stuName;
this.stuNo = stuNo;
}
}
Student s1 = new Student("123","456");
Student s2 = new Student("123","456");
System.out.println((s1==s2)+"====="+s1.equals(s2));
返回结果都是false。why?因为我们创建的每个类都会默认继承Object(所有类的父类),在Object中equals的源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
很显然方法还是判断的两个对象的句柄是否相同,那我们如何才能实现equals判断内容相同时返回true呢,我们必须对equals方法进行重写。在原有代码中添加
public boolean equals(Object obj) {//Object中的此方法比较的是句柄
if(obj==null){//1.看对象是否为空
return false;
}
if(this==obj){ //2.看对象的句柄是否相同
return true;
}
if(!(obj instanceof Student)){//3.看对象类型是否相同,然后再看内容是否相同
return false;
}else{
Student s = (Student)obj;
return (s.stuName==this.stuName)&&(s.stuNo==this.stuNo);
}
}
此时在调用equals时返回的就是true。注:在上面的代码中说明了重写equals的步骤。
此时我们再看下面这个例子,代码如下:
Student s1 = new Student("123","456");
Student s2 = new Student("123","456");
Map<Student,String> map = new HashMap<Student,String>();
map.put(s1, "11");
map.put(s2, "11");
System.out.println(map.size());
按理说map中的数据应该就有一条记录,但是此时返回的是2.why?这就和hashcode有关了,下面我解释一下java中的hashcode方法。
3.hashcode
大家都知道hashcode这个方法是父类Object中的方法,我们先看一下源码:
public native int hashCode();
它是一个本地方法,也就是说是和个人的计算机有关的,返回的是个哈希码。先说明一下map存放数据的规则,首先大家都知道在map中是不允许存放重复数据的,也就是说一个key对应一个value。那么判断key是否唯一的标准是什么呢,首先满足equals返回true,其次是hashcode的返回值相同。所以一般来说,在重新equals方法之后都要对hashcode方法进行重写。在原有代码中添加如下代码:
public int hashCode() {
int number = 25;
if(this.stuName!=null){
number+=this.stuName.length();
}
if(this.stuNo!=null){
number+=this.stuNo.length();
}
return number;
}
此时map中的值就只有一个了。
4.总结
在判断对象是否相等的时候(一般都是判断对象内容是否相等)采用equals方法,对于基本数据类型的判断只能使用“==”;
如果我们创建类的时候重写了equals方法,那么我们必然也要重写hashcode方法;
对象相等hashcode必然相等,但hashcode相同对象未必相等。