閱讀649 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Java中的HashCode(2)之Hashset造成的內存泄露



所謂內存泄露就是一個對象占用的一塊內存,當這個對象不在被使用時,該內存還沒有被收回。

 

例子

package cn.xy.test;

public class Point2
{
 private int x;
 private int y;

 public Point2(int x, int y)
 {
  super();
  this.x = x;
  this.y = y;
 }

 @Override
 public int hashCode()
 {
  final int prime = 31;
  int result = 1;
  result = prime * result + x;
  result = prime * result + y;
  return result;
 }

 @Override
 public boolean equals(Object obj)
 {
  if (this == obj) return true;
  if (obj == null) return false;
  if (getClass() != obj.getClass()) return false;
  Point2 other = (Point2) obj;
  if (x != other.x) return false;
  if (y != other.y) return false;
  return true;
 }

 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;
 }

}

public class HashSetAndHashCode2
{
 public static void main(String[] args)
 {
  HashSet<Point2> hs2 = new HashSet<Point2>();
  Point2 p21 = new Point2(3, 3);
  Point2 p22 = new Point2(3, 5);
  hs2.add(p21);
  hs2.add(p22);
  p22.setY(7);
  hs2.remove(p22);
  System.out.println(hs2.size());
 }
}

很多人認為打印出的結果是1。結果是2。為什麼呢?當一個對象被存儲在Hashset中後,如果修改參與計算hashcode有關的字段,那麼修改後的hashcode的值就與一開始存儲進來的hashcode的值不同了,這樣contains無法通過hashcode找到該元素,所以無法刪除。這就告訴我們,當一個對象被存儲在Hashset中後,不要修改與計算hashcode有關的字段。

 

 

最後更新:2017-04-03 05:40:29

  上一篇:go java中泛型學習2之類型參數(T)
  下一篇:go java線程學習5——線程同步之同步方法