黑马程序员技术交流社区

标题: 【哈尔滨校区】【keven整理】Java反射详解【第五弹】 [打印本页]

作者: devilkeven    时间: 2015-12-11 22:43
标题: 【哈尔滨校区】【keven整理】Java反射详解【第五弹】
4、当一个对象存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则对象修改后的哈希值与最初存储进HashSet集合中的哈希值就不同了。在这种情况下,调用contains方法或者remove方法来寻找或者删除这个对象的引用,就会找不到这个对象。从而导致无法从HashSet集合中单独删除当前对象,从而造成内存泄露。(程序中某一些对象不再被使用,以为被删掉了,但是没有,还一直在占用内存中,当这样的对象慢慢增加时,就会造成内存泄露。)
补充:
        内存泄露:某些对象不再使用了,占用着内存空间,并未被释放,就会导致内存泄露;也就是说当程序不断增加对象,修改对象,删除对象,日积月累,内存就会用光了,就导致内存溢出。
示例:
[java] view plaincopy
1. package cn.itheima.Demo;  
2.   
3. import java.util.ArrayList;  
4. import java.util.Collection;  
5. import java.util.HashSet;  
6.   
7. public class HashCodeDemo {  
8.   
9.     public static void main(String[] args) {  
10.         //Collection collection =new ArrayList();  
11.         Collection collection =new HashSet();  
12.         HashCodeTest hct1=new HashCodeTest(1,2);  
13.         HashCodeTest hct2=new HashCodeTest(3,4);  
14.         HashCodeTest hct3=new HashCodeTest(1,2);  
15.           
16.         collection.add(hct1);  
17.         collection.add(hct2);  
18.         collection.add(hct3);  
19.         collection.add(hct1);  
20.           
21.         //hct1.setX(5);  
22.         //collection.remove(hct1);  
23.         System.out.println(collection.size());  
24.     }  
25.   
26. }  
27.   
28. //测试类  
29. class HashCodeTest{  
30.     private int x;  
31.     public int y;  
32.      
33.     public HashCodeTest(int x,int y){  
34.         this.x=x;  
35.         this.y=y;  
36.     }  
37.      
38.     public int getX() {  
39.         return x;  
40.     }  
41.   
42.     public void setX(int x) {  
43.         this.x = x;  
44.     }  
45.   
46.     public int getY() {  
47.         return y;  
48.     }  
49.   
50.     public int hashCode() {  
51.         final int prime = 31;  
52.         int result = 1;  
53.         result = prime * result + x;  
54.         result = prime * result + y;  
55.         return result;  
56.     }  
57.   
58.     public boolean equals(Object obj) {  
59.         if (this == obj)  
60.             return true;  
61.         if (obj == null)  
62.             return false;  
63.         if (getClass() != obj.getClass())  
64.             return false;  
65.         HashCodeTest other = (HashCodeTest) obj;  
66.         if (x != other.x)  
67.             return false;  
68.         if (y != other.y)  
69.             return false;  
70.         return true;  
71.     }  
72.   
73.     public void setY(int y) {  
74.         this.y = y;  
75.     }  
76.   
77.     public String toString() {  
78.         return "HashCodeTest [x=" + x + ", y=" + y + "]";  
79.     }  
80. }  






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