Может кто-нибудь объяснить, почему HashMap действует так, как в этом примере:
Простой тест, который проверяет хеш-карту на ключ.Один раз в конструкторе и один раз в методе ListDataListener intervallAdded.
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import com.jgoodies.common.collect.ArrayListModel;
public class Test1 {
private final Listener listener = new Listener();
private final Map<List<?>, Object> parentByCollection = new HashMap<List<?>, Object>();
public Test1(){
ArrayListModel<Object> list = new ArrayListModel<Object>();
list.addListDataListener(listener);
parentByCollection.put(list, new Integer(10));
// Test containsKey locally
System.out.println("Item exists (locally):" + parentByCollection.containsKey(list));
// Test containsKey via ListDataListener
list.add(new Integer(20));
}
/**
* @param args
*/
public static void main(String[] args) {
new Test1();
}
public class Listener implements ListDataListener{
@Override
public void intervalAdded(ListDataEvent e) {
List<?> itemSource = (List<?>)e.getSource();
System.out.println("Item exists (listener):" + parentByCollection.containsKey(itemSource));
}
@Override
public void intervalRemoved(ListDataEvent e) {
}
@Override
public void contentsChanged(ListDataEvent e) {
}
}
}
Почему hashmap возвращает false из события, но true из конструктора при использовании containsKey?Есть ли какая-нибудь "магия" java-generics, о которой я не знаю?
Редактировать:
Только что обнаружили, что метод hashCode ArrayList (который расширяет ArrayListModel) собирает свой хеш-код из всех своих элементов.Это означает, что hashCode изменяется с элементами в списке.Поэтому хранить ArrayList в HashMap не очень хорошая идея.
Как я могу решить эту проблему?Вместо этого сохраните коллекции в объекте-держателе / контейнере?