您的位置:首页 > 编程语言 > Java开发

Map的使用。你是否有落入过这样的陷阱?

2013-06-04 00:00 295 查看
先说点题外话。终于决定在osc落户,空闲的时候可以写写blog,把它当做一个梳理知识,记录知识和分享知识的媒介。希望自己可以持之以恒,一步步记录成长的足迹。

言归正传。前不久在写代码使用Map的时候,引入了一个bug,也是之前没有足够的认识和觉悟。不知道有多少人犯过和我一样的错误。那么考考大家:

Map<Byte,String> m = new HashMap<Byte,String>();
m.put((byte)1, "Monday");
String value = m.get(1);
System.out.println(value);

最后的输出是多少?

===================================

原本我天真的认为是 Monday。 可是实际输出是:null。

原因在于:

在这段代码中,值"Monday"对应的key1是byte类型的1. 而get时用的key2是int类型的1。

虽然key1和key2的hashcode相同,但是两者并不equal。

为什么key1.equals(key2)是false呢?因为key1实质上是Byte类型, 而key2是Integer类型。

看一下Byte类中equals方法的定义:

public boolean equals(Object obj) {
if (obj instanceof Byte)
return value == ((Byte) obj).byteValue();
else
return false;
}

可见如果类型不同,equals直接返回false。Integer类的equals方法也是类似。

===================================

结论:

要取得Map中的值"Monday",第三行代码需改为:

String value = m.get((byte)1);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java Map