==和equals的区别和联系
“==”是关系运算符,equals()是方法,同时他们的结果都返回布尔值;
“==”使用情况如下:
a) 基本类型,比较的是值
b) 引用类型,比较的是地址
c) 不能比较没有父子关系的两个对象
equals()方法使用如下:
- 系统类一般已经覆盖了equals()方法,比较的是内容,比如Integer等包装类,String类型(引用类型重写了equals方法)。
- 用户自定义类如果没有覆盖equals(),将调用父类的equals (比如是Object),而Object的equals的比较是地址
- 用户自定义类需要重写equals()方法
注意:Object类型的==和equals比较的都是地址,作用相同
通过源码来分析一下,顺便写几个例子测试一下
String类型的equals源码(内部已经重写了equals方法)
public boolean equals(Object anObject) {
//如果当前对象和equals方法里面的对象的地址相等,返回true
if (this == anObject) {
return true;
}
//如果对象属于String类型,它会将String字符串转换为一个字符数组,然后一一比较字符数组的每一个字符,也就是说比较的内容
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;
}
demo1(测试String类型)
String s1=new String("123");
String s2=new String("123");
System.out.println("String的两个变量"+s1.equals(s2));//true
Integer类型(基本数据类型包装类)equals源码
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
demo2(测试Integer类型)
Integer a =new Integer(300);
Integer b =new Integer(300);
System.out.println(a.equals(b));//true
demo3(自定义类型,没有重写equals方法,默认继承Object的equals方法)
public class User {
private String username;
private String password;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
Object类型equals方法源码
//可以看到内部就是通过==比较的,比的是地址
public boolean equals(Object obj) {
return (this == obj);
}
测试
//因为没有重写equals方法,默认继承Object的equals方法比的是地址,所以是false
User u1=new User("张三","123");
User u2 =new User("张三","123");
System.out.println("User对象没有重写equals方法"+u1.equals(u2));//false
demo4(自定义类型,重写equals方法)
注意:一般重写equals方法的同时要重写hashcode方法,默认规定
package testEqualsAndDengdeng;
import java.util.Objects;
public class User {
private String username;
private String password;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(username, user.username) &&
Objects.equals(password, user.password);
}
@Override
public int hashCode() {
return Objects.hash(username, password);
}
}
测试
//这里因为已经重写了equals方法,所以结果为true
User u1=new User("张三","123");
User u2 =new User("张三","123");
System.out.println("User对象没有重写equals方法"+u1.equals(u2));//true