【发布时间】:2013-08-24 16:38:23
【问题描述】:
在我的代码中我想要一个
HashBiMap<T1, HashSet<T2>> bimap;
可以在 bimap 中改变值吗?当我使用bimap.inverse() 时,它不会导致与包含可变键的HashMap 相同的hashCode() 相关问题吗?
【问题讨论】:
-
是的,我希望它有完全相同的问题 - 但无论如何测试它对你来说肯定是微不足道的。
在我的代码中我想要一个
HashBiMap<T1, HashSet<T2>> bimap;
可以在 bimap 中改变值吗?当我使用bimap.inverse() 时,它不会导致与包含可变键的HashMap 相同的hashCode() 相关问题吗?
【问题讨论】:
您最终会遇到与在基于散列的映射中用作键的对象进行变异时通常遇到的完全相同的问题,这很容易证明:
import java.util.*;
import com.google.common.collect.*;
public class Test {
public static void main(String[] args) {
HashBiMap<String, HashSet<String>> bimap = HashBiMap.create();
HashSet<String> set = new HashSet<>();
bimap.put("foo", set);
System.out.println(bimap.inverse().get(set)); // foo
set.add("bar");
System.out.println(bimap.inverse().get(set)); // null
}
}
所以不,这样做不安全。理想情况下,您应该使用不可变类型作为完全防止这种情况发生的关键,而不是依赖于在对相关对象进行变异时小心谨慎。
【讨论】: