- package apistudy;
- import <a href="http://lib.csdn.net/base/java" class='replace_word' title="Java 知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Java</a>.util.HashSet;
- import java.util.Set;
- /**
- * Created on 2010-6-7
- * <p>Description: [HashSet的hashcode方法引起的内存泄漏]</p>
- * @author shixing_11@sina.com
- * @version 1.0
- */
- public class HashSetTest
- {
- public static void main(String[] args)
- {
- Set<Person> set = new HashSet<Person>();
- Person p1 = new Person("唐僧","pwd1",25);
- Person p2 = new Person("孙悟空","pwd2",26);
- Person p3 = new Person("猪八戒","pwd3",27);
- set.add(p1);
- set.add(p2);
- set.add(p3);
- System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:3 个元素!
- p3.setAge(2); //修改p3的年龄,此时p3元素对应的hashcode值发生改变
- set.remove(p3); //此时remove不掉,造成内存泄漏
- set.add(p3); //重新添加,居然添加成功
- System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:4 个元素!
- for (Person person : set)
- {
- System.out.println(person);
- }
- }
- }
运行结果:
总共有:3 个元素!
总共有:4 个元素!
猪八戒-->pwd3-->2
孙悟空-->pwd2-->26
唐僧-->pwd1-->25
猪八戒-->pwd3-->2
总结:
HashSet中,在对应元素添加进set集合后,不要再去修改元素的值,否则对应元素的hashcode值发生变化,此时如果调用
集合的remove(),contains()方法,将不会得到正确的结果。remove()方法并不能正确remove掉对应的元素,造成内存泄漏。
Person.java
- package apistudy;
- public class Person
- {
- private String username;
- private String password;
- private int age;
- public Person(String username, String password, int age)
- {
- this.username = username;
- this.password = password;
- this.age = age;
- }
- public String getUsername()
- {
- return username;
- }
- public void setUsername(String username)
- {
- this.username = username;
- }
- public String getPassword()
- {
- return password;
- }
- public void setPassword(String password)
- {
- this.password = password;
- }
- public int getAge()
- {
- return age;
- }
- public void setAge(int age)
- {
- this.age = age;
- }
- @Override
- public int hashCode()
- {
- final int prime = 31;
- int result = 1;
- result = prime * result + age;
- result = prime * result + ((password == null) ? 0 : password.hashCode());
- result = prime * result + ((username == null) ? 0 : username.hashCode());
- return result;
- }
- @Override
- public boolean equals(Object obj)
- {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- Person other = (Person) obj;
- if (age != other.age)
- return false;
- if (password == null)
- {
- if (other.password != null)
- return false;
- }
- else if (!password.equals(other.password))
- return false;
- if (username == null)
- {
- if (other.username != null)
- return false;
- }
- else if (!username.equals(other.username))
- return false;
- return true;
- }
- @Override
- public String toString()
- {
- return this.username+"-->"+this.password+"-->"+this.age;
- }
- }