加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

存储在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注释.如果没有,您将收到编译时错误.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读