A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© FFF 金牌黑马   /  2013-12-23 23:09  /  1501 人查看  /  12 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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值相同的对象的吗?
聪明的骚年,你知道为什么吗?

12 个回复

倒序浏览
没看出来   再好好研究一下
回复 使用道具 举报
过来帮顶!!
回复 使用道具 举报
这难道是张老师里面讲的关于hashCode作用,关于内存泄露的?
回复 使用道具 举报
FFF 金牌黑马 2013-12-23 23:31:30
报纸
☆星痕泪 发表于 2013-12-23 23:27
这难道是张老师里面讲的关于hashCode作用,关于内存泄露的?

{:soso_e133:}别那么早告诉他们啊!骚年~
回复 使用道具 举报
本帖最后由 胡永城 于 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, 下载次数: 5)

QQ截图20131223234515.png
回复 使用道具 举报
FFF 发表于 2013-12-23 23:31
别那么早告诉他们啊!骚年~

其实我还在研究呢。:dizzy:
回复 使用道具 举报
FFF 金牌黑马 2013-12-23 23:56:30
8#
胡永城 发表于 2013-12-23 23:42
真的假的??,就是在 hashCode(){//重写hashCode方法 这里做了手脚。name是String类型相同时hashCode一样 ...

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

:o   好吧,其实重写的hashCode方法就是忽悠人的我会说吗?{:2_35:}
哎呀我快晕了
回复 使用道具 举报 1 0
这hashSet是添加一个学生对象前先调用它的hashCode()得到这个对象的hashcode,放入hashSet中这个是一个地址值
还有就是那个st.age=13;是个障眼法吧。去掉就ok了O(∩_∩)O哈哈~
回复 使用道具 举报
FFF 金牌黑马 2013-12-24 00:33:56
11#
☆星痕泪 发表于 2013-12-24 00:11
这hashSet是添加一个学生对象前先调用它的hashCode()得到这个对象的hashcode,放入hashSet中这个是一个地址 ...

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

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马