存储在HashMap中的Java泛型对不能正确检索key-> value
发布时间:2020-12-15 02:07:04 所属栏目:Java 来源:网络整理
导读:这是Pair. java import java.lang.*; import java.util.*; public class PairTYPEA,TYPEB implements Comparable PairTYPEA,TYPEB { protected final TYPEA Key_; protected final TYPEB Value_; public Pair(TYPEA key,TYPEB value) { Key_ = key; Value_ =
这是Pair.
java
import java.lang.*; import java.util.*; public class Pair<TYPEA,TYPEB> implements Comparable< Pair<TYPEA,TYPEB> > { protected final TYPEA Key_; protected final TYPEB Value_; public Pair(TYPEA key,TYPEB value) { Key_ = key; Value_ = value; } public TYPEA getKey() { return Key_; } public TYPEB getValue() { return Value_; } public String toString() { System.out.println("in toString()"); StringBuffer buff = new StringBuffer(); buff.append("Key: "); buff.append(Key_); buff.append("tValue: "); buff.append(Value_); return(buff.toString() ); } public int compareTo( Pair<TYPEA,TYPEB> p1 ) { System.out.println("in compareTo()"); if ( null != p1 ) { if ( p1.equals(this) ) { return 0; } else if ( p1.hashCode() > this.hashCode() ) { return 1; } else if ( p1.hashCode() < this.hashCode() ) { return -1; } } return(-1); } public boolean equals( Pair<TYPEA,TYPEB> p1 ) { System.out.println("in equals()"); if ( null != p1 ) { if ( p1.Key_.equals( this.Key_ ) && p1.Value_.equals( this.Value_ ) ) { return(true); } } return(false); } public int hashCode() { int hashCode = Key_.hashCode() + (31 * Value_.hashCode()); System.out.println("in hashCode() [" + Integer.toString(hashCode) + "]"); return(hashCode); } } 这是测试用例: import java.lang.*; import java.util.*; import junit.framework.*; public class PairTest extends TestCase { public void testPair() { String key = new String("key"); String value = new String("asdf"); Pair<String,String> pair = new Pair<String,String>( key,value ); assertTrue( pair.getKey().equals( key ) ); assertTrue( pair.getValue().equals( value ) ); assertTrue( pair.equals( new Pair<String,String>(key,value)) ); } public void testPairCollection() { HashMap< Pair<String,String>,String> hm1 = new HashMap<Pair<String,String>(); Pair<String,String> p1 = new Pair<String,String>("Test1","Value1"); hm1.put(p1,"ONE"); Pair<String,String> p2 = new Pair<String,"Value2"); hm1.put(p2,"TWO"); Pair<String,String> p3 = new Pair<String,String>("Test2","Value1"); hm1.put(p3,"THREE"); Pair<String,String> p4 = new Pair<String,"Value2"); hm1.put(p4,"FOUR"); Pair<String,String> p5 = new Pair<String,String>("Test3","Value1"); hm1.put(p5,"FIVE"); Pair<String,String> p6 = new Pair<String,"Value2"); hm1.put(p6,"SIX"); Pair<String,String> p7 = new Pair<String,"Value3"); hm1.put(p7,"SEVEN"); assertTrue( hm1.size() == 7 ); Pair<String,String> pSrch = new Pair<String,"Value3"); assertTrue( p7.equals(pSrch) ); assertTrue( pSrch.equals(p7) ); assertTrue( p7.hashCode() == pSrch.hashCode() ); assertTrue( 0 == p7.compareTo( pSrch ) ); assertTrue( 0 == pSrch.compareTo(p7) ); System.out.println("starting containsKey search"); assertTrue( hm1.containsKey( p7 ) ); System.out.println("starting containsKey search2"); assertTrue( hm1.containsKey( pSrch ) ); System.out.println("finishing containsKey search"); String result = hm1.get( pSrch ); assertTrue( null != result ); assertTrue( 0 == result.compareTo("SEVEN")); } } 这是我的问题,最后一个hm1.containsKey调用应该(我天真地期望)返回存储在其中的值<“Three”,“Three”>是的 – 我应该得到一个值为“SEVEN”的字符串.这是输出: Running in equals() in hashCode() [1976956095] in hashCode() [1976956126] in hashCode() [1976956096] in hashCode() [1976956127] in hashCode() [1976956097] in hashCode() [1976956128] in hashCode() [1976956159] in equals() in equals() in hashCode() [1976956159] in hashCode() [1976956159] in compareTo() in equals() in compareTo() in equals() starting containsKey search in hashCode() [1976956159] starting containsKey search2 in hashCode() [1976956159] <--- Bug here? Never reaches String result = hm1.get( pSrch ); 那么p7.hashCode()和pSrch.hashCode()是相等的,p7.equals(pSrch)和pSrch.equals(p7),以及hm1.containsValue(p7)== true,我希望hm1.containsValue(pSrch) )也会返回true,但事实并非如此.我错过了什么? 解决方法
您需要从java.lang.Object类重写equals方法.
相反,您已经使用带有对的附加版本重载了该方法.永远不会被称为完全不同的方法.用这样的东西代替你的平等: @Override public boolean equals(Object o) { System.out.println("in equals()"); if (o instanceof Pair) { Pair<?,?> p1 = (Pair<?,?>) o; if ( p1.Key_.equals( this.Key_ ) && p1.Value_.equals( this.Value_ ) ) { return(true); } } return(false); } 要避免这种错误,请对要作为覆盖的方法使用@Override注释.如果没有,您将收到编译时错误. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |