黑马程序员技术交流社区
标题:
关于hash表结构元素删除的问题,分享自己了一段程序和经验
[打印本页]
作者:
jojo
时间:
2015-1-11 13:16
标题:
关于hash表结构元素删除的问题,分享自己了一段程序和经验
package com.bocsoft.study;
import java.util.*;
/**
*
* @author jojo
* 时间:2015-1-11
*/
public class HashSetDelete {
/**
* @param args
*/
public static void main(String[] args) {
HashSet<Point> hs = new HashSet<Point>();
Point p1 = new Point(1,1);
Point p2 = new Point(2,2);
Point p3 = new Point(3,3);
hs.add(p1);
hs.add(p2);
hs.add(p3);
System.out.println("删除前,HashSet中元素的个数为:" + hs.size());
//下面就是精彩的部分来了哟,删除前后元素个数的变化
p1.setX(2);
hs.remove(p1);
System.out.println("删除后,HashSet中元素的个数为:" + hs.size());
}
}
class Point{
private int x;
private int y;
//构造函数
public Point(int x, int y){
this.x = x;
this.y = y;
}
//重写equals方法,定义属于自己判断相等方法
@Override
public boolean equals(Object obj){
if(!(obj instanceof Point))
throw new ClassCastException("比较对象的类型不匹配");
Point p = (Point)obj;
return this.x == p.x && this.y == p.y; //横纵坐标都相等才视为同一个Point对象
}
//重写hashCode方法,必须的,因为已经重写equals方法了
@Override
public int hashCode(){
return x + y; //这里随意简写写一个了,保证同一对象的hashCode值一样就可以了。
}
//以下为对象的get和set方法
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
复制代码
代码可以直接来运行,你会发现删除前后,hashSet中元素的个数没有任何变化。这是为什么呢?
当我对p1的值进行修改后,若再对其进行删除操作,因为p1已经发现变化,删除时会先计算p1的hash值,
这时候p1的hash值已经和原来的不一样了,所以说你根本删除不了hashset中存储的那个p1。
这也就给了我们一个使用hash结构集合的警告:当元素存储进hash结构的集合中后,不要轻易地对其进行删除
操作,这样不但删除不了元素,还会造成没有任何引用指向要删除的那个元素,这就是内存泄露了,别小看,当你平凡更改hash结构中的
元素并删除时,java真的有可能出现内存泄露问题的。
PS:这是张孝祥老师的视频中讲到的一段内容,其实,我发现张老师的课程比较有深度,大家要是把基础复习一遍了,可以去看下他全套的java基础加强视频,
收获会很多。。
刚刚被版主,警告有发水帖的嫌疑了,呜呜。。。的确是想快点拿到技术分,早日进入黑马,好吧,我错了。
谨以此小程序与大家共勉,一些该注意的地方,共享出来与大家分享,独乐不如总乐。再者,自己真的在看别人的总结帖中,也收获很多。发真正有技术含量的帖子,其实也是
对大家知识的一些巩固。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2