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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

张老师,在讲高新的时候第二十六个视频中,讲到内存泄露问题下面代码
  1. package collectionDemo;

  2. import java.util.Collection;
  3. import java.util.HashMap;
  4. import java.util.HashSet;

  5. public class CollectionTest {
  6.         public static void main(String[] args) {
  7.                 Collection collections = new HashSet();
  8.                 Point p1 = new Point(3,3);
  9.                 Point p2 = new Point(5,5);
  10.                 Point p3 = new Point(3,3);
  11.                 Point p4 = new Point(3,3);
  12.                
  13.                 System.out.println(p1.hashCode()+"---------"+p1.toString());
  14.                 System.out.println(p3.hashCode()+"---------"+p3.toString());
  15.                 collections.add(p1);
  16.                 collections.add(p2);
  17.                 collections.add(p3);
  18.                 collections.add(p4);
  19.                 p1.y = 7;
  20.                 System.out.println(p1.hashCode()+"---------"+p1.toString());
  21.                 System.out.println(collections.size());
  22.                 collections.remove(p1);
  23.                 System.out.println(collections.size());
  24.         }
  25. }
  26. class Point{
  27.         private int x;
  28.         public int y;
  29.        
  30.         public Point(int x, int y) {
  31.                 this.x = x;
  32.                 this.y = y;
  33.         }
  34.        
  35.         @Override
  36.         public int hashCode() {
  37.                 final int prime = 31;
  38.                 int result = 1;
  39.                 result = prime * result + x;
  40.                 result = prime * result + y;
  41.                 return result;
  42.         }

  43.         @Override
  44.         public boolean equals(Object obj) {
  45.                 if (this == obj)
  46.                         return true;
  47.                 if (obj == null)
  48.                         return false;
  49.                 if (getClass() != obj.getClass())
  50.                         return false;
  51.                 Point other = (Point) obj;
  52.                 if (x != other.x)
  53.                         return false;
  54.                 if (y != other.y)
  55.                         return false;
  56.                 return true;
  57.         }
  58.        
  59. }
复制代码



       接下来,说一下我浅显的看法,在集合中存储的是对象的引用,当p1.y=7的时候,p1的引用已经发生改变,但是此时集合中的引用并没有被改变,当你调用collection的contains或者remove方法时,你传入的参数是p1,但是此时p1的引用已经改变,所以集合中找不到这个引用,就更不能删除了,因此会出现,内存泄露的现象。
       求指教

6 个回复

倒序浏览
大神,快来看看,我所想的对不对啊
回复 使用道具 举报
集合内外的引用指向的是同一个对象,你改p1.y,也就是改变了集合内引用所指向的对象。这里访问不到对象从而内存泄露的真正原因是哈希表结构的存储和查找方式。详细过程我不展开了。大概是这么个意思:你买了本书《Java编程思想》,根据哈希算法将其放到了A抽屉。随后你把书换成了《Java核心技术》,仍然放在A抽屉。现在要找《Java核心技术》,可是根据哈希算法,此书应该放在B抽屉,但你到B抽屉显然找不到书
回复 使用道具 举报
fantacyleo 发表于 2014-9-15 14:37
集合内外的引用指向的是同一个对象,你改p1.y,也就是改变了集合内引用所指向的对象。这里访问不到对象从而 ...

大神,果然厉害,解释的真心完美,那么如此来来说,如果在某种巧合的情况下,你改掉p1.y之后,若是根据hashcod算法,这个新p1和原来的p1仍就属于同一个区间,那么这种情况下的话,就不会出现删不掉,和查不到的情况了,对吧?可否如此理解?
回复 使用道具 举报
Mr_Unhappy 发表于 2014-9-15 15:01
大神,果然厉害,解释的真心完美,那么如此来来说,如果在某种巧合的情况下,你改掉p1.y之后,若是根据ha ...

对。大致是这个意思。
回复 使用道具 举报
楼主好眼力,我也看到这点,结果没怎么看懂。目前准备看完第二次复习。
回复 使用道具 举报
残羹夜宴丶 发表于 2014-9-15 15:28
楼主好眼力,我也看到这点,结果没怎么看懂。目前准备看完第二次复习。

不,大神,不是我,我的理解是错的,大神,是你楼上的那位,我是伪 · 大神,他是真 · 大神.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马