Hashset 使用不当引起的内存泄漏 傷城~ 2022-07-12 01:28 368阅读 0赞 修改hashset中对象的属性值,且属性值是计算哈希值的字段,这时会引起内存泄漏 即:当一个对象被存储进HashSet集合中以后,就不能修改该对象的参与计算哈希值的属性值了 ,否则对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中删除当前对象,造成内存泄露。 举例说明: 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); } } } 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内存泄漏案例:HashMap的应用不当 在Java中,HashMap是一种线程不安全的数据结构,如果在多线程环境下使用不当,很容易导致内存泄漏。 以下是一个简单的例子: ```java // 创建一个HashMa 浅浅的花香味﹌/ 2024年09月18日 14:21/ 0 赞/ 5 阅读
相关 Java反射API使用不当导致的内存泄漏问题 在Java中,反射API(Reflection API)提供了一种动态获取类信息、创建对象以及调用方法的功能。然而,如果使用不当,可能会导致内存泄漏的问题。 1. **未关闭 男娘i/ 2024年09月10日 22:15/ 0 赞/ 27 阅读
相关 ThreadLocal的弱引用 以及可能引起的内存泄漏 ThreadLocal:线程本地副本,可在多线程环境下,为每个线程创建独立的副本保证线程安全ThreadLocal总会有一些疑惑的地方:听说ThreadLocal中有有使... 冷不防/ 2024年05月01日 16:01/ 0 赞/ 38 阅读
相关 由 ObjectInputStream 所引起的 Java 内存泄漏问题 Java 的 ObjectOutputStream 和 ObjectInputStream 各自保留一个对已发送/已接收对象的引用的列表。就是这些引用,会阻止垃圾收集器对这些对 淡淡的烟草味﹌/ 2022年12月26日 10:26/ 0 赞/ 150 阅读
相关 使用IntrospectorCleanupListener 解决quartz引起的内存泄漏 org.springframework.web.util.IntrospectorCleanupListener监听器主要负责处理由JavaBean Introspector使 柔光的暖阳◎/ 2022年08月04日 12:55/ 0 赞/ 188 阅读
相关 Hashset 使用不当引起的内存泄漏 修改hashset中对象的属性值,且属性值是计算哈希值的字段,这时会引起内存泄漏 即:当一个对象被存储进HashSet集合中以后,就不能修改该对象的参与计算哈希值的属性值了 傷城~/ 2022年07月12日 01:28/ 0 赞/ 369 阅读
相关 InputMethodManager引起的内存泄漏问题分析与解决 问题重现: static InputMethodManager.sInstance references InputMethodManager.mCurRootView(e 淡淡的烟草味﹌/ 2022年06月10日 02:25/ 0 赞/ 292 阅读
相关 Java内存泄漏引起的原因 Java内存泄漏引起的原因: 内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。 长生命周期的对 左手的ㄟ右手/ 2022年03月20日 10:38/ 0 赞/ 202 阅读
相关 引起内存泄漏的操作有哪些 引起内存泄漏的操作有哪些 内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。 垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0... 朱雀/ 2020年07月01日 20:41/ 0 赞/ 660 阅读
还没有评论,来说两句吧...