先說點題外話。終於決定在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);