您的位置:首页 > 编程语言 > Java开发

Java集合HashSet的hashcode方法引起的内存泄漏问题

2010-06-07 14:19 609 查看
package apistudy;
import java.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;
}

}
  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐