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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package com.bocsoft.study;

  2. import java.util.*;
  3. /**
  4. *
  5. * @author jojo
  6. * 时间:2015-1-11
  7. */

  8. public class HashSetDelete {

  9. /**
  10. * @param args
  11. */
  12. public static void main(String[] args) {

  13. HashSet<Point> hs = new HashSet<Point>();
  14. Point p1 = new Point(1,1);
  15. Point p2 = new Point(2,2);
  16. Point p3 = new Point(3,3);

  17. hs.add(p1);
  18. hs.add(p2);
  19. hs.add(p3);
  20. System.out.println("删除前,HashSet中元素的个数为:" + hs.size());

  21. //下面就是精彩的部分来了哟,删除前后元素个数的变化
  22. p1.setX(2);
  23. hs.remove(p1);
  24. System.out.println("删除后,HashSet中元素的个数为:" + hs.size());


  25. }

  26. }

  27. class Point{

  28. private int x;
  29. private int y;

  30. //构造函数
  31. public Point(int x, int y){
  32. this.x = x;
  33. this.y = y;
  34. }

  35. //重写equals方法,定义属于自己判断相等方法
  36. @Override
  37. public boolean equals(Object obj){
  38. if(!(obj instanceof Point))
  39. throw new ClassCastException("比较对象的类型不匹配");
  40. Point p = (Point)obj;
  41. return this.x == p.x && this.y == p.y; //横纵坐标都相等才视为同一个Point对象
  42. }

  43. //重写hashCode方法,必须的,因为已经重写equals方法了
  44. @Override
  45. public int hashCode(){
  46. return x + y; //这里随意简写写一个了,保证同一对象的hashCode值一样就可以了。
  47. }

  48. //以下为对象的get和set方法
  49. public int getX() {
  50. return x;
  51. }
  52. public void setX(int x) {
  53. this.x = x;
  54. }
  55. public int getY() {
  56. return y;
  57. }
  58. public void setY(int y) {
  59. this.y = y;
  60. }

  61. }
复制代码
代码可以直接来运行,你会发现删除前后,hashSet中元素的个数没有任何变化。这是为什么呢?
当我对p1的值进行修改后,若再对其进行删除操作,因为p1已经发现变化,删除时会先计算p1的hash值,
这时候p1的hash值已经和原来的不一样了,所以说你根本删除不了hashset中存储的那个p1。
这也就给了我们一个使用hash结构集合的警告:当元素存储进hash结构的集合中后,不要轻易地对其进行删除
操作,这样不但删除不了元素,还会造成没有任何引用指向要删除的那个元素,这就是内存泄露了,别小看,当你平凡更改hash结构中的
元素并删除时,java真的有可能出现内存泄露问题的。
PS:这是张孝祥老师的视频中讲到的一段内容,其实,我发现张老师的课程比较有深度,大家要是把基础复习一遍了,可以去看下他全套的java基础加强视频,
收获会很多。。
刚刚被版主,警告有发水帖的嫌疑了,呜呜。。。的确是想快点拿到技术分,早日进入黑马,好吧,我错了。

谨以此小程序与大家共勉,一些该注意的地方,共享出来与大家分享,独乐不如总乐。再者,自己真的在看别人的总结帖中,也收获很多。发真正有技术含量的帖子,其实也是
对大家知识的一些巩固。

评分

参与人数 1技术分 +2 收起 理由
杨佳名 + 2 继续加油!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马