java map object key_java Map使用Object 做为Key的问题

标签:style   blog   class   code   java   ext   javascript   color   get   int   string

近期在看dnsjava 源码的时候,不经意间发现一个自己没有想过的问题:

HashMap 如何使用key去查找对应的value的,这个问题很难用语言描述的清楚,那就使用代码来进行说明吧!

104cb86071a55d2bcd51172322a9c667.gif

public classtest {

public static voidmain(String[] args) {

a aa= newa();

b bb= newb();

Mapc = new HashMap();

c.put(aa, bb);

a cc= newa();

c.get(cc);

System.out.println(bb);

System.out.println(c.get(aa));

System.out.println(c.get(cc));

}

}classa {

}classb {

}

104cb86071a55d2bcd51172322a9c667.gif

运行结果为:

test.java.hashmap.b@10b30a7

test.java.hashmap.b@10b30a7

null

为什么使用aa能获取到value 而 cc就不行呢?aa 和

cc是同一个类的实例啊,如果这样的话HashMap还怎么根据对象来查找value呢?为什么以前使用String就可以查找value呢?带着一连串的疑问我们继续来寻找答案

首先我们来测试下使用String做为Key 看是否真的可以取出对应的value

104cb86071a55d2bcd51172322a9c667.gif

public classtest {public static voidmain(String[] args) {

Mapc = new HashMap();

String aa= new String("abc");

b bb= newb();

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));

}

}classb {

}

104cb86071a55d2bcd51172322a9c667.gif

运行结果为:

test.java.hashmap.b@61de33

test.java.hashmap.b@61de33

test.java.hashmap.b@61de33

使用String的时候运行正常,下面咱们就去看看HashMap的源码来一探究竟,下面是HashMap get方法的源码

104cb86071a55d2bcd51172322a9c667.gif

publicV get(Object key) {if (key == null)returngetForNullKey();int hash =hash(key.hashCode());for (Entrye =table[indexFor(hash, table.length)];

e!= null;

e=e.next) {

Object k;if (e.hash == hash && ((k = e.key) == key ||key.equals(k)))returne.value;

}return null;

}

104cb86071a55d2bcd51172322a9c667.gif

从源码中可以看出,主要根据两个方法来判断Key是否相同:hashCode 和 equals ,这两个方法都是在Object中定义的,具体的作用请看http://blog.csdn.net/fenglibing/article/details/8905007。

根据上面的分析,要想使用自定义的对象作为key 必须要重写从Object中继承过来的hashCode 和 equals。String

中已经对两个方法进行了重新实现,各位可查看String相关源码。

104cb86071a55d2bcd51172322a9c667.gif

public classtest {public static voidmain(String[] args) {

a aa= newa();

b bb= newb();

Mapc = new HashMap();

c.put(aa, bb);

a cc= newa();

c.get(cc);

System.out.println(bb);

System.out.println(c.get(aa));

System.out.println(c.get(cc));

}

}classa {public inthashCode() {return 1;

}public booleanequals(Object obj) {return true;

}

}classb {

}

104cb86071a55d2bcd51172322a9c667.gif

运行结果为:

test.java.hashmap.b@14318bb

test.java.hashmap.b@14318bb

test.java.hashmap.b@14318bb

java Map使用Object 做为Key的问题,搜素材,soscw.com

java Map使用Object 做为Key的问题

标签:style   blog   class   code   java   ext   javascript   color   get   int   string

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值