对于为什么会引起内存泄漏,我还是没有搞明白。
根据对象计算的哈希值,存储进对应的区域(假如为区域2),而修改后的对象哈希值有变化,删除时,将拿修改后的哈希值在其对应的区域内(比如在区域3)查找此对象,而修改后的对象在区域3中不存在,所以返回为假,就不删除,对象还是存储在区域2中。而再对修改后的对象进行添加时,发现还是可以存储进去,就会发现,集合中有两个相同的对象被存储在集合中。一个为第一次添加的对象存储在区域2,一个为后来添加的对象存储在区域3。
为什么哈希表在值哈希值改变后仍存储在原来的区域,而不会自动重新分配。
- <div class="blockcode"><blockquote>package com.itcast;
- import java.util.Collection;
- import java.util.HashSet;
- import java.util.Iterator;
- public class Reflection2 {
-
- public static void main(String[] args) {
- Collection collections = new HashSet();
-
- ReflectPoint pt1 = new ReflectPoint(3,3);
- ReflectPoint pt2 = new ReflectPoint(8,5);
- ReflectPoint pt3 = new ReflectPoint(3,3);
-
- collections.add(pt1);
- collections.add(pt2);
- collections.add(pt3);
- //遍历显示
- Iterator it = collections.iterator();
- while(it.hasNext())
- {
- ReflectPoint pt = (ReflectPoint)it.next();
- System.out.println(pt.x + ":" + pt.y);
- }
- //修改对象
- pt1.y = 7;
-
- collections.remove(pt1);
- System.out.println("sdjisdj");
- //重新添加
- collections.add(pt1);
- //遍历显示
- Iterator it2 = collections.iterator();
- while(it2.hasNext())
- {
- ReflectPoint pt = (ReflectPoint)it2.next();
- System.out.println(pt.x + ":" + pt.y + ":" +pt.hashCode());
- }
- System.out.println(collections.size());
-
- }
- }
复制代码
|
|