HashMap이이 예제에서와 같이 작동하는 이유를 설명 할 수 있습니까?
해시 맵에서 키를 확인하는 간단한 테스트입니다. 한 번은 생성자에, 한 번은 ListDataListener intervallAdded 메서드에 있습니다.Java HashMap이 ListDataListener 이벤트에서 키를 찾을 수 없습니다.
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) {
}
}
}
왜 해시 맵은 이벤트에서 false를 반환하지만 containsKey를 사용할 때 생성자에서 true를 반환합니까? 일부 Java 제네릭 "마법"이 있습니까? 여기에 대해서는 모르겠습니까?
편집 :
그냥 ArrayList를의 (ArrayListModel의 연장) hashCode 메소드는 모든 요소에서의 해시 코드를 조립 것을 발견했다. 즉, 목록의 항목에 따라 hashCode가 변경됩니다. HashMap에 ArrayList를 저장하는 것은 좋은 생각이 아닙니다.어떻게 해결할 수 있습니까? 컬렉션을 홀더/컨테이너 객체에 대신 저장 하시겠습니까?
'com.jgoodies.common.collect.ArrayListModel'에 대해 hashCode() 메소드 구현을 제공하십시오. –
소스는 http://www.jgoodies.com/downloads/libraries.html에서 찾을 수 있습니다. ArrayListModel은 ArrayList를 확장하며 hashCode를 재정의하지 않으므로 ArrayList의 hashCode가 사용 된 것입니다. 하지만 그게 어떻게 관련이 있는지 알 수는 없지만 containsKey에 대한 첫 번째 호출은 true를 반환합니다. – Marcus