Map的使用。你是否有落入過這樣的陷阱?

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

相關文章
相關標籤/搜索