1. ==
a.如果比较的是基本数据类型,则直接比较其存储的值是否相等。
int i = 10;
int j = 10;
System.out.println(i ==j);
b.如果比较的是引用类型的变量,则比较的是所指向的对象的地址。
String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2);
2. equals
如果没有对equals方法进行重写,它和==的作用是一样的。
/**
** Object.java中equals的实现
**/
public boolean equals(Object obj) {
return (this == obj);
}
重写equals方法后可以实现两个对象"值"相等。重写equals方法时需要重写hashCode方法。
为什么重写equals需要重写hashCode?
java中对象的比较有如下规定:
- 应用执行期间,同一个对象内容不发生改变,无论经过多少次调用hashCode方法返回值必须是同一个值。
- 如果两个对象equals方法比较是相等的,那么所两个对象的的hashcode也必须一样。
- 如果两个对象equals方法比较是不相等的,那么两个对象的hashcode可能一样,也可能不一样。
为了保证equals相等时对象hashcode必须相等,一般重写equals方法时需要重写hashCode方法。
案例
下面以学生为例来演示重写equals和hashCode方法。
class Student {
private String name;
private int age;
public Student(String name, int age) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
/**
* 姓名和年龄都相等才相等
* @param obj
* @return
*/
@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 (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
}
public class EqualsDemo {
public static void main(String[] args) {
Student stu1 = new Student("name1", 20);
Student stu2 = new Student("name1", 20);
//两个对象 false
System.out.println("stu1 == stu2 : " + (stu1 == stu2));
//值相等 true
System.out.println("stu1.equals(stu2) : " + stu1.equals(stu2));
}
}
运行结果:
stu1 == stu2 : false
stu1.equals(stu2) : true