“==”比较的是什么
-
对于基本类型(int,char,byte,float,double,short,long,boolean)直接比较的是值
-
对于引用数据类型比较的对象的地址,因为使用new出来的对象都是存储在堆中的,变量是用来存储对象的地址。
下面举几个例子来看一下结果
基本类型的比较
package com.sun.practise;
public class Test2 {
public static void main(String[] args) {
int aa=1,bb=2,cc=1;
System.out.println(aa==bb);
System.out.println(aa==cc);
}
}
结果:
D:\studyapp\jdk8\bin\java.exe -
false
true
Process finished with exit code 0
引用类型的比较
//创建一个Person类
package com.sun.practise;
public class Person {
private int age;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//主函数
package com.sun.practise;
public class Test2 {
public static void main(String[] args) {
Person p1 = new Person(21,"sun");
Person p2 = new Person(21,"sun");
System.out.println(p1 == p2);
}
}
结果:
D:\studyapp\jdk8\bin\java.exe -
false
Process finished with exit code 0
可以看到我们创建了两个对象,这两个对象的age和name都是一样的,但是比较的结果不同,如下图。
equals的比较
java中所有的对象都是Object的子类,equals是在Object中实现的,因此所有的类都应该有这个方法。
看一下equals在Object中的定义。
返回的是return (this == obj);,直接比较两个对象,this和obj分别返回toString()方法的返回值,这个方法在Obejct中有定义。
下面我们看toString
因此还需要看你hashCode的实现,在Object中有实现。
这个方法是内部实现的我们看不到,和内存地址相关,不过很多的对象都会重写这个方法。
Integer重写的hashCode
不同的对象的hashCode的实现是不同的,如果是我们自定义的对象,并且没有重写hashCode和equals,再使用equals比较便是比较的地址,是否是同一个对象,通常我们需要自己重写equals这个方法。