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相同,它们并不一定相同。

 

上一篇:E - E HDU - 3280(暴力枚举)


下一篇:I - Swap(交换行列是对角线都为1)