[Java复习]Hashcode

昨天面试被问到Object中的hashcode的作用,之前并没有注意到。今天做一个总结

 

hashcode():返回对象的hash码值。从object中继承过来,默认使用对象的地址计算散列码及hash地址。

在java的Collection中大体分为:Set、List、Map三种体系,其中Set是无序不可重复集合,List为有序重复集合,Map代表键值对。

对于不可重复的集合,是如何实现元素不重复的呢?JVM通过hash的方式,查看hash地址上是否有内容,如果没有的话就认为不存在相同的内容。

在object类中定义为:public native int hashCode();可见是native方法,实现是根据本地机器相关的。

注意,hash后的地址不一定是实际的内存地址

 

equals():谈到hashcode就不能不关注equals,equals方法对两个对象的地址进行比较,判断是否相同。(注意对于String,Math,Integer,Double这些封装类在使用equals时已经覆盖了object的equals方法)

在object中定义为:

public boolean equals(Object obj) { 
    return (this == obj); 
}

对于hashcode和equals我理解一个是逻辑地址,一个是实际地址。equlas相等必须是对象值相同,且地址也是相同的。如果两个对象equals,java环境会认为他们的hashcode一定相等,所以如果重写equals方法那么一定要重写hashcode方法。但是两个对象不equals,但是hashcode有可能相等。hashcode是否相等,跟equals是否相等无关。

从hashcode有引申到最近的hashdos攻击:在多数web容器的设计中,request是依靠相应语言的hashtable/hashmap实现的,当不同的key存入是如果hash值相同则每次都要解决冲突hash表被变为一个普通链表,原来的O(1)读取会变成O(n)的读取。
官方解决办法:限制最大请求body大小,限制请求的参数个数 
我给出的解决方法:把大hash表变成n个小hash表,一个key值先做一次hash计算要放到哪个小hash表中,然后再做一次hash得到真实的hash地址。这样做的好处是,增加攻击难度即使有攻击影响的范围也不大。但是有一个问题是hash地址将由两部分组成,存储和计算都要重新设计。
posted @ 2013-10-10 11:53  double_song  阅读(536)  评论(0编辑  收藏  举报