我们平常在Java开发中,equal一般用于String的比较,或者是对对象的equal方法进行重写。而==一般用于基本数据类型的比较,例如int值之间的对比,那它们之间具体有什么区别呢,这里做一个总结。
==总结
在比较基本数据类型时,Java几大数据类型:byte,short,char,int,long,float,double,boolean,他们之间的比较,应用双等号(==),比较的是他们的值。
在使用==比较对象时,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。所以我们一般不能使用==来进行对象之间的比较。
以下是代码演示
public class Main {
public static void main(String[] args){
int a = 1;
int b = 1;
Student student1 = new Student("aaa", 10);
Student student2 = new Student("aaa", 10);
if(a == b){
System.out.println("a == b");
}else {
System.out.println("a != b");
}
if(student1 == student2){
System.out.println("student1 == student2");
}else {
System.out.println("student1 != student2");
}
}
}
程序输出结果
equals总结
JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。
所以在没有重写student类的equals方法之前
public class Main {
public static void main(String[] args){
Student student1 = new Student("aaa", 10);
Student student2 = new Student("aaa", 10);
if(student1.equals(student2)){
System.out.println("student1 equals student2");
}else {
System.out.println("student1 not equals student2");
}
}
}
程序输出结果
但是String可以直接使用equals方法进行比较,是因为String已经重写了equals,所以这会儿我们想用equals方法来比较Student,也需要对Student的equals方法进行重写。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
重写hashcode是为了让它在hashset中也能生效,这里不详细阐述
可以看到这会儿再进行比较,就是相等的结果了