黑马程序员技术交流社区
标题:
hashSet集合中改变对象值后引起的内存泄漏
[打印本页]
作者:
Himoriarty
时间:
2015-6-18 14:40
标题:
hashSet集合中改变对象值后引起的内存泄漏
对于为什么会引起内存泄漏,我还是没有搞明白。
根据对象计算的哈希值,存储进对应的区域(假如为区域2),而修改后的对象哈希值有变化,删除时,将拿修改后的哈希值在其对应的区域内(比如在区域3)查找此对象,而修改后的对象在区域3中不存在,所以返回为假,就不删除,对象还是存储在区域2中。而再对修改后的对象进行添加时,发现还是可以存储进去,就会发现,集合中有两个相同的对象被存储在集合中。一个为第一次添加的对象存储在区域2,一个为后来添加的对象存储在区域3。
为什么哈希表在值哈希值改变后仍存储在原来的区域,而不会自动重新分配。
<div class="blockcode"><blockquote>package com.itcast;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
public class Reflection2 {
public static void main(String[] args) {
Collection collections = new HashSet();
ReflectPoint pt1 = new ReflectPoint(3,3);
ReflectPoint pt2 = new ReflectPoint(8,5);
ReflectPoint pt3 = new ReflectPoint(3,3);
collections.add(pt1);
collections.add(pt2);
collections.add(pt3);
//遍历显示
Iterator it = collections.iterator();
while(it.hasNext())
{
ReflectPoint pt = (ReflectPoint)it.next();
System.out.println(pt.x + ":" + pt.y);
}
//修改对象
pt1.y = 7;
collections.remove(pt1);
System.out.println("sdjisdj");
//重新添加
collections.add(pt1);
//遍历显示
Iterator it2 = collections.iterator();
while(it2.hasNext())
{
ReflectPoint pt = (ReflectPoint)it2.next();
System.out.println(pt.x + ":" + pt.y + ":" +pt.hashCode());
}
System.out.println(collections.size());
}
}
复制代码
作者:
JRT
时间:
2015-6-18 16:14
HashSet保证元素不重复的方法是?
作者:
Himoriarty
时间:
2015-6-18 17:29
JRT 发表于 2015-6-18 16:14
HashSet保证元素不重复的方法是?
equals方法和hashCode()方法,对象内容和哈希值是否相同。
作者:
JRT
时间:
2015-6-18 18:06
哦哦,谢谢哦
作者:
Himoriarty
时间:
2015-6-20 14:48
JRT 发表于 2015-6-18 18:06
哦哦,谢谢哦
你不知道啊,我还以为你能解释呢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2