java的相关原理理解

http://tech.ddvip.com   2008年06月12日    社区交流

本文详细介绍java的相关原理理解

  2.  关于重载hashCode()与Collection框架的关系笔者曾经听一位搞Java培训多年的前辈说在他看来hashCode方法没有任何意义,仅仅是为了配合证明具有同样的hashCode会导致equals  方法相等而存在的。连有的前辈都犯这样的错误,其实说明它还是满容易被忽略的。那么hashCode()方法到底做什么用?         学过数据结构的课程大家都会知道有一种结构叫hash  table,目的是通过给每个对象分配一个唯一的索引来提高查询的效率。那么Java也不会肆意扭曲改变这个概念,所以hashCode唯一的作用就是为支持数据结构中的哈希表结构而存在的,换句话说,也就是只有用到集合框架的  Hashtable、HashMap、HashSet的时候,才需要重载hashCode()方法,这样才能使得我们能人为的去控制在哈希结构中索引是否相等。笔者举一个例子:     曾经为了写一个求解类程序,需要随机列出1,2,3,4组成的不同排列组合,所以笔者写了一个数组类用int[]来存组合结果,然后把随机产生的组合加入一个HashSet中,就是想利用HashSet不包括重复元素的特点。可是HashSet怎么判断是不是重复的元素呢?当然是通过  hashCode()返回的结果是否相等来判断啦,可做一下这个实验:     int[]  A  =  {1,2,3,4};     int[]  B  =  {1,2,3,4};     System.out.println(A.hashCode());     System.out.println(B.hashCode());

  这明明是同一种组合,却是不同的hashCode,加入Set的时候会被当成不同的对象。这个时候我们就需要自己来重写hashCode()方法了,如何写呢?其实也是基于原始的hashCode(),毕竟那是操作系统的实现,  找到相通对象唯一的标识,实现方式很多,笔者的实现方式是:     首先重写了toString()方法:     return   A[0]“+”  A[1]“+”  A[2]“+”  A[3];  //显示上比较直观     然后利用toString()来计算hashCode():     return   this.toString().hashCode();     这样上述A和B返回的就都是”1234”,在测试toString().hashCode(),由于String在内存中的副本是一样的,”1234”.hashCode()返回的一定是相同的结果。

责编:豆豆技术应用

正在加载评论...