`
yinwufeng
  • 浏览: 277067 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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
分享到:
评论

相关推荐

    Java基础加强_ArrayList_HashSet的比较及Hashcode分析

    Java基础加强_ArrayList_HashSet的比较及Hashcode分析

    java HashSet 集合排序

    java HashSet 集合排序,需要通过利用TreeSet集合排序。2013-10-30。

    java集合-HashSet的使用

    HashSet 是 Java 中的一个集合类,它实现了 Set 接口并提供了基于哈希表的无序、不重复元素的集合。具体来说,它是通过哈希表(实际上是一个 HashMap 实例)来存储元素的。 以下是 HashSet 的一些主要特点: 无序...

    java 利用HashSet删除学生

    java 利用HashSet删除学生 java 利用HashSet删除学生

    Java泛型和集合

    Java Generics and Collections 英文版,详细描述java 泛型技术

    实验05 Java集合.doc

    注意:因为Person类是自定义类,需要重写hashCode()方法和equals()方法,并规定只有姓名和身份证号都相等,则对象相等。 其中计算哈希码的算法:(31 + ((name == null) ? 0 : name.hashCode()))*31 + id (注:...

    java集合知识-map、set等

    记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。 一般情况下,如果自定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。 建立对象判断是否相同的依据。...

    通过实例学习Java集合框架HashSet

    主要介绍了通过实例学习Java集合框架HashSet,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    HashSet工作原理_动力节点Java学院整理

    对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSet 的源代码,可以看到如下代码:

    java集合使用实例

    本资源包含java集合(hashset treeset hashmap和treemap)的使用实例

    Java中HashSet的解读_.docx

    Java中HashSet的解读_.docx

    java常用jar包集合

    包含各种数据库的驱动包,spring, struts2,hibernet,ibatis,ehcahe,file_upload, email,dbcp等jar包。

    Java 集合类(HashSet、ArrayList、LinkedList、HashMap).pptx

    掌握List集合、Set集合、Map集合的使用以及Iterator迭代器和foreach循环的使用 了解常用的集合类 熟悉泛型的使用

    java集合类的效率测试

    我写的关于set集合和list集合相关性能测试,linkedList ArrayList HashSet 等类的增删改查性能测试

    java基础练习题 (目前到集合内含三个小综合案例)

    本资源是一些习题。目前从javajdk开始到集合。 内含三个小综合案例

    java集合知识点详解,包括ArrayList和 HashSet以及Iterator等

    图文并茂,能让大家很好的理解java中这个重要的知识点。 此文档需要wps或者office软件来查看,如果你没有此软件,到http://www.wps.com.cn 下载wps即可查看此文档。 注:本人所有资源都是共享的,的资源分都是0!

    Java基础知识.doc

    内存泄露的另外一种情况:当一个对象被存储进HashSet或HashMap中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,...

    Java集合框架详解

    Java集合框架详解非扫描,由网上博客整理而成。对hashmap和hashset进行了比较深入的讲解。

    java中set、list和map的使用方法实例

    // java中对象容器主要有Set,List和Map三个接口类。 // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器(container)对象中的各个元素, // 而又不需暴露该...

    Java集合多线程安全.docx

    Java集合多线程安全 线程安全与不安全集合 线程不安全集合: ArrayList LinkedList HashMap HashSet TreeMap TreeSet StringBulider 线程安全集合: Vector HashTable Properties 集合线程安全...

Global site tag (gtag.js) - Google Analytics