首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

重写hashCode步骤的意义

2012-07-03 
重写hashCode方法的意义?import java.util.HashMappublic class HashTest {public static void main(Stri

重写hashCode方法的意义
?重写hashCode步骤的意义重写hashCode步骤的意义

    import java.util.HashMap;public class HashTest {public static void main(String...args) {MyBean a = new MyBean();a.x = 1;a.s = "xyz";MyBean b = new MyBean();b.x = 1;b.s = "xyz";HashMap<MyBean, String> map = new HashMap<MyBean, String>();map.put(a, "a");map.put(b, "b");System.out.println("a equals b:"+a.equals(b));System.out.println("map size:"+map.size());System.out.println("a:"+map.get(a));System.out.println("b:"+map.get(b));}}class MyBean {int x;String s;@Overridepublic boolean equals(Object obj) {if(this == obj) return true;if(!(obj instanceof MyBean)) return false;if(((MyBean)obj).x == x) return true;return false;}}

    ? ? ? 结果如下:

    a equals b:true
    map size:2
    a:a
    b:b??

    ????? a和b明明是相等的,可是放进hashmap中之后,却被认为是两个对象,很诡异哦。
    ?? ?? 下面加上hashcode,再看看什么结果:

    ?重写hashCode步骤的意义重写hashCode步骤的意义
      class MyBean {int x;String s;@Overridepublic boolean equals(Object obj) {if(this == obj) return true;if(!(obj instanceof MyBean)) return false;if(((MyBean)obj).x == x) return true;return false;}@Overridepublic int hashCode() {return (s!=null?s.hashCode():1)*31+x;}}

      ???? 结果如下:

      a equals b:true
      map size:1
      a:b
      b:b

      ?

      ????? 这样才保证了相等的对象在hash集合中也相等。计算hashcode的时候,一般使用关键的属性的hashcode值。计算hashcode的属性较多则计算复杂,降低了效率,若较少的属性计算,则重复的hashcode较多,同样降低性能,写一个好的hashcode方法,还比较难。
      ?? ?? 所以,我们重写equals的时候,一定要重写hashcode方法。

热点排行