java HashMap用自定义类做key(二)
2014-07-15 15:40
344 查看
由于设计的需要,要自己编写一个类,作为HashMap中的Key。先简单测试一下,三下五除二,写了个类,没想到不行。才知道自己又想当然了。下面是我的程序:
class Index{
String ID="";
public Index(String ID){
this.ID=ID;
}
public String getID(){
return ID;
}
}
String str="123";
String str1=new String("123");
HashMap<Index,String> hm=new HashMap<Index,String>();
hm.put(new Index("123"), "lue");
hm.put(new Index("123"), "abcue");
hm.put(new Index(str), "alsfeue");
hm.put(new Index(str), "value");
hm.put(new Index(str1), "zzzzzzz");
System.out.println(hm.size());
System.out.println(hm.get(new Index("123")));
运行结果为:
5
null
结果让我很是失望。但原因其实很简单,就是这些Key的hashcode不同,因此不能把内容相同的key的value给覆盖掉。但如何解决呢?在网上找了一下,结果还真有这方面的内容,不过好像很少有人这么用。
原来是因为Index是继承Object的.使用Object的hashCode生成的散列码.它默认是使用对象的地址计算散列码的.因此.两次new的MyKey的散列码是不一样的.有人可能又问了,既然是用对象地址计算散列码,那么如果用String对象作为HashMap的Key,则不会出现这种情况,这是为什么呢?这是因为String类重载了hashCode函数。看来我也应该重新写我的类的hashCode函数了。
还有一个函数应该重载,就是equals函数,因为当比较两个类时,如果这个类中没有equals函数,则到它的上一级去找,而我的这个类是继承自Object类,则调用Object类的equals,结果是按照这两个对象的地址比较的,自然是不会相等的。
下面是修改后的类:
class Index{
String ID="";
public Index(String ID){
this.ID=ID;
}
public String getID(){
return ID;
}
public int hashCode(){
return ID.hashCode();
}
public boolean equals(Object index){
return (index instanceof Index) && (ID.equals(((Index)index).getID()));
}
}
String str="123";
String str1=new String("123");//使str1和str地址不同
HashMap<Index,String> hm=new HashMap<Index,String>();
hm.put(new Index("123"), "lue");
hm.put(new Index("123"), "abcue");
hm.put(new Index(str), "alsfeue");
hm.put(new Index(str), "value");
hm.put(new Index(str1), "zzzzzzz");
System.out.println(hm.size());
System.out.println(hm.get(new Index("123")));
运行结果为:
1
zzzzzzz
搞定!
这其中涉及到了一个操作符:instanceof。下面做简要介绍:
instanceof 运算符是在运行期间测试一个对象的类型,运算符左边是一个对象的实例,而右边是一个类或接口的名字。如果左边的对象实例是属于右边的类或其子类的实例,或者是实现了接口类的实例则返回true。
class Index{
String ID="";
public Index(String ID){
this.ID=ID;
}
public String getID(){
return ID;
}
}
String str="123";
String str1=new String("123");
HashMap<Index,String> hm=new HashMap<Index,String>();
hm.put(new Index("123"), "lue");
hm.put(new Index("123"), "abcue");
hm.put(new Index(str), "alsfeue");
hm.put(new Index(str), "value");
hm.put(new Index(str1), "zzzzzzz");
System.out.println(hm.size());
System.out.println(hm.get(new Index("123")));
运行结果为:
5
null
结果让我很是失望。但原因其实很简单,就是这些Key的hashcode不同,因此不能把内容相同的key的value给覆盖掉。但如何解决呢?在网上找了一下,结果还真有这方面的内容,不过好像很少有人这么用。
原来是因为Index是继承Object的.使用Object的hashCode生成的散列码.它默认是使用对象的地址计算散列码的.因此.两次new的MyKey的散列码是不一样的.有人可能又问了,既然是用对象地址计算散列码,那么如果用String对象作为HashMap的Key,则不会出现这种情况,这是为什么呢?这是因为String类重载了hashCode函数。看来我也应该重新写我的类的hashCode函数了。
还有一个函数应该重载,就是equals函数,因为当比较两个类时,如果这个类中没有equals函数,则到它的上一级去找,而我的这个类是继承自Object类,则调用Object类的equals,结果是按照这两个对象的地址比较的,自然是不会相等的。
下面是修改后的类:
class Index{
String ID="";
public Index(String ID){
this.ID=ID;
}
public String getID(){
return ID;
}
public int hashCode(){
return ID.hashCode();
}
public boolean equals(Object index){
return (index instanceof Index) && (ID.equals(((Index)index).getID()));
}
}
String str="123";
String str1=new String("123");//使str1和str地址不同
HashMap<Index,String> hm=new HashMap<Index,String>();
hm.put(new Index("123"), "lue");
hm.put(new Index("123"), "abcue");
hm.put(new Index(str), "alsfeue");
hm.put(new Index(str), "value");
hm.put(new Index(str1), "zzzzzzz");
System.out.println(hm.size());
System.out.println(hm.get(new Index("123")));
运行结果为:
1
zzzzzzz
搞定!
这其中涉及到了一个操作符:instanceof。下面做简要介绍:
instanceof 运算符是在运行期间测试一个对象的类型,运算符左边是一个对象的实例,而右边是一个类或接口的名字。如果左边的对象实例是属于右边的类或其子类的实例,或者是实现了接口类的实例则返回true。
相关文章推荐
- Java用自定义的类型作为HashMap的key
- Java用自定义的类作为HashMap的key值实例
- Java用自定义的类型作为HashMap的key
- Java 将自定义的对象作为HashMap的key
- Java中获取HashMap中所有的Key的值,获取所有的value的值
- Java 将自己定义的对象作为HashMap的key
- Hashtable and HashMap are two hash based collection in Java and used to store objects as key value p
- java对HashMap中的key或者value值进行排序!
- 使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals()。
- java对HashMap中的key或者value值进行排序
- Java Map遍历方式的选——TreeMap、HashMap的key、value遍历
- Java – Check if key exists in HashMap
- java 中如何遍历hashMap的key所对应的value?
- Java中hashmap按key值排序
- java用自定义类型作为HashMap的键
- java HashMap中出现重复的key, 求解释
- java中实现HashMap中的按照key的字典顺序排序输出
- java中实现HashMap中的按照key的字典顺序排序输出
- java HashMap用自定义类作为key