我有个类要自己实现,并放到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找不到
如果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找不到
那么同过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呢。
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!");
}
}
}
你写的那个equals函数并没有override超类的相应的equals函数,因为超类的这个函数的参数是
Object而你写的那个是CountIsable。
另外,你写的那个hashCode函数没有什么作用,虽然这样也可以运行,但是这是这个哈希表已经退化成了一个线性链表了
再看一下 jakarta.apache.org commons-collections-3.1 / MultiKeyMap.