目录
Object类的equals():
JDK源码:
public boolean equals(Object obj) {
return (this == obj);
}
根据查看源码Object类的equals()方法用的是==比较,也就是说比较的是地址值。
引用类型的equals():
那么根据下边例子来证明我的猜想:
编写User.java文件,用来创建pojo对象:(注意该类没用重写父类的equals()方法)
public class User {
private String username;
private String password;
public User() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
创建test.java来测试:(输出的是不等和false)
User user1=new User("tom","11");
User user2=new User("tom","11");
//equals比较的是堆内存中new 的地址值
if (user1.equals(user2)){
System.out.println("相等");
}else {
System.out.println("不等");//没重写object的equals方法
}
System.out.println(user1==user2);//false
但是我明明创建的对象都是username : tom, password : 11;为什么还是输出false,那我根基需求对代码改进:
在User.java中重写Object的equals()方法:(再次输出:相等;false)
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
User user = (User) o;
return Objects.equals(getUsername(), user.getUsername()) &&
Objects.equals(getPassword(), user.getPassword());
}
基本类型的equalse():
String : 一个特别的类
String的equals()方法JDK源码:
private final char value[];
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;
}
听过源码我分析出:
如果字符串地址值相等:
证明字符串是相等的,返回true
如果不相等,且传递参数类型为String
判断两个字符串长度是否相等
如果相等则拆分成字符比较ASCII值
相等返回true;不同返回false;
在test.java来测试:(输出:相等;false;true)
String s1="11";
String s2=new String("11");
String s3="11";
if (s1.equals(s2)){
System.out.println("相等");
}
else {
System.out.println("不相等");
}
System.out.println(s1==s2);//比较地址值
System.out.println(s1==s3);
输出的结果证明的我的猜想:s1和s3指向同一块栈内存无论是用==或者equals()方法比较都是返回true;但是s1和s2虽然在数值上相等,但是s2是在堆内存中开辟了新的空间,用==比较盎然返回false,由于String类重写了Object的equals(0方法所以返回的是true.