黑马程序员技术交流社区

标题: 关于HashSet引起的内存泄露问题 [打印本页]

作者: 贾文泽    时间: 2013-3-9 17:12
标题: 关于HashSet引起的内存泄露问题
  1. public static void main(String[] args) {
  2.                 // TODO Auto-generated method stub
  3.                
  4.                 //Collection collections = new ArrayList();   //size为4
  5.                 Collection collections = new HashSet();    //size为3
  6.                
  7.                 ReflectPoint pt1 = new ReflectPoint(3,3);
  8.                 ReflectPoint pt2 = new ReflectPoint(5,5);
  9.                 ReflectPoint pt3 = new ReflectPoint(3,3);
  10.                
  11.                 collections.add(pt1);
  12.                 collections.add(pt2);
  13.                 collections.add(pt3);
  14.                 collections.add(pt1);   //有相同对象,没存进去
  15.                
  16.                 //System.out.println(collections.size());  //输出 3
  17.                 pt1.x=7;                                //这里改变字段,哈希值应该会变化,下面的移除造作无效,导致内存泄露
  18.                 collections.remove(pt1);
  19.                
  20.                 System.out.println(collections.size());   // 输出2  上面移除无效,这里应该也输出3,但结果是输出2,说明上一布的移除操作成功了
  21.         }
复制代码
ReflectPoint类代码
  1. public class ReflectPoint {
  2.          int x;
  3.          int y;
  4.        
  5.         public ReflectPoint(int x, int y) {
  6.                 super();
  7.                 this.x = x;
  8.                 this.y = y;
  9.         }
复制代码
后来发现,只有重写了hashCode() 方法后,对计算哈希值的字段改动才会造成内存泄露。
  1. public class ReflectPoint {
  2.          int x;
  3.          int y;
  4.        
  5.         public ReflectPoint(int x, int y) {
  6.                 super();
  7.                 this.x = x;
  8.                 this.y = y;
  9.         }

  10.         @Override
  11.         public int hashCode() {
  12.                 final int prime = 31;
  13.                 int result = 1;
  14.                 result = prime * result + x;
  15.                 result = prime * result + y;
  16.                 return result;
  17.         }

  18.         @Override
  19.         public boolean equals(Object obj) {
  20.                 if (this == obj)
  21.                         return true;
  22.                 if (obj == null)
  23.                         return false;
  24.                 if (getClass() != obj.getClass())
  25.                         return false;
  26.                 ReflectPoint other = (ReflectPoint) obj;
  27.                 if (x != other.x)
  28.                         return false;
  29.                 if (y != other.y)
  30.                         return false;
  31.                 return true;
  32.         }

  33.        
  34. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2