0.1)本文转自 core java volume 1, 旨在理清 equals + hashCode方法;
1.1) Object中的 equals 方法用于检测一个对象是否等于另外一个对象;(在Object类中, 这个方法比较的是内存地址, 判断的是两个对象是否具有相同引用)
1.2)看个荔枝:
Hint)
return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);
1.3)在子类中定义 equals 方法时, 首先调用超类的 equals; 如果检测失败,对象就不可能相等, 如果超类中的域都相等, 就需要比较子类中的实例域;
1.4)java语言规范要求 equals 具有以下特性:
1.5)出现的问题+解决方法
Hint)对于数组类型的域, 可以使用静态的Arrays.equals 方法检测相应的 数组元素是否相等;
Alert)看个荔枝(下面是实现 equals 方法的一种常见的错误):
代码分析(Analysis):
A2)为了避免发生类型错误, 可以使用 @Override 对覆盖超类的方法进行标记;
@Overridepublic boolean equals(Object other)
A3)如果出现了错误,并且正在定义一个新方法,编译器就会给出 错误报告;如, 假设将下面的声明添加到 Employee类中, 就会看到一个错误报告, 这是因为这个方法并没有覆盖超类Object 中的 任何方法:
@Override public boolean equals(Employee other)
3.1)定义:散列码是由对象导出的一个整型值, 散列码没有规律的;如,x和y 是两个不同的对象, x.hashCode() 和 y.hashCode() 基本上不会相同的;
3.2)String 类的 hashCode 散列码:
3.2.1)String类通过下列算法计算散列码:
int hash = 0;for(int i=0;i<length(); i++)hash = 31 * hash + charAt(i);
3.2.2) hashCode方法定义在了 Object类, 因此每个对象都有一个默认的散列码, 其值为对象的存储地址:
对以上打印结果的分析(Analysis):
3.3)看个荔枝, 下面是 Employee类 的 hashCode方法:
3.4)还可以在java7中做两个改进(imPRovement):
I2)还有一个方法: 需要组合多个散列值, 可以调用 Objects.hash 并提供多个参数,这个方法会对各个参数调用 Objects.hashCode, 并组合这些散列值; 如 Employee.hashCode 的方法可以简写为:
public int hashCode(){return Objects.hash(name, salary, hireDay);}
Attention)
A2) 如, 如果用定义的Employee.equals 比较雇员的Id, 那么 hashCode就需要散列Id, 而不是 雇员的 姓名或存储地址;
Hint)如果存在数组类型的域, 那么可以使用静态的 Arrays.hashCode 方法计算一个散列码, 这个散列码由数组元素的散列码组成;
新闻热点
疑难解答