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

本帖最后由 格子、 于 2014-8-27 07:58 编辑

视频中讲到当生成哈希值后,参与哈希值计算的字段(如y)就不能再改变值,否则会引起上述无法删除,造成内存泄露。一开始不太理解,于是加了pt1.y=8做测试,发现pt1.y=8还能正常运行,经过思考,终于理解,最后备注上自己的理解,欢迎探讨。
源代码(需配合视频中的ReflectPoint自定义类):
  1. package cn.itcast.day01;

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

  5. public class ReflectTest2 {
  6.         public static void main(String[] args)throws Exception{
  7.                 Collection collections=new HashSet();//未覆盖equals前结果为3;另ArrayList结果为4
  8.                 ReflectPoint pt1=new ReflectPoint(3,3);
  9.                 ReflectPoint pt2=new ReflectPoint(5,5);
  10.                 ReflectPoint pt3=new ReflectPoint(3,3);
  11.                 collections.add(pt1);
  12.                 collections.add(pt2);
  13.                 collections.add(pt3);
  14.                 collections.add(pt1);
  15.                
  16.                 pt1.y=7;//这里赋值后,pt1的哈希值已经改变
  17.                 System.out.println(pt1);
  18.                 pt1.y=8;//这里因为pt1是对象变量,引用的是内存地址值,所以还能赋值,赋值后,哈希值也又变了
  19.                 System.out.println(pt1);
  20.                 collections.remove(pt1);//这里collections引用了集合已存储的原哈希值,所以无法删除
  21.                 //所以当生成哈希值后,参与哈希值计算的字段(如y)就不能再改变值,否则会引起上述无法删除,造成内存泄露。
  22.                
  23.                 System.out.println(collections.size());
  24.         }

  25. }
复制代码

评分

参与人数 1黑马币 +4 收起 理由
格子、 + 4 不知道该如何评价了

查看全部评分

1 个回复

倒序浏览
谢谢分享~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马