Java 谷歌ArrayListMultimap

Java 谷歌ArrayListMultimap,java,guava,Java,Guava,我正在迭代ArrayListMultimap的元素,如下所示: for(MyKey key : multimap.keySet()) { List<MyValue> values = multimap.get(key); // multimap.containsKey(key) returns false for(MyValue val : values) { // sometimes the list is empty } } fo

我正在迭代
ArrayListMultimap
的元素,如下所示:

for(MyKey key : multimap.keySet()) {
    List<MyValue> values = multimap.get(key);
    // multimap.containsKey(key) returns false
    for(MyValue val : values) {
        // sometimes the list is empty
    }
}
for(MyKey:multimap.keySet()){
列表值=multimap.get(键);
//multimap.containsKey(键)返回false
用于(MyValue val:值){
//有时列表是空的
}
}
但是当尝试检索一个键的值时,我得到一个空列表。另外
multimap.containsKey(key)
返回false。 当我尝试使用
entries()
进行迭代时,会找到键和值

我正在使用
guava-14.0.1.jar
,但我尝试了旧版本,得到了相同的行为。 此外,有时会有空值作为值,我已经为MyKey和MyValue重写了equals和hash方法


你知道这是什么原因吗?我确信这不是
ArrayListMultimap
实现。

是否
MyKey
实际上是不可变的


如果在
Multimap
(或
HashMap
)中使用密钥后对其进行了更改,并且更改会影响
hashCode()
equals()
,您将无法再找到关联的值:修改后的hashcode意味着在存储值的bucket中不会进行查找。

我不确定您是否重写了equals和hashcode方法。你做到了吗?是的,我已经重写了equals和hashCode方法,并且对它们进行了一些测试,我没有发现任何问题。我也尝试过使用'default'equals和hashCode方法,但问题仍然存在。我们可以看看
hashCode
equals
的实现吗?仅供参考,如果您只想迭代多重映射中的所有值,使用
multimap.values()
比这样的嵌套循环更可取。但是我怀疑您的
equals
方法在某种程度上违反了对象始终等于自身的要求。
MyKey
实际上是不可变的吗?如果在
Multimap
(或
HashMap
)中使用密钥后对其进行更改,并且更改会影响
hashCode()
equals()
,则您将无法再找到关联的值。