本帖最后由 王俊杰 于 2013-3-30 13:40 编辑
由于我实际上还没有看这个视频,所以帮你查了一下。
希望对你有帮助。如何避免内存泄漏,这一点我也没有好的办法。希望能看到富有启发性的回复。
关于HashCode和内存泄漏的问题。如果不想将参数相同的对象存入HashSet,可以重写hashCode方法和equals方法。需要返回相同的hashCode,才能判断对象相等。当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄漏。部分代码展示:- public static void main(String[] args) throws Exception {
- ReflectPoint r1 = new ReflectPoint(123,"kenny");
- ReflectPoint r2 = new ReflectPoint(12123,"kenny");
- ReflectPoint r3 = new ReflectPoint(113,"kdfny");
- ReflectPoint r4 = new ReflectPoint(123,"kenny");
- Collection coll = new HashSet();
- coll.add(r1);
- coll.add(r2);
- coll.add(r3);
- coll.add(r4);
- coll.add(r1);
- r2.name = "df";//如果在此处修改了name,那么同时就改了r2的hashcode,
- //所以下面的语句就不能删除r2了,而是删除了其它东西。这也叫内存泄漏。
- coll.remove(r2);
- System.out.println(coll.size());
- ××××××××××××××××××
- public class ReflectPoint {
-
- private int password;
- String name;
- public ReflectPoint(int password, String name) {
- super();
- this.password = password;
- this.name = name;
- }
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((name == null) ? 0 : name.hashCode());
- result = prime * result + password;
- return result;
- }
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- ReflectPoint other = (ReflectPoint) obj;
- if (name == null) {
- if (other.name != null)
- return false;
- } else if (!name.equals(other.name))
- return false;
- if (password != other.password)
- return false;
- return true;
- }
-
-
- }
复制代码 声明:以上内容非本人原创。
详细请参考http://blog.csdn.net/yinkai1205/article/details/6254782 在此谨向yinkai1205致敬! |