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; } } ![]() (编辑:开发网_开封站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |