`
lt200819
  • 浏览: 181804 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA中的内存泄露

    博客分类:
  • JAVA
阅读更多

很长时间以前,研究过JAVA的内存泄露,正好今天找到这篇帖子,这种hashSet的泄露和经典。懒的写了,转载过来。

所谓内存泄露就是一个对象占用的一块内存,当这个对象不在被使用时,该内存还没有被收回。

例子

package cn.xy.test;

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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有关的字段。

本文出自 “IT Fat Man” 博客,请务必保留此出处http://woshixy.blog.51cto.com/5637578/1061147

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics