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

相关文章
相关标签/搜索