根据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
答案 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)。在第二个例子中,无论如何都不能。