Java中Set(HashSet,TreeSet)知识总结

equals()和hashCode()

使用Set类,Element必须重新定义equals(),最好同时重新定义hashCode()。
hashCode()和equals()的定义必须一致。以下定义方式来自《Java核心技术1》5.2节。

  • boolean equals( Object otherObject ) 比较两个对象是否相等,若两个对象指向同一块存储区域,返回true,否则返回false.
  • 定义hashCode():
public class Employee {
    String name;
    double salary;
    LocalDate hireDay;
    public int hashCode() {
        return Objects.hash(name,salary,hireDay);
    }
}
  • 定义boolean equals( Object otherObject )
public class Employee{
  ......
  @Override
  public boolean equals(Object otherObject) {

    if (otherObject == this) return true;
    if (otherObject == null) return false;
    if (getClass() != otherObject.getClass()) return false;
    Employee other = (Employee) otherObject;

    return Objects.equals(name, other.getName())
           &&salary==other.getSalary()
           &&Objects.equals(hireDay, other.getHireday());
  }
}

如果是在子类中定义equals(),那么就先调用超类的equals(),如下:

public class Manager extends Employee{
  ......
  @Override
  public boolean equals(Object otherObject) {

    if(!super.equals(otherObject)) return false;
    Manager other = (Manager) otherObject;
    return bonus == other.bonus;
  }
}

HashSet

  • HashSet必须重定义Element的hashCode()函数。
  • HashSet依据两个Object的Hash值来判断Element是否相等。

TreeSet

  • 使用TreeSet的Element必须定义比较器,可以使implements Comparable,也可以 implements Comparator。
  • TreeSet不仅会拒绝Hash值相等的Element,同时也会拒绝所定义的比较器认为相等的Element。
  • 参考1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 9,712评论 0 16
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 5,390评论 0 3
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,946评论 18 399
  • Java集合框架 Java平台提供了一个全新的集合框架。“集合框架”主要由一组用来操作对象的接口组成。不同接口描述...
    小石38阅读 2,885评论 0 0
  • 电影是一种高度集中的艺术表现形式,需要在两个多小时里叙述完一个完整的故事或交织穿插的好几个故事,一部好的电...
    玛格丽特不想念阅读 4,191评论 2 6