黑马程序员技术交流社区

标题: 看张孝祥老师26视频笔记_增强理解【ArrayList_HashSet的比较及... [打印本页]

作者: David.L    时间: 2014-8-26 16:22
标题: 看张孝祥老师26视频笔记_增强理解【ArrayList_HashSet的比较及...
本帖最后由 格子、 于 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. }
复制代码

作者: 低调小邦    时间: 2014-8-27 07:52
谢谢分享~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2