equals(),==,hashcode()
程序员文章站
2024-03-22 17:46:28
...
equals和==
1“==”判断两个引用对象是否指向同一内存地址
2“equals()”判断两者的内容是否相等属于java.lang.Object的方法。每个子类可以覆写该方法来实现自己的内容相等。
3“equals()”Object类中默认是靠" ==”识别,但是其他类像Integer,String会覆盖掉实现自己的equals方法;
String a = new String("abc");
String b = new String("abc");
System.out.println(a==b);//false
System.out.println(a.equals(b));//true
String c = "aaa";//放入常量池
String d = "aaa";//判断常量词已经有了就去常量池的引用
System.out.println(c==d);//true
System.out.println(c.equals(d));//true
String 类型的equals覆写
public boolean equals(Object object){
Object a = object;
if(a.instaceof("String")){
String b = (String)a;
int len1=b.length();
int len2=this.length();
if(len1!=len2) return false;
int k=0;
while(k<len){
if(b.value[k]!=this.value[k]){
return false;
}
k++;
}
return true;
}
return false;
}
hashcode()和equals()
由来,在set无序集合中,存储着很多很多个对象,我们每插入一个理应将新插入的对象 a,与其他对象做比较,a.equals(other);但是这样太过浪费时间。
首先我们利用hashcode()去计算,每个对象很容易计算自己的hashcode();
首先hashcode()相等了,他们有可能相等。
如果hashcode()不等那么他们就一定就不等。
这句话很重要,可以思考下
我们利用这个特性很快就能推断出他们是否不等。
equals()和hashcode()的联系
1equals相等,hashcode()理应相等。
2hashcode()相等,equals不一定相等。
3重写equals方法时,一定要重写hashcode()来保持一致。
我们看下面这个例子如果不覆写hashcode()的后果
public class HashDemo {
public static void main(String[] args) {
Person person = new Person("a");
Person person1 = new Person("a");
System.out.println(person.equals(person1));
HashSet<Person> people = new HashSet<>();
people.add(person);
people.add(person1);
System.out.println(people.size());
}
}
//自定义Person类,我们认为如果person对象的字段a相等,那么他们理应为同一对象,添加到set是理应被判断为同一对象。
class Person {
String a;
public Person(String a) {
this.a = a;
}
@Override
public boolean equals(Object obj) {
if (obj==null) return false;
if (this == obj) {
return true;
}
if (obj.getClass() == this.getClass()) {
Person person =(Person) obj;
if (this.a==person.a) {
return true;
}
}
return false;
}
}
最后结果
true
2
原因set认为他们不是同一对象,因为没有覆写hashcode()方法。set判断对象是否是同一对象先用hashcode方法判断他们是否相等,不等直接就抛出false(相等时才继续执行equals方法)所以我们需要覆写hashcode();
class Person {
String a;
public Person(String a) {
this.a = a;
}
@Override
public boolean equals(Object obj) {
if (obj==null) return false;
if (this == obj) {
return true;
}
if (obj.getClass() == this.getClass()) {
Person person =(Person) obj;
if (this.a==person.a) {
return true;
}
}
return false;
}
@Override
public int hashCode() {
//使用字符串的hashcode方法来覆盖。
return a.hashCode();
}
}
覆写hashcode()结果为
true
1