我有个类要自己实现,并放到hashMap中当key值用,
如果hashMap中以有该key值,则对应的对象不put到hashMap中,
请问怎么写啊!
package iss.com.equals;import java.util.Date;class CountIsable { private Date date; private String accountNo; private String bankCode;
public CountIsable(Date transactionTime, String accountNo, String bankCode) {
this.date = transactionTime;
this.accountNo = accountNo;
this.bankCode = bankCode;
} public CountIsable(String accountNo, String bankCode) {
this.accountNo = accountNo;
this.bankCode = bankCode;
} public boolean equals(CountIsable mapKey) {
if (DateUtil.compareDate(date, mapKey.getDate()) == 0
&& accountNo.equals(mapKey.getAccountNo())) {
if (mapKey.getBankCode() == null
|| mapKey.getBankCode().equals(bankCode))
return true;
}
return false;
}
public int hashCode() {
        return 1;
    } public String getAccountNo() {
return accountNo;
} public String getBankCode() {
return bankCode;
} public Date getDate() {
return date;
}}下面是测试用例
package iss.com.equals;import java.util.Date;
import java.util.HashMap;public class TestEquals { public static void main(String[] args)
{
HashMap importMap=new HashMap(8);
Date date=new Date();
String accountNo="1";
String bankCode="1";
CountIsable one=new CountIsable(date,accountNo,bankCode);
CountIsable two=new CountIsable(date,accountNo,bankCode);
CountIsable three=new CountIsable(date,accountNo,bankCode);
CountIsable four=new CountIsable(date,accountNo,bankCode);
importMap.put(one,"1");
importMap.put(two,"2");
importMap.put(three,"3");
if(importMap.containsKey(four))
{

System.out.println(importMap.size());
System.out.println("--------------"+(String)importMap.get(one));
}
else
{
System.out.println("no object!");
}

}
}
程序输出为no object!,是什么原因导致key找不到

解决方案 »

  1.   

    就是自己定义个对象覆盖了equals(),hashCode()方法,这个对象做hashMap中key值用,
    那么同过key值怎么找hasnMap中的对象呢,也就是怎么复写hashCode()方法
    如下这段话:
    这点必须切忌,不然在你和hash-based集合打交道的时候,错误就会出现了。关键问题在于一定要满足相等的对象必须要有相等的hashCode。如果你在PhoneNumber类中覆盖了equals方法,但是没有覆盖hashCode方法,那么当你做如下操作的时候就会出现问题了。
    Map m = new HashMap();
    m.put(new PhoneNumber(408,863,3334),”ming”)
    当你调用m.get(new PhoneNumber(408,863,3334))的时候你希望得到ming但是你却得到了null,为什么呢因为在整个过程中有两个PhoneNumber的实例,一个是put一个是get,但是他们两个逻辑相等的实例却得到不同的hashCode那么怎么可以取得以前存入的ming呢。 
      

  2.   

    import java.util.Date;import java.util.Date;
    import java.util.HashMap;
    class CountIsable { private Date date; private String accountNo; private String bankCode;
    public CountIsable(Date transactionTime, String accountNo, String bankCode) {
    this.date = transactionTime;
    this.accountNo = accountNo;
    this.bankCode = bankCode;
    } public CountIsable(String accountNo, String bankCode) {
    this.accountNo = accountNo;
    this.bankCode = bankCode;
    } public boolean equals(Object omapKey) {
    CountIsable mapKey=(CountIsable)omapKey;
    return date.equals(mapKey.getDate())&&accountNo.equals(mapKey.getAccountNo())&&bankCode.equals(mapKey.getBankCode());

    }
    public int hashCode() {
            return 1;
        } public String getAccountNo() {
    return accountNo;
    } public String getBankCode() {
    return bankCode;
    } public Date getDate() {
    return date;
    }}public class TestEquals { public static void main(String[] args)
    {
    HashMap importMap=new HashMap();
    Date date=new Date();
    String accountNo="1";
    String bankCode="1";
    CountIsable one=new CountIsable(date,accountNo,bankCode);
    CountIsable two=new CountIsable(date,accountNo,bankCode);
    CountIsable three=new CountIsable(date,accountNo,bankCode);
    CountIsable four=new CountIsable(date,accountNo,bankCode);
    importMap.put(one,"1");
    importMap.put(two,"2");
    importMap.put(three,"3");
    if(importMap.containsKey(four))
    {

    System.out.println(importMap.size());
    System.out.println("--------------"+(String)importMap.get(one));
    }
    else
    {
    System.out.println("no object!");
    }

    }
    }
      

  3.   

    搂住,
    你写的那个equals函数并没有override超类的相应的equals函数,因为超类的这个函数的参数是
    Object而你写的那个是CountIsable。
    另外,你写的那个hashCode函数没有什么作用,虽然这样也可以运行,但是这是这个哈希表已经退化成了一个线性链表了
      

  4.   

    我记得《Effective Java》里有一个hashCode()的简单实现,你可以去看看,具体我也没有做过
      

  5.   

    看一下 String.hashCode() 怎么写的.
    再看一下 jakarta.apache.org  commons-collections-3.1 / MultiKeyMap.