4

在我的代码中,我想要一个

HashBiMap<T1, HashSet<T2>> bimap;

可以改变 bimap 中的值吗?当我使用时,它不会导致与包含可变键的 HashMapbimap.inverse()相同的相关问题吗?hashCode()

4

1 回答 1

7

你最终会遇到与在基于散列的映射中用作键的对象进行变异时通常遇到的完全相同的问题,这很容易证明:

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

所以不,这样做是不安全的。理想情况下,您应该使用不可变类型作为完全防止这种情况发生的关键,而不是依赖于在对相关对象进行变异时小心谨慎。

于 2013-08-24T16:48:45.187 回答