本帖最后由 王海宇 于 2012-9-23 20:26 编辑
举例子的话,HashSet集合就是一个。哈希集合在保存元素的时候(存的是元素引用),会依据元素的hashcode值来将不同的元素放在不同的存储区域。当某个元素参与hashCode值计算的属性被修改,就会导致该元素的hashCode也发生变化,这样更改后的hashCode很可能就无法再匹配之前的那个区域,从而导致之前那个区域里存放的元素的引用再也无法被访问到,自然也就没法对它进行删除操作了。这样的后果就是,当外界再也没有哪个引用指向那个被修改的元素的时候,在哈希集合里面却仍然保存这这个不再被外界使用的元素的引用,而且也无法被外界访问到。这就造成了内存泄露(因为这个元素对象的引用还存储在集合中,所以Java虚拟机就认为这个元素还会有用处,就不会对其进行垃圾回收,即使在集合的外面已经不再使用这个元素对象。当这样的情况出现过多时,就会导致计算机内存大量被垃圾数据占用,最终导致内存溢出) |