在WeakHashMap上重新创建相同的键

时间:2013-05-31 09:06:36

标签: java weakhashmap

根据weakhashmap的Java文档:

“此类主要用于密钥对象,其等于方法使用==运算符测试对象标识。一旦丢弃这样的密钥,就永远无法重新创建,因此无法查找该密钥在WeakHashMap中“

这是否意味着如果我们在weakhashmap中使用objectA作为条目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

2 个答案:

答案 0 :(得分:1)

在该句中“丢弃”意味着“关键对象不再是普通用途”,不再是活对象。对于objectB方法的整个范围内使用的test4WeakHashMap,情况并非如此。

来自相同的文档:

  

当WeakHashMap中的条目不再正常使用时,它将自动被删除。更准确地说,给定密钥的映射的存在不会阻止密钥被垃圾收集器丢弃,即,可以最终化,最终化,然后回收。当一个键被丢弃时,它的条目将被有效地从地图中删除,因此该类的行为与其他Map实现略有不同。

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

答案 1 :(得分:1)

描述:

  

此类主要用于其关键对象   equals使用==运算符测试对象标识的方法。一旦   这样的密钥被丢弃它永远不能被重新创建,所以这是不可能的   在WeakHashMap中查找该键

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

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的一个实现,它具有弱键。因此,在密钥被垃圾收集后,地图中的整个条目(密钥,值)将消失。那么这里的关键词是&#34;在&#34;之后,这意味着不会更快。因此,密钥之间标记为“要被GC删除”,并且在实际删除之前,映射将包含无法获取的键值输入。在使用基于字符串的键的第一个示例中,可以使用不同的键获取值,但是您无法预测值是否存在(它可能已经是GCd)。在第二个例子中,无论如何都不能。