本帖最后由 格子、 于 2014-8-27 07:58 编辑
视频中讲到当生成哈希值后,参与哈希值计算的字段(如y)就不能再改变值,否则会引起上述无法删除,造成内存泄露。一开始不太理解,于是加了pt1.y=8做测试,发现pt1.y=8还能正常运行,经过思考,终于理解,最后备注上自己的理解,欢迎探讨。
源代码(需配合视频中的ReflectPoint自定义类):
- package cn.itcast.day01;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.HashSet;
- public class ReflectTest2 {
- public static void main(String[] args)throws Exception{
- Collection collections=new HashSet();//未覆盖equals前结果为3;另ArrayList结果为4
- ReflectPoint pt1=new ReflectPoint(3,3);
- ReflectPoint pt2=new ReflectPoint(5,5);
- ReflectPoint pt3=new ReflectPoint(3,3);
- collections.add(pt1);
- collections.add(pt2);
- collections.add(pt3);
- collections.add(pt1);
-
- pt1.y=7;//这里赋值后,pt1的哈希值已经改变
- System.out.println(pt1);
- pt1.y=8;//这里因为pt1是对象变量,引用的是内存地址值,所以还能赋值,赋值后,哈希值也又变了
- System.out.println(pt1);
- collections.remove(pt1);//这里collections引用了集合已存储的原哈希值,所以无法删除
- //所以当生成哈希值后,参与哈希值计算的字段(如y)就不能再改变值,否则会引起上述无法删除,造成内存泄露。
-
- System.out.println(collections.size());
- }
- }
复制代码 |