1

根据 Java doc for weakhashmap

“此类主要用于键对象,其 equals 方法使用 == 运算符测试对象身份。一旦丢弃此类键,它将永远无法重新创建,因此不可能在 WeakHashMap 中查找该键"

这是否意味着如果我们使用 objectA 作为 Weakhashmap 中条目 0 的键,然后我们删除该条目,testMapHashWeak.remove(objectA);我们就不能objectA对另一个条目使用相同的键?因为我做了一个小测试,我可以做到:

    public void test4WeakHashMap(WeakHashMap<B, String> testMapHashWeak) {
    B objectB = new B();
    String sTest = "hola";
    System.out.println("1st time - key&value inserted ->"+objectB+","+sTest);
    testMapHashWeak.put(objectB, sTest);
    System.out.println("Get element 1st time-> "+testMapHashWeak.get(objectB));
    testMapHashWeak.remove(objectB);
    //Insert 2nd time
    System.out.println("2st time - key&value inserted ->"+objectB+","+sTest);
    testMapHashWeak.put(objectB, sTest);        
    System.out.println("Get element 2nd time-> "+testMapHashWeak.get(objectB));
}

作为输出:

1st time - key&value inserted ->B@634e3372,hola
Get element 1st time-> hola
2st time - key&value inserted ->B@634e3372,hola
Get element 2nd time-> hola
4

2 回答 2

1

那句话中的“discarded”意味着“关键对象不再被普通使用”,不再是一个活的对象。objectB对于您在整个方法范围内使用的情况,情况并非如此test4WeakHashMap

来自相同的文档:

WeakHashMap 中的条目在其键不再常用时将被自动删除。更准确地说,给定键的映射的存在不会阻止该键被垃圾收集器丢弃,也就是说,使其可终结,最终确定,然后回收。当一个键被丢弃时,它的条目被有效地从映射中删除,所以这个类的行为与其他映射实现有些不同。

注意“被垃圾收集器丢弃”。因此,“从地图中移除”与“丢弃”不同。

于 2013-05-31T09:22:23.850 回答
1

说明:

此类主要用于关键对象,其 equals 方法使用 == 运算符测试对象身份。一旦这样的键被丢弃,它就永远无法重新创建,因此不可能在 WeakHashMap 中查找该键

表示该类旨在与键一起使用,在重新创建后(创建新的完全相同的实例)相互比较时返回 false。换句话说,此类键的每个新实例都是唯一的(仅在equals()与自身比较时返回 true,在与任何其他实例/对象比较时返回 false)例如String不是这样的类,而Objectis:

WeakHashMap testMapHashWeak = new WeakHashMap<Object, String>();

String value1 = "Hola1!";
String value2 = "Hola2!";

String key1 = new String("key");
String key2 = new String("key");

assert key1 != key2; // Keys are different objects...
assert key1.equals(key2); // but are equal to each other

testMapHashWeak.put(key1, value1);
testMapHashWeak.put(key2, value2);

// value2 instead of value1!
System.out.println("Get using key1 (expected Hola1): "+testMapHashWeak.get(key1));
// value2
System.out.println("Get using key2 (expected Hola2): "+testMapHashWeak.get(key2));

Object key3 = new Object();
Object key4 = new Object();

assert key3 != key4; // Keys are different objects...
assert !key3.equals(key4); // and are not equal to each other

testMapHashWeak.put(key3, value1);
testMapHashWeak.put(key4, value2);

// value2 instead of value1!
System.out.println("Get using key3 (expected Hola1):"+testMapHashWeak.get(key3)); // value1!
// value2
System.out.println("Get using key4 (expected Hola2):"+testMapHashWeak.get(key4));

WeakHashMap是具有弱键的 Map 的实现。所以在 key 被垃圾回收之后,map 中的整个条目(key,value)都将消失。那么这里的关键词是“之后”,意思是不早于任何时刻。因此,在键被标记为“被 GC 删除”之前,在它被实际删除之前,映射将包含不应获得的键值条目。在使用基于字符串的键的第一个示例中,可以使用不同的键获取值,但您无法预测该值是否存在(它可能已经被 GCd)。在第二个示例中,无论如何您都不能。

于 2013-05-31T09:36:56.077 回答