一起Talk Android吧(第八十一回:Java中的超级类-Object之hashCode)

各位看官们,大家好,上一回中咱们说的是Java中的超级类-Object之equals的例子,这一回咱们继续说的是Object之hashCode。闲话休提,言归正转。让我们一起Talk Android吧!

看官们,我们在前面章回中提到了超级类提供的三大方法,这一回中我们详细介绍第二大方法:hashCode

看官们hashCode()方法用来返回对象的散列码,散列码没有规律,可能是正数或者负数。散列码对每个对象来说是唯一的,因此,有时候也可以通过它来判断两个对象是否相同,不过它最大的用处还是用在哈希表中。

例如:obj.hashCode()表示返回对象obj的散列码。

Object类中该方法的默认实现是把对象的地址转换为整型数值后返回,如果对象为null,那么返回0。不过我们建议在自定义的类中重写该方法。还有一条准则就是,如果重写了equals方法,那么必须重写该方法。有看官们问,这个散列码都不固定,如何重写呢,常用的做法是把自定义类中的每个成员变量都进行hash操作。下面是示例代码,请参考:

        @Override
        public int hashCode() {
            // TODO Auto-generated method stub
            return Objects.hash(mIntValue,mStrValue);
        }

在该代码中mIntValue和mStrValue是自定义类中的两个成员变量。我们使用了Objects的hash方法对这两个成员变量进行了hash操作,该方法的参数是可变的,也就是说它可以接受多个成员变量。其实该方法会分别调用每个参数的hashCode方法,然后把调用hashCode返回的结果统一整理后当做自己的返回值。

看官们,对于数组类型的对象,我们建议使用Arrays类中的hashCode方法,其原因是该类重写了hashCode方法,这点和equals方法是一样的。下面是具体的例子,请参考:

        int [] array1 = new int [] {1,2,3};
        int [] array2 = new int [] {1,2,3};
        //使用Object类默认的方法来输出两个数组散列码
        System.out.println("array1 hascode = "+array1.hashCode());
        System.out.println("array2 hascode = "+array2.hashCode());

        //使用Arrays类中重写的方法来输出两个数组散列码
        System.out.println("array1 hascode = "+Arrays.hashCode(array1));
        System.out.println("array2 hascode = "+Arrays.hashCode(array2));

运行上面的代码后得到以下运行结果:

array1 hascode = 31168322
array2 hascode = 17225372
array1 hascode = 30817
array2 hascode = 30817

从上面的结果中可以看到,两个具有相同内容的数组,如果使用没有重写的hashCode方法,就会得到不同的散列码,这显然是错误的,而使用重写过的hashCode方法,就可以得到相同的散列码,这正是我们期望得到的结果,因此再次建议大家自定义类的时候重写该方法。

各位看官,关于Java中的超级类-Object之hashCode的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!


猜你喜欢

转载自blog.csdn.net/talk_8/article/details/80788891