2013-08-24 66 views
4

在我的代碼,我想有一個在HashBiMap中變更值是否安全?

HashBiMap<T1, HashSet<T2>> bimap; 

是否確定變異在bimap的價值觀?當我使用bimap.inverse()時,是不是會導致與使用包含可變鍵的HashMap相關的相關問題相同的hashCode()

+0

是的,我希望它有完全相同的問題 - 但無論如何,測試這件事確實是微不足道的。 –

回答

6

你最終完全一樣的問題,你突變被用作在基於散列映射的關鍵對象時,通常會得到,這是很容易證明:

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 
    } 
} 

所以,不,這是這樣做不安全。理想情況下,您應該使用不可變類型作爲完全防止這種情況發生的關鍵,而不是在您更改有問題的對象時小心謹慎。

+0

我詳細闡述了BiMap的用法並創建了不可變的值由以下博客文章中的JDK8收集器鏈設置:http://tomaszalusky.blogspot.cz/2017/02/playing-with-java-8-collectors.html –