在上Java课的时候老师经常提到==与equals区别,再加上又是高频面试题所以我决定自己整理一下。🆗下面上干货。
首先我们要明确==与equals区别
一、==的使用
==:运算符
1.可以使用在基本数据类型和引用数据类型中
2.如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定是同一类型)
如果比较的是引用数据类型变量:比较两个对象地址值是否相同。(即两个引用是否指向同一个对象实体)
补充:==符号使用时,必须保证符号两边的变量一致
二、equals()方法的使用:
1.是一个方法,而非运算符
2.只能适用于引用数据类型
3.关于自定义对象使用equals()为什么返回false
Object类中equals()的定义:
public boolean equals(Object obj) {
return (this == obj);
}
说明:Object类中定义的equals()和==的作用是相同的,比较两个对象地址值是否相同,即两个引用是否指向同一个对象实体。
4.像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,
比较的不是两个引用的地址是否相同,而是比较两个对象的“实体内容”是否相同。
5.通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的“实体内容”是否相同,那么我们就
需要对Object类中的equals()进行重写。(参照String重写方法)
重写原则:比较两个对象的实体内容是否相同,开发中自动调
下面是代码展示
public class 双等与equals区别 {
public static void main(String[] args) {
//基本数据类型
int a=6;
int b=6;
String t="6";
double d=6.0;
char c=6; //数6
char c1='6'; //字符6
System.out.println(a==b);
System.out.println(a==d); //int类型提升
System.out.println(c==c1); //false,‘6’对应ASCII值不是数6
System.out.println(a==c); //true,均是数6
//System.out.println(a==t); //不是一个数据类型无法比较(报错)
System.out.println("--------------------");
//引用数据类型
String t1="123";
String t2="123";
String t3=new String("123");
String t4=new String("123");
System.out.println(t1==t2); //true
System.out.println(t1==t3); //false,t1和t3地址值不一样
System.out.println(t3==t4); //false, t3对象和t4对象实体不一样
Student s1 = new Student("Tom", 19) ;
Student s2 = new Student("Tom", 19) ;
System.out.println(s1==s2); //false,==比较的是两个对象地址值是否相等
System.out.println("----------------------");
//equals()方法
System.out.println(s1.equals(s2)); //false,见说明中解释 false-->true
System.out.println(t3.equals(t4)); //true,String重写了equals方法
}
}
Student类以及重写equals()代码展示
import java.util.Objects;
public class Student {
private String name;
private int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//重写原则:比较两个对象的实体内容(即:name和age)是否相同
//自动生成的equals() 一般都自动生成,但是手写要知道
@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;
return age == other.age && Objects.equals(name, other.name);
}
//手动实现equals()的重写
// public boolean equals(Object obj) {
// if (this == obj) {
// return true;
// }
// if (obj instanceof Student) {
// Student s = (Student)obj;
//比较两个对象的每个属性是否都相同
// if (this.age == s.age && this.name.equals(s.name)) {
// return true;
// }else {
// return false;
// }
//或
// return this.age == s.age && this.name.equals(s.name);
// }else {
// return false;
// }
// }
}
总结
1、==既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址。
2、equals它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也是==;我们可以看到String等类的equals方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equals是比较值的错误观点。
3、具体要看自定义类里有没有重写Object的equals方法来判断。
4、通常情况下,重写equals方法,会比较类中的相应属性是否都相等