• Java基础之equals() 和 hashCode()


    equals()是Object中的一个方法:

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

    在Object中equals()方法返回结果其实是跟 == 返回的结果是一致的。但是,子类中对其进行了重写,如String

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

    此时,代表的含义是,只要两个对象的值相同(字段),这两个对象的equals()的结果便是相同的,这也是equals()的常见用法。

    Objecct中的hashCode()方法,

    hashCode()方法的作用是作为对象的散列值,在HashMap,HashSet,HashSet集合中,可以做到随机访问元素的效果。散列值的使用(hashCode())尽可能多的降低了元素之间进行比较的次数。默认情况下,hashCode方法是将对象的存储地址进行映射。(也就是说,大部分情况下,两个对象的地址相同,也就是同一个对象,它们的hashCode结果才为相同)

    1 public native int hashCode();

    关于hashCode()方法有:

    1.重写一个类的equals()方法,必须重写该类的hashCode()方法;

    2.equals()方法返回true 是 hashCode()返回同一个值的充分条件。(这也是equals()方法与hashCode()方法之间的关系)

    以下是String的hashCode()方法的实现:

    在这个实现中,hashCode()的值是String对象中的value字段值映射,结合String的equals()方法的实现,两个方法的实现都依赖于String的字段value,所以二者的结果基本上是一致的。

     1 public int hashCode() {
     2         int h = hash;//hash默认值为0
     3         if (h == 0 && value.length > 0) {
     4             char val[] = value;
     5 
     6             for (int i = 0; i < value.length; i++) {
     7                 h = 31 * h + val[i];
     8             }
     9             hash = h;
    10         }
    11         return h;
    12 }
  • 相关阅读:
    C++ 不用 < > 与 : ?运算符判断 a,b大小
    CentOS7 MariaDB10
    CentOS Linux 挂载NTFS
    Linux访问Windows共享
    Emacs配置与插件集记录
    驱动精妙耍流氓,强制安装"新毒霸"
    C# TextBox控件之大小写自动转换
    生活随笔
    显示外网IP
    MySql
  • 原文地址:https://www.cnblogs.com/gulingjingguai/p/8178901.html
Copyright © 2020-2023  润新知