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; } }
相关文章推荐
- Java集合HashSet的hashcode方法引起的内存泄漏问题
- java集合中HashSet引起的内存泄漏问题
- java基础之问题:请说出hashCode方法、equals方法、HashSet、HashMap之间的关系
- java中的hashcode方法作用以及内存泄漏问题
- 黑马程序员-Java中的hashCode()方法和hashSet集合
- override equals后也要override hashcode方法,否则hashmap,hashset,hashtable这三个集合中的操作会出问题。 (其他情况下,不重写hashcode没)
- java集合(3)- Java中的equals和hashCode方法详解
- 使用网上流传的一个数据库连接池在Proxy.newProxyInstance处引起 java.lang.ClassCastException 问题的解决方法
- Java中HashSet要重写equals方法和hashCode方法
- 傻瓜方法求集合的所有子集问题(java版)
- Map集合遍历过程调用remove方法引起的问题
- HashMap和HashSet中hashCode()和equals()方法重写的问题
- java 重写HashCode和equals方法以及 HashMap集合 增 删 改 查
- Java学习之容器上(Collection接口常用方法,Iterator接口,使用foreach循环遍历Collection集合元素,Set集合通用知识(Hashset类,hashcode()与Lin
- Java集合HashSet-ArrayList-HashMap的线程同步控制方法和区别
- Java集合(set,map)的排序和HashCode方法详解
- Java集合HashSet-ArrayList-HashMap的线程同步控制方法和区别
- hashCode方法作用 内存泄漏问题
- Java集合HashSet-ArrayList-HashMap的线程同步控制方法和区别
- java泛型编译时被擦除引起多态的破坏,用 桥方法解决此类问题。(java 桥方法)