在我的代碼,我想有一個在HashBiMap中變更值是否安全?
HashBiMap<T1, HashSet<T2>> bimap;
是否確定變異在bimap的價值觀?當我使用bimap.inverse()
時,是不是會導致與使用包含可變鍵的HashMap相關的相關問題相同的hashCode()
?
在我的代碼,我想有一個在HashBiMap中變更值是否安全?
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
}
}
所以,不,這是這樣做不安全。理想情況下,您應該使用不可變類型作爲完全防止這種情況發生的關鍵,而不是在您更改有問題的對象時小心謹慎。
我詳細闡述了BiMap的用法並創建了不可變的值由以下博客文章中的JDK8收集器鏈設置:http://tomaszalusky.blogspot.cz/2017/02/playing-with-java-8-collectors.html –
是的,我希望它有完全相同的問題 - 但無論如何,測試這件事確實是微不足道的。 –