A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

对于为什么会引起内存泄漏,我还是没有搞明白。
根据对象计算的哈希值,存储进对应的区域(假如为区域2),而修改后的对象哈希值有变化,删除时,将拿修改后的哈希值在其对应的区域内(比如在区域3)查找此对象,而修改后的对象在区域3中不存在,所以返回为假,就不删除,对象还是存储在区域2中。而再对修改后的对象进行添加时,发现还是可以存储进去,就会发现,集合中有两个相同的对象被存储在集合中。一个为第一次添加的对象存储在区域2,一个为后来添加的对象存储在区域3。

为什么哈希表在值哈希值改变后仍存储在原来的区域,而不会自动重新分配。

  1. <div class="blockcode"><blockquote>package com.itcast;

  2. import java.util.Collection;
  3. import java.util.HashSet;
  4. import java.util.Iterator;

  5. public class Reflection2 {

  6.        
  7.         public static void main(String[] args) {
  8.                 Collection collections = new HashSet();
  9.                
  10.                 ReflectPoint pt1 = new ReflectPoint(3,3);
  11.                 ReflectPoint pt2 = new ReflectPoint(8,5);
  12.                 ReflectPoint pt3 = new ReflectPoint(3,3);
  13.                
  14.                 collections.add(pt1);
  15.                 collections.add(pt2);
  16.                 collections.add(pt3);
  17.                 //遍历显示
  18.                 Iterator it = collections.iterator();
  19.                 while(it.hasNext())
  20.                 {
  21.                         ReflectPoint pt = (ReflectPoint)it.next();
  22.                         System.out.println(pt.x + ":" + pt.y);
  23.                 }
  24.                 //修改对象
  25.                 pt1.y = 7;
  26.                
  27.                 collections.remove(pt1);
  28.                 System.out.println("sdjisdj");
  29.                 //重新添加
  30.                 collections.add(pt1);
  31.                 //遍历显示
  32.                 Iterator it2 = collections.iterator();
  33.                 while(it2.hasNext())
  34.                 {
  35.                         ReflectPoint pt = (ReflectPoint)it2.next();
  36.                         System.out.println(pt.x + ":" + pt.y + ":" +pt.hashCode());
  37.                 }
  38.                 System.out.println(collections.size());
  39.                
  40.         }

  41. }
复制代码







4 个回复

倒序浏览
HashSet保证元素不重复的方法是?
回复 使用道具 举报
JRT 发表于 2015-6-18 16:14
HashSet保证元素不重复的方法是?

equals方法和hashCode()方法,对象内容和哈希值是否相同。
回复 使用道具 举报
哦哦,谢谢哦
回复 使用道具 举报

你不知道啊,我还以为你能解释呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马