[英]What really happens inside equals(), hashcode() and compare() method?
我对hashcode()和equals()方法的实现感到非常困惑。 这是和平的代码。
class Employee {
int id;
String name;
public Employee(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public int hashCode() {
final int prime = 3;
int result = 1;
result = (prime * result) + id;
result = (prime * result) + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
Employee other = (Employee) obj;
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
[编辑1] 怀疑 1:每个比较的真正含义是什么?
现在,我已经实现了比较器接口及其方法。
class EmpNameComparator implements Comparator<Employee> {
@Override
public int compare(Employee a, Employee b) {
return a.name.compareToIgnoreCase(b.name);
}
}
[edit 2] 怀疑 2 :是要比较List <>中的两个辅助对象还是发生其他事情,它在内部做什么?
this == obj
检查当前对象是否与另一个对象相同 。
如果它们是相同的对象,那么它们当然也是“相等的”。
compareToIgnoreCase比较两个String
对象,忽略大写/小写的区别:
按字典顺序比较两个字符串,忽略大小写差异。 此方法返回一个整数,其符号是用规范化版本的字符串调用compareTo的字符串,该字符串通过在每个字符上调用Character.toLowerCase(Character.toUpperCase(character))消除了大小写差异。
因此,当您使用自定义比较器对Employee
列表进行排序时:
Collections.sort(employeeList, new EmpNameComparator());
具有相同名称(忽略大小写)的两名雇员将被视为同一雇员进行排序操作。
请注意,您无法确定John是否会出现在joHn之前或相反。
疑点1:所以这里真正发生的是什么,我知道这是指当前对象到当前对象,为什么我们将this == obj比较为相等。 每个比较的真正含义是什么?
当您执行this == obj
,基本上检查this
对象的参考与正在比较的对象(即obj
是否相同。
如果您正在调用equals()
那么它将根据您重写的equals()
方法来比较this
对象和被比较的对象(即obj
是否相同。 例如,仅当满足equals()
方法中的条件时, this.equals(obj)
才会返回true
。
由于您已经覆盖了hashCode()
方法,因此哈希代码的计算将由您覆盖的方法完成。
hashCode()
和equals()
之间有一个约定,如果要覆盖一个约定,则还应覆盖另一个约定,否则不能保证按预期工作。
疑问2:compareToIgnoreCase()是什么意思? 是要比较List <>中的两个辅助对象还是发生其他事情,它在内部做什么?
这只是两个对象成员的正常String比较。 在这种情况下,它将比较Employee a和Employee b的Employee
对象的name
成员。
与compareTo()
不同, compareToIgnoreCase()
进行不区分大小写的比较,即使两个字符串的大小写不同,也将返回true
。 例如,
fooBar
FooBAR
在这里, compareTo()
将返回false
但是compareToIgnoreCase()
将返回true
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.