equals()和 == 的区别
区别
定义
-
equals()比较的是值和hashCode码,==比较的是内存地址
-
Object类重写了equals(),比较的是对象的内存地址
点击查看详细代码
/*
*我们查看Object类equals()的源码可以知道,equals()接受的参数就是对象本身,所以比较的是内存地址
*/
public boolean equals(Object obj) {
return (this == obj);
}
- String类继承了Object类,重写了Object类的equals(),比较的是对象的值和hasCode码
点击查看详细代码
/*
*查看String类equals()的源码,判断参数是否为String类,之后对值进行判断,这里比较的是对象的值
*/
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
- 如果要重写equals(),必须重写hashCode()
测试
点击查看详细代码
/*
*重写equals()
*/
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
//判断内存地址是否相同
@Override
public boolean equals(Object obj) {
if(obj instanceof User) {//首先判断obj是否为User对象
User u = (User)obj;//强制把obj转成User
if(this.name != null && this.name.equals(u.name) && this.age == u.age) {
return true;
}
}
return false;
}
@Override
public int hashCode() {
return this.age * 30;
}
public static void main(String[] args) {
User user1 = new User("二狗", 12);
User user2 = new User("二狗", 12);
System.out.println(user1 == user2);
System.out.println(user1.equals(user2));
System.out.println("usur1:" + user1.hashCode() + " " + "user2:" + user2.hashCode());
System.out.println("user1内存地址:" + user1 + " " + "user2内存地址:" + user2);
}
}
- 未重写equals()时运行结果:new对象user1和user2变量名称存放在栈内存中,这两个对象分别指向存放在堆内存中的数据,==比较的是内存地址,所以为false,object类的equals()比较的是内存地址,所以为false
false
false
usur1:460141958 user2:1163157884
user1内存地址:chx.User@1b6d3586 user2内存地址:chx.User@4554617c
- 重写equals()之后的运行结果:栈内存中的变量user1指向堆内存中的user1数据,栈内存中的变量user2指向堆内存中的user2数据,==比较的是内存地址,所以为false,重写equals()后堆内存中user2的数据指向栈内存中user1的引用,栈内存中user1和user2都指向堆内存中user1的数据,比较内存地址是一致,所以是true
false
true
usur1:360 user2:360
user1内存地址:chx.User@168 user2内存地址:chx.User@168
重写equals()之后的比较的是hashCode码和内存地址,所以返回的结果为true