繁体   English   中英

equals(),hashcode()和compare()方法真正发生了什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM