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 {
}

运行结果为:

[email protected]

[email protected]
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 {

}

运行结果为:

[email protected]
[email protected]
[email protected]

使用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 {
}

运行结果为:

[email protected]
[email protected]
[email protected]

java Map使用Object 做为Key的问题,码迷,mamicode.com

时间: 2024-08-27 14:46:35

java Map使用Object 做为Key的问题的相关文章

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

/** * @author Gaoxl * 根据key值排序,要求key值能够转为Long类型(快速排序) * @param maps * @param key * @return */ public static void sort(Map<String,Object>[] maps,String key,int start,int end){ if(start < end){ int mid = divide(maps,key,start,end); sort(maps,key,st

Java Map 如何实现Key 的唯一性?

大家都知道,在Map和Set不可存在重复元素? 但是对于内部的细节我们并不了解,今天我们就一块来 探讨一下! 1 对于 HashMap  HashSet 他们的底层数据结构的实现是:维护了一张  HashTable .容器中的元素全部存储在Hashtable 中.他们再添加元素的时候,是如何判断是否存在有重复元素的呢?  每一个被添加的元素都有一个 hashCode(哈希值),他们先比较哈希值,是否相同? 不相同的元素,添加进入 HashTable.   如果hashCode相同的话, 再去比较

java.io.IOException: Type mismatch in key from map:解决方法

执行MR程序的时候发生异常:java.lang.Exception: java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, received org.apache.hadoop.io.LongWritable 日志如下: 2016-05-09 21:33:28,871 INFO [org.apache.hadoop.conf.Configuration.deprecation

利用java反射机制实现List&lt;Map&lt;String, Object&gt;&gt;转化为List&lt;JavaBean&gt;

最近在用mybatis做项目,遇到将date格式化显示到easyui的问题,需要将List<Map<String, Object>>转化为List<JavaBean>,研究好久,终于在网上找到了一个方法: 核心方法如下: [java] view plain copy /** * 根据List<Map<String, Object>>数据转换为JavaBean数据 * @param datas * @param beanClass * @retur

Java Map获取key和value 以及String字符串转List方法

一.问题描述 这里描述两个问题: 1.Java Map获取key和value的方法: 2.String字符串转List的方法: 二.解决方法 1.Java Map获取key和value的方法   2.String字符串转List的方法  

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

/** * 使用org.apache.commons.beanutils进行转换 */ class A { public static Object mapToObject(Map<string object=""> map, Class<?> beanClass) throws Exception { if (map == null) return null; Object obj = beanClass.newInstance(); org.apache.c

Java Map中key用可变对象会是什么后果?

结论:put之后key变化了在get就get为null了 Scala代码 val map = new mutable.HashMap[java.util.List[String], String]() val key = new util.ArrayList[String]() map.put(key, "value") println(map) println(map.get(key).getOrElse("null")) key.add("11&quo

【Java必修课】通过Value获取Map中的键值Key的四种方法

1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value值,求Key值. 本文将用实例介绍四种方法,通过传入Value值,获取得到Key值. 2 四种方法 2.1 循环法 循环法就是通过遍历Map里的Entry,一个个比较,把符合条件的找出来.会有三种情况: (1)找到一个值 (2)找到多个值 (3)找不到 具体代码如下: @Test public void lo

Java Map hashCode深究

[Java心得总结七]Java容器下——Map 在自己总结的这篇文章中有提到hashCode,但是没有细究,今天细究整理一下hashCode相关问题 1.hashCode与equals 首先我们都知道hashCode()和equals()函数是java基类Object的一部分,我查阅了java7文档,其中对于两者的描述如下: 解读这里对hashCode的描述,不难发现: 首先hashCode必须是一个整数,即Integer类型的 其次满足一致性,即在程序的同一次执行无论调用该函数多少次都返回相同