黑马程序员技术交流社区

标题: 关于HashSet的小提示 [打印本页]

作者: 李计伟    时间: 2012-11-6 22:54
标题: 关于HashSet的小提示

  1. <P> public class Student {
  2.           private String name;
  3.           private int age;
  4.           //省略无参构造器get()/set()方法toString()方法
  5.           public Student(String name,int age){
  6.           this.name = name;
  7.           this.age = age;
  8.            }
  9.           public void setAge(int age) {
  10.                 this.age=age;
  11.           }

  12.           //重写equals方法
  13.            public boolean equals(Object obj) {
  14.                  if(this ==obj){
  15.                  return true;
  16.                  }
  17.                 if(!(obj instanceof Student)){
  18.                 return false;
  19.                  }
  20.                 Student s = (Student)obj;
  21.                 return this.name.equals(s.name)&&this.age==s.age;
  22.             }
  23.             //重写hashCode()方法
  24.            public int hashCode() {
  25.                 return this.name.hashCode()+this.age*13;
  26.            }
  27. }</P>
复制代码
  1. import java.util.HashSet;

  2. public class MainApp {
  3.          public static void main(String[] args) {
  4.          HashSet<Student> list = new HashSet<Student>();
  5.                 Student s1 = new Student("小黑", 20);
  6.                 Student s2 = new Student("小白", 30);
  7.                 Student s3 = new Student("小黑", 20);
  8.                     //加入三个对象
  9.                 list.add(s1);
  10.                 list.add(s2);
  11.                 list.add(s3);
  12.                 //更改hashCode()值
  13.                 s1.setAge(24);
  14.                 //删除s1
  15.                 list.remove(s1);
  16.                 System.out.println(list.size());
  17.          }
  18. }
复制代码
HashSet底层数据结构是哈希表。
s1和s3的哈希值一样所以删除s1也就删除了s3,当把哈希值改变后,s1没有被取走结果是 2,不执行这句list.remove(s1);的结果是 1。
提示:当一个对象被存储进HashSet集合后就不能修改这个对象中的那些参与计算哈希值的字段了。
否则有内存泄露的隐患。因为删除对象时没有释放资源,如果以后要多次对对象存删,时间长了就会造成内存泄露。



作者: 徐-星星    时间: 2012-11-7 00:30
沙发哦!  呵呵  
作者: 王永荣    时间: 2012-11-7 09:32
楼主你确定你的list.remove(s1)是运行了吗?
System.out.println(list.remove(s1)); 我怎么输出是false呢。。。
作者: 付维翔    时间: 2012-11-7 14:24
王永荣 发表于 2012-11-7 09:32
楼主你确定你的list.remove(s1)是运行了吗?
System.out.println(list.remove(s1)); 我怎么输出是false呢。 ...

输出false是因为,s1对象的哈希值改变了,因此无法从集合中找到与此哈希值对应的集合对象




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