java Map使用Object 做为Key的问题
近期在看dnsjava 源码的时候,不经意间发现一个自己没有想过的问题:
HashMap 如何使用key去查找对应的value的,这个问题很难用语言描述的清楚,那就使用代码来进行说明吧!
public class test {
public static void main(String[] args) {
a aa = new a();
b bb = new b();
Map<Object,Object> c = new HashMap<Object,Object>();
c.put(aa, bb);
a cc = new a();
c.get(cc);
System.out.println(bb);
System.out.println(c.get(aa));
System.out.println(c.get(cc));
}
}
class a {
}
class b {
}
运行结果为:
test.java.hashmap.b@10b30a7
test.java.hashmap.b@10b30a7
null
为什么使用aa能获取到value 而 cc就不行呢?aa 和 cc是同一个类的实例啊,如果这样的话HashMap还怎么根据对象来查找value呢?为什么以前使用String就可以查找value呢?带着一连串的疑问我们继续来寻找答案
首先我们来测试下使用String做为Key 看是否真的可以取出对应的value
public class test {
public static void main(String[] args) {
Map<Object,Object> c = new HashMap<Object,Object>();
String aa = new String("abc");
b bb = new b();
c.put(aa, bb);
String cc = new String("abc");
System.out.println(bb);
System.out.println(c.get(aa));
System.out.println(c.get(cc));
}
}
class b {
}
运行结果为:
test.java.hashmap.b@61de33
test.java.hashmap.b@61de33
test.java.hashmap.b@61de33
使用String的时候运行正常,下面咱们就去看看HashMap的源码来一探究竟,下面是HashMap get方法的源码
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
从源码中可以看出,主要根据两个方法来判断Key是否相同:hashCode 和 equals ,这两个方法都是在Object中定义的,具体的作用请看http://blog.csdn.net/fenglibing/article/details/8905007。
根据上面的分析,要想使用自定义的对象作为key 必须要重写从Object中继承过来的hashCode 和 equals。String 中已经对两个方法进行了重新实现,各位可查看String相关源码。
public class test {
public static void main(String[] args) {
a aa = new a();
b bb = new b();
Map<Object,Object> c = new HashMap<Object,Object>();
c.put(aa, bb);
a cc = new a();
c.get(cc);
System.out.println(bb);
System.out.println(c.get(aa));
System.out.println(c.get(cc));
}
}
class a {
public int hashCode() {
return 1;
}
public boolean equals(Object obj) {
return true;
}
}
class b {
}
运行结果为:
test.java.hashmap.b@14318bb
test.java.hashmap.b@14318bb
test.java.hashmap.b@14318bb
java Map使用Object 做为Key的问题的更多相关文章
- 迭代输出Map和List<Map<String,Object>>的方法
一.Map<String,Object> String:key的类型 Object:value的类型,value可能是String,或者int类型,什么类型都可以 对于Map接口来说,本身 ...
- 根据map中的某一key进行排序(快速排序实现)
/** * @author Gaoxl * 根据key值排序,要求key值能够转为Long类型(快速排序) * @param maps * @param key * @return */ public ...
- JAVA中对List<map<String,Object>>根据map某个key值进行排序
方法compareTo()比较此对象与指定对象的顺序.如果该对象小于.等于或大于指定对象,则分别返回负整数.零或正整数.返回整数,1,-1,0:返回1表示大于,返回-1表示小于,返回0表示相等. 普通 ...
- java map遍历、排序,根据value获取key
Map 四种遍历: Map<String,String> map = new HashMap<String, String>(); map.put("one" ...
- List<Map<String,Object>>使用Java代码遍历
List<Map<String,Object>>的结果集怎么使用Java代码遍历以获取String,Object的值: package excel; import java.u ...
- java中对List<Map<String,Object>>中的中文汉字排序
import java.text.Collator;import java.util.ArrayList;import java.util.Collections;import java.util.C ...
- java实现map和object互转的三种方法
/** * 使用org.apache.commons.beanutils进行转换 */ class A { public static Object mapToObje ...
- Java中Map和Object的互相转换方式
一.使用Apache中的BeanUtils类,导入commons-beanutils包. Jar包Maven下载地址:https://mvnrepository.com/artifact/common ...
- List<Map<String, Object>>集合中获取某个key并转换为List<Integer>集合
package com.codyy.sso.controller.yuanqu; import java.util.ArrayList; import java.util.HashMap; impor ...
随机推荐
- UIKIT网页基本结构学习
没办法,哈哈,以后一段时间,如果公司没有招到合适的运维研发, 啥啥都要我一个人先顶上了~~~:) 也好,可以让人成长. UIKIT,BOOTSTRAP之类的前端,搞一个是有好处的,我们以前即然是用了U ...
- 6,render的一些概念和可用库
一,概念解释 什么是渲染?这是高大上的说法,翻译成正常语言,就是把图像缓冲区的数据显示到屏幕的过程,就是渲染. 原理说白了很简单,但实际操作中有太多因素需要考量. OS/硬件提供的加速机制/解码后图像 ...
- SectionIndexer中的getSectionForPosition()与getPositionForSection()
大家在做字母索引的时候常常会用到SectionIndexer这个类,里面有2个重要的方法 1. getSectionForPosition()通过该项的位置,获得所在分类组的索引号 2. getP ...
- 方便的Chrome取色插件ColorPick Eyedropper [设计, FE必备]
最近在和Design合作开发, 她发过来的原型图有各种各样色配色, 不想让她一个一个地标记颜色, 嫌效率低. 于是自己找到一款方便的Chrome取色插件, 叫做ColorPick Eyedropper ...
- dom4j中 selectSingleNode 或selectNodes获取不到节点的原因总结 (转)
没想到搞个dom4j会出这么多怪错.. 最近在研究XBRL GL的有关内容,在项目中要求吧XBRL GL导入到11179注册库中,根据11179建立数据库,然后从XBRL GL分类标准中导入数据到数据 ...
- BZOJ_1202_狡猾的商人_(并查集)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1202 n 个月的账单,共 m 组数据,每一组数据包括 x , y , t ,表示从 x 月到 ...
- [C#]网络编程系列专题二:HTTP协议详解
转自:http://www.cnblogs.com/zhili/archive/2012/08/18/2634475.html 我们在用Asp.net技术开发Web应用程序后,当用户在浏览器输入一个网 ...
- linux中替换目录下的某个文件中包含的IP地址
#!/bin/bash #set -x oldIP=172.17.39.135 newIP=172.17.98.115 homefile=/usr/local/ims/ filelist=`grep ...
- 1002: Prime Path
题目链接:http://172.16.200.33/JudgeOnline/problem.php?id=1002 题意:给你两个四位数的素数,求最少经过多少步的变化能够从一个素数变到另一个素数.在变 ...
- ReentrantLock Condition 实现消费者生产者问题
import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.ExecutorService; im ...