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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 H._张_♂ 于 2014-4-11 14:24 编辑
  1. 我的问题都在注释里面,我理解不了情况。
复制代码

  1. import java.util.HashSet;
  2. import java.util.Set;

  3. public class HashCodeTest {

  4.         /**
  5.          * 这是一个要用来测试HashCode的类
  6.          * @author 张三
  7.          * @version v1.1
  8.          */
  9.         public static void main(String[] args) {
  10.                 // TODO Auto-generated method stub
  11.                 Set<Person>  set = new HashSet<Person>();
  12.                 Person p1=new Person(10);
  13.                 Person[] p = new Person[2];
  14.                 set.add(p1);//set中一个元素
  15.                 p1.setAge(11);//p1的age改成11
  16.                 System.out.println(set.remove(p1));//移走P1,输出false,说明p1没有被移走,这是为什么?
  17.                 System.out.println(set.contains(p1));//输出false,集合中不包含p1,说明p1不在集合中,p1究竟去哪里了?
  18.                 System.out.println(set.size());//结果为1.说明p1没有被移走,究竟存的是谁?怎么拿出来?
  19.                 p= set.toArray(p);//将set中的所有元素变成p数组
  20.                 System.out.println(p[0]);//输出为11,说明set集合中还有年龄为11的这个对象
  21.         }
  22. }

  23. class Person {
  24.         int age;
  25.         Person(int age){
  26.                 this.age=age;
  27.         }
  28.         public void setAge(int age){
  29.                 this.age=age;
  30.         }
  31.         @Override
  32.         public boolean equals(Object obj) {
  33.                 Person p = (Person)obj;
  34.                 if(this.age==p.age){
  35.                         return true;
  36.                 }
  37.                 return false;
  38.         }
  39.         @Override
  40.         public int hashCode(){
  41.                 return age+age*34;}
  42.         @Override
  43.         public String toString(){
  44.                 return String.valueOf("person"+age);
  45.         }
  46.         
  47. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
本帖最后由 H._张_♂ 于 2014-4-11 14:25 编辑

。。。手残自己回复了。。悲剧
回复 使用道具 举报
remove()是Set类的方法,Set.remove()是Person的方法,是要删除参数值相同的元素
可以用list类来做就可以达到你要的效果,或是用ArrayList类来也可以
回复 使用道具 举报
当你学到后面时候你就会知道为什么?hashset的很多方法是根据hashcode()和equals()来寻找你要判断、寻找、删除的元素,开始你指定的p1的age属性是10;然后把p1存到集合,后面又改变了p1 的age属性为11;你这么一改,hashcode算出来的值就会不一样,集合会按照现在的hashcode运算的值去寻找p1,而p1存在了以前的位置上,一直没有改变。集合怎么找的到。虽然对象还是一个。

  1. import java.util.HashSet;
  2. import java.util.Set;

  3. public class HashCodeTest {

  4.         /**
  5.          * 这是一个要用来测试HashCode的类
  6.          * @author 张三
  7.          * @version v1.1
  8.          */
  9.         public static void main(String[] args) {
  10.                 // TODO Auto-generated method stub
  11.                 Set<Person>  set = new HashSet<Person>();
  12.                 Person p1=new Person(10);
  13.                 Person[] p = new Person[2];
  14.                 set.add(p1);//set中一个元素
  15.                 p1.setAge(11);[color=Sienna]//问题在这、、、//、、、、、、、、、、、、、、、、、、、[/color]
  16.                 System.out.println(set.remove(p1));//移走P1,输出false,说明p1没有被移走,这是为什么?
  17.                 System.out.println(set.contains(p1));//输出false,集合中不包含p1,说明p1不在集合中,p1究竟去哪里了?
  18.                 System.out.println(set.size());//结果为1.说明p1没有被移走,究竟存的是谁?怎么拿出来?
  19.                 p= set.toArray(p);//将set中的所有元素变成p数组
  20.                 System.out.println(p[0]);//输出为11,说明set集合中还有年龄为11的这个对象
  21.         }
  22. }

  23. class Person {
  24.         int age;
  25.         Person(int age){
  26.                 this.age=age;
  27.         }
  28.         public void setAge(int age){
  29.                 this.age=age;
  30.         }
  31.         @Override
  32.         public boolean equals(Object obj) {
  33.                 Person p = (Person)obj;
  34.                 if(this.age==p.age){
  35.                         return true;
  36.                 }
  37.                 return false;
  38.         }
  39.         @Override
  40.         public int hashCode(){
  41.                 return age+age*34;}
  42.         @Override
  43.         public String toString(){
  44.                 return String.valueOf("person"+age);
  45.         }
  46.         
  47. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 呆呆沙师妹 于 2014-4-11 16:10 编辑

这个问题毕向东老师的基础视频中提到过。
hashSet集合调用实例对象的hashCode方法和equals方法保证集合中元素的唯一性。
与hash有关的集合类中使用对象hashCode方法计算出的hashCode值作为索引,来提高查找定位效率。
在Person类中,hashCode值等于age+age*34,创建p1实例时,hashCode值为350,当p1添加进集合后,修改了p1的age值为11,此时对p1进行删除时,重新计算的hashCode值为385,集合中内p1的hashCode值依然为350,故而查找删除失败。
你可以试试将p1的age值重新修改为10,删除就能正常进行了。

评分

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

查看全部评分

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