|
楼主 |
发表于 2020-6-26 21:30:01
|
显示全部楼层
如楼上所说,如果显式的把键设为null,是可以加进去的,如果键是一个对象,不是字符串,则当这个对象为null时,weakhashmap 会自动减小容量,把这个键值对删出集合中.
字符串表现出的性质让人百思不解,它虽然是最终类,可是集合里保存的是引用,不是它本身,理说这个引用会指向新对象,可是为什么还是指向老对象呢?老对象不是应该会GC回收的吗?
代码如下:
package statictest;
import java.util.*;
import java.lang.ref.*;
import java.lang.ref.*;
class A
{
int a=3;
String str="hello";
public String toString()
{
return str+a;
}
}
public class StaticTest
{
public static void main(String[] args) throws Exception
{
Map map=new WeakHashMap();
String b="this is b:";
A ab=new A();
map.put(ab, new A());
map.put(b, "b");
System.out.println(map);
String c=(String)map.get(b);
c=null; //把键b的值设为null,但打印出来却没有变化.
ab=null; //由于ab是一个类对象的引用,所以会被移出map
b=null; //可是键b也是一个对象,为什么置为null时会没变化呢??
System.gc(); //一定要调用,否则GC来不及回收,仍会打印出原来的键值对
System.out.println(map);
}
}
打印结果:
{hello3=hello3, this is b:=b}
{this is b:=b} |
|