黑马程序员技术交流社区
标题:
看张孝祥老师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自定义类):
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());
}
}
复制代码
作者:
低调小邦
时间:
2014-8-27 07:52
谢谢分享~~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2