黑马程序员技术交流社区

标题: HashSet中关于hashCode的问题。 [打印本页]

作者: FFF    时间: 2013-12-23 23:09
标题: HashSet中关于hashCode的问题。
本帖最后由 FFF 于 2013-12-23 23:23 编辑
  1. public static void main(String[] args) {
  2.         HashSet<student> hs = new HashSet<student>();
  3.         student st =new student("Java",12);
  4.         student st1 =new student("Java",13);
  5.         student st2 =new student("Java",14);
  6.         hs.add(st);//存入对象
  7.         hs.add(st1);
  8.         hs.add(st2);
  9.         st.age=13;

  10.         for(student s : hs){//迭代输出Hs中的对象的age值
  11.             System.out.println(s.age);
  12.         }
  13.         System.out.println("st--"+st.hashCode()+"--st1--"+st1.hashCode());//输出两者的HashCode
  14.         System.out.println("st与st1的HashCode比较结果为:"+(st.hashCode()==st1.hashCode()));//两者为真
  15.     }
  16. }
  17. class student{//学生对象
  18.     String name;
  19.     int age ;
  20.     student(String name,int age){
  21.         this.name=name;
  22.         this.age=age;
  23.     }
  24.     public int hashCode(){//重写hashCode方法
  25.         return name.hashCode()+age*10;
  26.     }
复制代码


输出:
13
13
14
st--2301636--st1--2301636
st与st1的HashCode比较结果为:true

为什么st与st1的HashSet可以一样呢?不是应该在HashSet中是不存在hsahCode值相同的对象的吗?
聪明的骚年,你知道为什么吗?


作者: HM代景康    时间: 2013-12-23 23:25
没看出来   再好好研究一下
作者: 浮光    时间: 2013-12-23 23:25
过来帮顶!!
作者: ☆星痕泪    时间: 2013-12-23 23:27
这难道是张老师里面讲的关于hashCode作用,关于内存泄露的?
作者: FFF    时间: 2013-12-23 23:31
☆星痕泪 发表于 2013-12-23 23:27
这难道是张老师里面讲的关于hashCode作用,关于内存泄露的?

{:soso_e133:}别那么早告诉他们啊!骚年~

作者: 胡永城    时间: 2013-12-23 23:42
本帖最后由 胡永城 于 2013-12-23 23:51 编辑

真的假的??,就是在 hashCode(){//重写hashCode方法 这里做了手脚。name是String类型相同时hashCode一样,重写个方法弄得到一样的数据,实际是不一样的,把这个方法删了再试试。。
已验,基于equals方法:

  1. public V put(K key, V value) {
  2.         if (key == null)
  3.             return putForNullKey(value);
  4.         int hash = hash(key);
  5.         int i = indexFor(hash, table.length);
  6.         for (Entry<K,V> e = table[i]; e != null; e = e.next) {
  7.             Object k;
  8.             if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
  9.                 V oldValue = e.value;
  10.                 e.value = value;
  11.                 e.recordAccess(this);
  12.                 return oldValue;
  13.             }
  14.         }
复制代码


  1. public boolean equals(Object obj) {
  2.         return (this == obj);
  3.     }
复制代码

是不是真像??



QQ截图20131223234515.png (36.96 KB, 下载次数: 29)

QQ截图20131223234515.png

作者: ☆星痕泪    时间: 2013-12-23 23:44
FFF 发表于 2013-12-23 23:31
别那么早告诉他们啊!骚年~

其实我还在研究呢。:dizzy:
作者: FFF    时间: 2013-12-23 23:56
胡永城 发表于 2013-12-23 23:42
真的假的??,就是在 hashCode(){//重写hashCode方法 这里做了手脚。name是String类型相同时hashCode一样 ...

我可以告诉你,你的方向错了吗???哈哈哈~小城子。今晚别睡了!把这个问题想明白再睡觉吧!哈哈哈~~~
作者: 胡永城    时间: 2013-12-24 00:02
本帖最后由 胡永城 于 2013-12-24 00:06 编辑
FFF 发表于 2013-12-23 23:56
我可以告诉你,你的方向错了吗???哈哈哈~小城子。今晚别睡了!把这个问题想明白再睡觉吧!哈哈哈~~~ ...

:o   好吧,其实重写的hashCode方法就是忽悠人的我会说吗?{:2_35:}
哎呀我快晕了

作者: ☆星痕泪    时间: 2013-12-24 00:11
这hashSet是添加一个学生对象前先调用它的hashCode()得到这个对象的hashcode,放入hashSet中这个是一个地址值
还有就是那个st.age=13;是个障眼法吧。去掉就ok了O(∩_∩)O哈哈~
作者: FFF    时间: 2013-12-24 00:33
☆星痕泪 发表于 2013-12-24 00:11
这hashSet是添加一个学生对象前先调用它的hashCode()得到这个对象的hashcode,放入hashSet中这个是一个地址 ...

需要你回答的是为什么、可以,而不是为什么会这样。你这个2货!
作者: 刘旭升    时间: 2013-12-24 07:33
好吧  大婶们我还没看到这里,先收藏起来。{:soso_e130:}
作者: 雪龙    时间: 2013-12-24 15:20
我做了一个实验
String st1= "java";
String st2="java";
System.out.println(st1.hashCode());
System.out.println(st2.hashCode());
发现st1和st2的hashcode值是一样的   
那也就是说在你的创建的
的st1和st2两个对象中的name的hashcode知识一样的  所以你重写的hashcode方法中 return name.hashCode()+age*10  只要 name值与  age一样  那么它们的hashcode值就是一样的。你在把st放到集合中修改了age的值  那么比较hashcode值时就是一样的。只不过现在st不是指向原来存储st对象的那块区域了,而是st1对象的那块区域   
  是不是这样啊?






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2