- <P> public class Student {
- private String name;
- private int age;
- //省略无参构造器get()/set()方法toString()方法
- public Student(String name,int age){
- this.name = name;
- this.age = age;
- }
- public void setAge(int age) {
- this.age=age;
- }
-
- //重写equals方法
- public boolean equals(Object obj) {
- if(this ==obj){
- return true;
- }
- if(!(obj instanceof Student)){
- return false;
- }
- Student s = (Student)obj;
- return this.name.equals(s.name)&&this.age==s.age;
- }
- //重写hashCode()方法
- public int hashCode() {
- return this.name.hashCode()+this.age*13;
- }
- }</P>
复制代码- import java.util.HashSet;
- public class MainApp {
- public static void main(String[] args) {
- HashSet<Student> list = new HashSet<Student>();
- Student s1 = new Student("小黑", 20);
- Student s2 = new Student("小白", 30);
- Student s3 = new Student("小黑", 20);
- //加入三个对象
- list.add(s1);
- list.add(s2);
- list.add(s3);
- //更改hashCode()值
- s1.setAge(24);
- //删除s1
- list.remove(s1);
- System.out.println(list.size());
- }
- }
复制代码 HashSet底层数据结构是哈希表。
s1和s3的哈希值一样所以删除s1也就删除了s3,当把哈希值改变后,s1没有被取走结果是 2,不执行这句list.remove(s1);的结果是 1。
提示:当一个对象被存储进HashSet集合后就不能修改这个对象中的那些参与计算哈希值的字段了。
否则有内存泄露的隐患。因为删除对象时没有释放资源,如果以后要多次对对象存删,时间长了就会造成内存泄露。
|