Java中的equals方法和自定义比较器

Object中的equals()方法默认是按地址比较,而不按内容进行比较,

1
2
3
public boolean equals(Object obj) {
       return (this == obj);
}

在String中覆写了Object中的equals方法,以用于判断字符串是否相同,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public boolean equals(Object anObject) {
     if (this == anObject) {
         return true;
     }
     if (anObject instanceof String) {
         String anotherString = (String) anObject;
         int n = value.length;
         if (n == anotherString.value.length) {
             char v1[] = value;
             char v2[] = anotherString.value;
             int i = 0;
             while (n-- != 0) {
                 if (v1[i] != v2[i])
                         return false;
                 i++;
             }
             return true;
         }
     }
     return false;
 }

"上帝"Object中equals方法可以被子类重写,然后多态调用,当我们要自定义对象比较时一般要覆写equals方法,比如有Person对象,同姓名同年龄,视为同一个对象,

1
2
3
4
5
6
7
public boolean equals(Object obj)
{
    if(!(obj instanceof Person))
        return false;
    Person p = (Person)obj;
    return this.name.equals(p.name) && this.age == p.age;
}   

List集合判断元素是否相同,依据是元素的equals方法。

如果要将自定义对象存入到HashSet中,则要覆写hashCode()和equals():

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public int hashCode()
{
    //System.out.println(this.name+"....hashCode");
    return name.hashCode()+age*11;
}
 
public boolean equals(Object obj)
{
    if(!(obj instanceof Person))
        return false;
    Person p = (Person)obj;
     
    //System.out.println(this.name+"....equals..."+p.name);
    return this.name.equals(p.name) && this.age==p.age;
}

HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
            HashSet是如何保证元素唯一性的呢?是通过元素的两个方法,hashCode和equals来完成。
            如果元素的HashCode值相同,才会判断equals是否为true。
            如果元素的hashcode值不同,不会调用equals。
注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。


自定义比较器:

当元素自身不具备比较性,或者具备的比较性不是所需要的,这时需要让容器自身具备比较性。
当两种排序都存在时,以比较器为主。
方式1:定义一个类,实现Comparable接口,覆盖compareTo方法。

方式2:定义一个类,还要再自定义一个比较器实现Comparator接口,覆盖compare方法。

定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

 

posted @   iadanac  阅读(1170)  评论(0编辑  收藏  举报
编辑推荐:
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
阅读排行:
· 趁着过年的时候手搓了一个低代码框架
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现
点击右上角即可分享
微信分享提示