近期在看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的问题的更多相关文章

  1. 迭代输出Map和List<Map<String,Object>>的方法

    一.Map<String,Object> String:key的类型 Object:value的类型,value可能是String,或者int类型,什么类型都可以 对于Map接口来说,本身 ...

  2. 根据map中的某一key进行排序(快速排序实现)

    /** * @author Gaoxl * 根据key值排序,要求key值能够转为Long类型(快速排序) * @param maps * @param key * @return */ public ...

  3. JAVA中对List<map<String,Object>>根据map某个key值进行排序

    方法compareTo()比较此对象与指定对象的顺序.如果该对象小于.等于或大于指定对象,则分别返回负整数.零或正整数.返回整数,1,-1,0:返回1表示大于,返回-1表示小于,返回0表示相等. 普通 ...

  4. java map遍历、排序,根据value获取key

    Map 四种遍历: Map<String,String> map = new HashMap<String, String>(); map.put("one" ...

  5. List<Map<String,Object>>使用Java代码遍历

    List<Map<String,Object>>的结果集怎么使用Java代码遍历以获取String,Object的值: package excel; import java.u ...

  6. java中对List<Map<String,Object>>中的中文汉字排序

    import java.text.Collator;import java.util.ArrayList;import java.util.Collections;import java.util.C ...

  7. java实现map和object互转的三种方法

    /**  * 使用org.apache.commons.beanutils进行转换  */  class A {              public static Object mapToObje ...

  8. Java中Map和Object的互相转换方式

    一.使用Apache中的BeanUtils类,导入commons-beanutils包. Jar包Maven下载地址:https://mvnrepository.com/artifact/common ...

  9. List<Map<String, Object>>集合中获取某个key并转换为List<Integer>集合

    package com.codyy.sso.controller.yuanqu; import java.util.ArrayList; import java.util.HashMap; impor ...

随机推荐

  1. real-time application

    http://www.hanselman.com/blog/InstallingAndRunningNodejsApplicationsWithinIISOnWindowsAreYouMad.aspx ...

  2. 如何解决C#编译中"csc不是内部或外部命令"的问题

    安装完 VisualStudio 2010编译环境后,是不能用命令行直接编译写好的csc文件的,如果不配置环境变量,在命令提示符(cmd)中编译扩展名为cs的文件,会出现错误提示“csc不是内部或外部 ...

  3. [LeetCode] 315. Count of Smaller Numbers After Self (Hard)

    315. Count of Smaller Numbers After Self class Solution { public: vector<int> countSmaller(vec ...

  4. Leetcode解题思想总结篇:双指针

    Leetcode解题思想总结篇:双指针 1概念 双指针:快慢指针. 快指针在每一步走的步长要比慢指针一步走的步长要多.快指针通常的步速是慢指针的2倍. 在循环中的指针移动通常为: faster = f ...

  5. 【CF】223 Div.1 C Sereja and Brackets

    水线段树. /* 380C */ #include <iostream> #include <string> #include <map> #include < ...

  6. NET Framework GAC目录构造

    转:http://www.yl1001.com/userzone.htm?doaction=article&art_id=5851381388387201 我们一般都知道,.NET Frame ...

  7. JavaScript向表格中添加按钮和文本输入框

    例子: <?php ?> <html> <head> <meta http-equiv="Content-Type" content=&q ...

  8. HTML5 Canvas核心技术—图形、动画与游戏开发.pdf4

    CanvasRenderingContext2D对象中用于平移.旋转坐标系的方法 镜像 scale(1,-1)绘制垂直镜像:scale(-1,1)绘制水平镜像 自定义的坐标变换 transform() ...

  9. JavaScript高级程序设计47.pdf

    触摸设备 iOS和Android设备的实现非常特别,因为这些设备没有鼠标,在面向iPhone和iPod中的Safari开发时,要记住以下几点 不支持dblclick事件,双击浏览器窗口会放大画面,没有 ...

  10. Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题

    4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 177  Solved: 128[Submit][Status ...