首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-12-23 
Java集合HashSet的hashcode方法引起的内存泄漏问题Java集合HashSet的hashcode方法引起的内存泄漏问题 注:

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


注:试了试,arrayList也会有这种问题的。也是使用hashcode来比较的。




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);  
        }  
          
    }  

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

view plaincopy to clipboardprint?
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;  
    }  
      




本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/shixing_11/archive/2010/06/07/5652935.aspx

热点排行