Java 如何防止值强引用其键?

Java 如何防止值强引用其键?,java,weakhashmap,strong-references,java-websocket,Java,Weakhashmap,Strong References,Java Websocket,一位比我好得多的程序员告诉我,他在一个WeakHashMap中持有一张他与java WebSocket的connections的映射。我自己查看了这个映射,它看起来很完美,因为连接将关闭,而负责保存映射的线程不会立即意识到这一点,从而允许对关闭的连接进行垃圾收集 在中,我注意到“WeakHashMap中的值对象由普通的强引用持有。因此,应注意确保值对象不直接或间接地强引用它们自己的键,因为这将防止键被丢弃。” 这是否意味着一个值在WeakHashMap中根本不应该引用它或任何其他键,这样就不会阻

一位比我好得多的程序员告诉我,他在一个
WeakHashMap
中持有一张他与java WebSocket的
connections的映射。我自己查看了这个映射,它看起来很完美,因为连接将关闭,而负责保存映射的线程不会立即意识到这一点,从而允许对关闭的连接进行垃圾收集

在中,我注意到“WeakHashMap中的值对象由普通的强引用持有。因此,应注意确保值对象不直接或间接地强引用它们自己的键,因为这将防止键被丢弃。”

这是否意味着一个值在
WeakHashMap
中根本不应该引用它或任何其他键,这样就不会阻止垃圾收集

那么,一个值对其键的强引用究竟是如何生成的呢

例如,我需要保存一个与密钥(连接)关联的IP和DNS地址列表。如何确保这些不是对密钥的
InetSocketAddress
的强引用,然后
InetAddress

这是否意味着一个值在
WeakHashMap
中根本不应该引用它或任何其他键,这样就不会阻止垃圾收集

值不应该引用自己的键,但可以引用其他键

那么,一个值对其键的强引用究竟是如何生成的呢

如果键是
String
s,并且值具有
String
数据字段,则可以将该
String
字段设置为对象的键,以创建从值到其键的强引用

例如,我需要保存一个与密钥(连接)关联的IP和DNS地址列表。如何确保这些不是对密钥的
InetSocketAddress
的强引用,然后
InetAddress


InetAddress
没有对您从中获得它的连接的强引用。没有构造函数接受
WebSocket
,因此
InetAddress
无法引用您从中获得的
WebSocket

谢谢tbodt!键中的
InetSocketAddress
值的
字符串
是否为强引用?提前非常感谢!再次感谢您,tbodt!我对Java还是新手,所以您是否介意用示例更明确地解释一下
InetAddress
值的
List
是如何和不会强烈引用键的?我不确定如何防止这种情况,因为
InetAddress
来自密钥。我用的是这个答案的前半部分。提前再次非常感谢您!即使
InetAddress
来自键,但
InetAddress
对键的引用并不强。