程水平
的问题.
从实现来说,一般的HashCode方法会这样:
return Attribute1.HashCode() + Attribute1.HashCode()..[+super.HashCode()],
我们知道,每次调用这个方法,都要重新对方法内的参与散列的对象重新计算一次它们的
HashCode的运算,如果一个对象的属性没有改变,仍然要每次都进行计算,所以如果设置一
个标记来缓存当前的散列码,只要当参与散列的对象改变时才重新计算,否则调用缓存的
hashCode,这可以从很大程度上提高性能.
默认的实现是将对象内部地址转化为整数作为HashCode,这当然能保证每个对象具有不同
的HasCode,因为不同的对象内部地址肯定不同(废话),但java语言并不能让程序员获取对
象内部地址,所以,让每个对象产生不同的HashCode有着很多可研究的技术.
如果从多个属性中采样出能具有平均分布的hashCode的属性,这是一个性能和多样性相矛
盾的地方,如果所有属性都参与散列,当然hashCode的多样性将大大提高,但牺牲了性能,
而如果只能少量的属性采样散列,极端情况会产生大量的散列冲突,如对"人"的属性中,如
果用性别而不是或出生日期,那将只有两个或几个可选的hashcode值,将产生一半以上
的散列冲突.所以如果可能的条件下,专门产生一个序列用来生成HashCode将是一个好的选
择(当然产生序列的性能要比所有属性参与散列的性能高的情况下才行,否则还不如直接用
所有属性散列).
如何对HashCode的性能和多样性求得一个平衡,可以参考相关算法
设计的书,其实并不一定
要求非常的优秀,只要能尽最大可能减少散列值的聚集.重要的是我们应该记得HashCode对
于我们的
程序性能有着生要的影响
,在程序设计时应该时时加以注意.
恕我道行浅,还是不明白为什么用hash会比数组快,
看ArrayList的get方法直接是通过索引取得值
而Hashtable的get是先计算index,然后循环比较,感觉和你的数组相反
# axman 发表于2006-09-05 10:15:00 IP: 210.82.61.*
你那是牧举.也就是对所有元素"过一遍".
我们在说"查询",如果数组中有10000个元素,
我想要其中某一个值为"axman"的元素,你只能
for(int i=0;i<10000;i++){
if(arr[i].equals("axman")) //找到,break;
}
如果你运气不好,可能要循环一万次.
那如果数组中是10000000000个呢?
而hashMap的key就是它的位置,通过key计算出index,直接到那个位置"提货".这个过程只要两至三步.和元素有多少个没有多大关系.(有关系,元素太多可能一个index存了多个值).但总比你循环1000000000000次快多了吧?