加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 教程 > 正文

Java集合HashSet的hashcode技巧引起的内存泄漏问题

发布时间:2021-12-18 17:04:44 所属栏目:教程 来源:互联网
导读:package apistudy; import Java.util.HashSet; import java.util.Set; /** * Created on 2010-6-7 * pDescription: [HashSet的hashcode方法引起的内存泄漏]/p * @author shixing_11@sina.com * @version 1.0 */ public class HashSetTest { public static vo

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

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读