WeakMapECMAScript 6中引入的数据结构的实际用途是什么?
由于弱映射的键会创建对其相应值的强引用,因此只要其键仍处于活动状态,确保插入到弱映射中的值永远不会消失,它不能用于备注表,缓存或您通常使用弱引用的任何其他内容,具有弱值的映射等.
在我看来,这个:
weakmap.set(key, value);
Run Code Online (Sandbox Code Playgroud)
......这只是一种迂回的说法:
key.value = value;
Run Code Online (Sandbox Code Playgroud)
我错过了哪些具体的用例?
什么是什么WeakHashMap时候应该使用它?a WeakHashMap和a 之间有什么区别HashMap?
我知道弱引用受到垃圾收集器的支配,我们不能保证弱引用会存在.我看不出需要弱参考,但确定应该有理由.
我们可以看到"幻影可达"与"无法访问"一样无法访问:§
如果一个物体既不是强烈的,柔和的,也不是微弱的可触及的,那么该物体是幻影可达的,它已被最终确定,并且一些幻象参考指的是它.
最后,如果无法通过上述任何方式访问某个对象,则该对象无法访问,因此有资格进行回收.
现在,来自:http://download.oracle.com/javase/6/docs/api/java/lang/ref/PhantomReference.html
与软引用和弱引用不同,垃圾收集器在排队时不会自动清除幻像引用.通过幻像引用可访问的对象将保持不变,直到所有此类引用都被清除或自身无法访问.
基本原理是什么?还有一个吗?
这是Java API怪癖的另一个典型案例吗?
我最近发现了WeakHashMapJava中的数据结构.
但是,我不明白它的意思是垃圾收集不再正常使用时的映射.数据结构如何知道我将不再使用我的程序中的密钥?如果我长时间没有提到钥匙怎么办?
正如weakhashmap如何理解对其中一个密钥的引用现在已经过时,特别是如果密钥是一个汇集的String?
WeakHashMap是Map接口的一个实现,如果相应的键不再被任何程序部分引用,Grabage Collector可以回收值对象的内存.因此,如果密钥不再用于程序中.它的Entry对象将被垃圾收集,无论其用途如何.它清晰到这里
这与HashMap不同,即使不再引用key,值对象仍保留在HashMap中.我们需要在HashMap对象上显式调用remove()方法来删除值.调用remove将只删除map中的条目.它对GC的准备将取决于它是否仍然在程序中的某个地方使用.
根据我的理解,在HashMap上使用WeakHashMap
我的理解是,只有当我们想要确保Grabage Collector在任何部分程序不再引用密钥时回收值对象时,我们才应该使用WeakHashMap.这使程序内存有效我的理解是正确的吗?
根据JavaDocs使用WeakHashMap ,我可以发现这个声明
此类主要用于密钥对象,其等于方法使用==运算符测试对象标识.
我没有得到上述声明的含义以及它与我对WeakHashMap用法的理解形成对比.实际上我没有得到这个陈述与WeakHashMap的使用有何关系?
更新: - 进一步仔细阅读下面的声明javadocs
当其密钥不再正常使用时,WeakHashMap中的条目将自动被删除.更准确地说,给定密钥的映射的存在不会阻止密钥被垃圾收集器丢弃,即,可以最终化,最终化,然后回收.当一个键被丢弃时,它的条目将被有效地从地图中删除,因此该类的行为与其他Map实现略有不同.
为了我和他人的利益,我正在修改我的理解
根据我的修订理解,在HashMap上使用WeakHashMap
我们应该只在我们想要确保在GC运行时从地图中删除键值对时才能使用WeakHashMap,而键不再是普通用途而不是map本身.
例如: -
WeakHashMap<Integer, String> numbers = new WeakHashMap<Integer, String>();
numbers.put(new Integer(1), "one");// key only used within map not anywhere else
numbers.put(new Integer(2), "two");
System.out.println(numbers.get(new Integer(1))); // prints "one"
System.gc();
// let's say a garbage collection happens here
System.out.println(numbers.get(new Integer(1))); // prints "null"
System.out.println(numbers.get(new Integer(2))); // prints "null"
Object key = new Object();
m1.put(key, c1);
System.out.println(m1.size());
key = null or new …Run Code Online (Sandbox Code Playgroud) 当已经有其他实现可用时,还需要引入 Weak HashMap 吗?
简而言之,我有两个问题:
Why jdk has WeakHashMap when there is HashMap and Concurrent HashMap in java ?
What is the use of it in real life applications ?
编辑 :
虽然 WeakHashmap key 是弱引用,但它们仍然引用了一些东西,而不是 GC 在 WeakHashMap 中丢弃键的依据。
java hashmap concurrenthashmap java.util.concurrent weakhashmap
想象一下,我有一些看起来像这样的类:
class Car {
private Image carImage;
public Car(int imageIndex) {
switch (imageIndex) {
case 1: carImage = generateCarImage(1); break;
# and so forth
}
}
}
class Audi extends Car {
private int numberOfSeats;
public Audi(int imageIndex, int numberOfSeats) {
super(imageIndex);
this.numberOfSeats = numberOfSeats;
}
}
Run Code Online (Sandbox Code Playgroud)
现在假设我使用相同的图像创建多个奥迪:
Audi car1 = new Audi(1,2);
Audi car2 = new Audi(1,3);
Run Code Online (Sandbox Code Playgroud)
car1和car2会延伸相同的物体吗?我假设没有,但有没有办法可以做到这一点?我问,因为我想避免两次生成和存储相同的图像.
编辑:
这两个奥迪会参考同一辆车吗,例如图像只生成和存储一次,对一个的任何变化都会影响另一个吗?
class Car {
private Image carImage;
public Car(int imageIndex) {
switch (imageIndex) {
case 1: # carImage = readfile(1.jpeg) …Run Code Online (Sandbox Code Playgroud) 我上课的时候
class MyClass1 {
MyClass2 member;
}
Run Code Online (Sandbox Code Playgroud)
ans它是垃圾收集,然后member也有资格垃圾收集.
我可以模拟同样的关系Map吗?
所以,我希望一个带有弱引用键的地图.即地图本身不应该阻止垃圾收集密钥.一旦密钥被垃圾收集,其关联值也有资格进行垃圾收集.
这可能吗?
UPDATE
这只是WeakHashMap?
java ×11
weakhashmap ×4
hashmap ×3
collections ×1
dictionary ×1
ecmascript-6 ×1
java-8 ×1
javascript ×1
reference ×1
weakmap ×1