很多人会忽略判断==和判断equals()的区别,也有不少人认为==和equals判断方法就是一致的,那不妨试想一下,两种一致的判断类型,怎么会有两种不同的写法呢。有一种很多人都知道的区别,==能用来判断int类型的数据,但判断string类型的数据会报错,因此equals方法的判断便是用来解决这个问题的。下面总结了两个==和equals()的区别:①==是运算符,equals()是方法 ②==判断引用数据类型是比较内存地址,equals()也是比较内存地址,但是重写equals()则比较内容,比如String类的equals()
下面上代码:
public class Demo01{
public static void main(String[] args){
String str1 = new String("abc");
String str2 = new String("abc");
String str3 = "abc";
String str4 = "abc";
System.out.println(str1 == str2);//false
System.out.println(str3 == str2);//false
System.out.println(str3 == str4);//true
System.out.println(str1.equals(str2));//true
System.out.println(str2.equals(str3));//true
System.out.println(str3.equals(str4));//true
}
}
public class Demo02{
public static void main(String[] args){
Object obj = new Object();
}
}
关于equals()方法的重写:
public class Demo05 {
public static void main(String[] args) {
User user1 = new User("张三",18);
User user2 = new User("张三",18);
System.out.println(user1==user2);
System.out.println(user1.equals(user2));
}
}
public class User {
private String name;
private int age;
public User(){
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
此时运行程序,返回的结果是两个false,但是在对象类重写了代码equals方法,结果便是false/true
@Override
public boolean equals(Object obj) {
//比较内存地址
if (this == obj){
return true;
}
//判断数据类型是否为User
if (obj instanceof User){
User user =(User)obj;
//比较内容 name/age属性
if (!this.getName().equals(user.getName())) {
return false;
}
if(this.getAge()!=user.getAge()){
return false;
}
//比较...属性
return true;
}
return false;
}
String类的equals()方法底层代码: