先说点题外话。终于决定在osc落户,空闲的时候能够写写blog,把它当作一个梳理知识,记录知识和分享知识的媒介。但愿本身能够锲而不舍,一步步记录成长的足迹。 code
言归正传。前不久在写代码使用Map的时候,引入了一个bug,也是以前没有足够的认识和觉悟。不知道有多少人犯过和我同样的错误。那么考考你们: blog
Map<Byte,String> m = new HashMap<Byte,String>();
m.put((byte)1, "Monday");
String value = m.get(1);
System.out.println(value); get
最后的输出是多少? hash
=================================== bug
本来我天真的认为是 Monday。 但是实际输出是:null。 方法
缘由在于: 分享
在这段代码中,值"Monday"对应的key1是byte类型的1. 而get时用的key2是int类型的1。 co
虽然key1和key2的hashcode相同,可是二者并不equal。 错误
为何key1.equals(key2)是false呢?由于key1实质上是Byte类型, 而key2是Integer类型。 new
看一下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);