首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

重写hashCode()方法可能引起的内存溢出有关问题

2013-12-02 
重写hashCode()方法可能引起的内存溢出问题class Persion{String name//姓名int age//年龄int weight//

重写hashCode()方法可能引起的内存溢出问题
class Persion{String name;//姓名int age;//年龄int weight;//体重public Persion(String name,int age,int weight){this.name=name;this.age=age;this.weight=weight;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());result = prime * result + weight;return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Persion other = (Persion) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;if (weight != other.weight)return false;return true;}}?  我们定义了如下两个对象

?

Person person1=new?Person("张三",60,70);//一个年龄为60岁,体重为70公斤的张三

Person person2=new?Person("张三",71,60);//一个年龄为71岁,体重为60公斤的张三

将这两个对象都add到hashset中,后发现,person2的年龄错了,要修改成70岁,于是乎我们按上边的代码执行时,person1被从hashset中remove掉了,只是我们不想看到的。

?

  经过查阅资料及求助于各大搜索引擎发现,这种问题在设计层面竟然没有好的办法可以规避。出问题的点就在:重写hashcode方法后,修改成员字段数值会影响hashcode值,进而影响到对象在哈希表中的位置,致使remove方法无法找到原来的对象,但是,对象有在哈希表中有引用,hash对象又没有被释放。垃圾回收器发现其还有引用,又不会回收该对象。于是,内存泄漏了。

  总结:重写hashcode方法的类对象,在放入hash表后,一定要谨慎操作对象字段属性值。如果要修改,先从哈希表中删除该对象,修改后再放入哈希表。

  

?

?

热点排行