zoukankan      html  css  js  c++  java
  • Java深入学习06:HashCode和equal方法

    Java深入学习06:HashCode和equal方法

     一、HashCode是什么

      hashcode就是通过hash函数得来的,通俗的说,就是通过某一种算法得到的,hashcode就是在hash表中有对应的位置。

      hash函数中的实现就是一种算法,就是通过一系列的算法来得到一个hash值。这个时候,我们就需要知道另一个东西,hash表,通过hash算法得到的hash值就在这张hash表中,也就是说,hash表就是所有的hash值组成的

    二、Object类的hashCode

    public native int hashCode();

      使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用。这些函数的实现体在DLL中,JDK的源代码中并不包含,你应该是看不到的。对于不同的平台它们也是不同的。这也是java的底层机制,实际上java就是在不同的平台上调用不同的native方法实现对操作系统的访问的。 

      补充说明:Java Object.hashCode()返回的是对象内存地址?不是!OpenJDK8 默认hashCode的计算方法是通过和当前线程有关的一个随机数+三个确定值,运用Marsaglia's xorshift scheme随机数算法得到的一个随机数。和对象内存地址无关。

    三、String类的hashCode

        private int hash; // Default to 0
       private final char value[];
      //s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]
        public int hashCode() {
            int h = hash;
            if (h == 0 && value.length > 0) {
                char val[] = value;
    
                for (int i = 0; i < value.length; i++) {
                    h = 31 * h + val[i];
                }
                hash = h;
            }
            return h;
        }

    一、euqal()方法是什么

      Object类的equal()方法中的描述是:Indicates whether some other object is "equal to" this one。即判断两个对象是否相同。

    二、Object类的equal()方法

    public boolean equals(Object obj) {
         //比较引用是否一样
    return (this == obj); }

    三、String类的equal()方法

        public boolean equals(Object anObject) {
            //比较地址引用是否相同
            if (this == anObject) {
                return true;
            }
            //如果地址引用不一样,则比较字符串的内容,逐一比较
            if (anObject instanceof String) {
                String anotherString = (String)anObject;
                int n = value.length;
                if (n == anotherString.value.length) {
                    char v1[] = value;
                    char v2[] = anotherString.value;
                    int i = 0;
                    while (n-- != 0) {
                        if (v1[i] != v2[i])
                            return false;
                        i++;
                    }
                    return true;
                }
            }
            return false;
        }

    四、equal()方法的性质

    • 自反性(reflexive)。对于任意不为null的引用值x,x.equals(x)一定是true。
    • 对称性(symmetric)。对于任意不为null的引用值x和y,当且仅当x.equals(y)是true时,y.equals(x)也是true。
    • 传递性(transitive)。对于任意不为null的引用值x、y和z,如果x.equals(y)是true,同时y.equals(z)是true,那么x.equals(z)一定是true。
    • 一致性(consistent)。对于任意不为null的引用值x和y,如果用于equals比较的对象信息没有被修改的话,多次调用时x.equals(y)要么一致地返回true要么一致地返回false。
    • 对于任意不为null的引用值x,x.equals(null)返回false。

    五、其他

      Java对象的eqauls方法和hashCode方法是这样规定的:

      1、相等(相同)的对象必须具有相等的哈希码(或者散列码)。

      2、如果两个对象的hashCode相同,它们并不一定相同。

  • 相关阅读:
    thinkphp在模型中自动完成session赋值
    highcharts实例教程二:结合php与mysql生成饼图
    程序员应该经常看看的网站
    highcharts实例教程一:结合php与mysql生成折线图
    2015-2-10 ecshop
    一个简单的javascript获取URL参数的代码
    table 西边框样式
    PHP 获取当前日期及格式化
    mysql 获取当前日期及格式化
    mysql时间int日期转换
  • 原文地址:https://www.cnblogs.com/wobuchifanqie/p/12505489.html
Copyright © 2011-2022 走看看