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);
言归正传。前不久在写代码使用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);
相关文章推荐
- 严重不安全:STL map 使用map[key]==0判断key是否存在于map中
- map容器使用中的陷阱【经验】
- map使用时的一个小陷阱
- 优雅编程之这样使用Map,你就“正常”了(三十六)
- STL容器 list、vector、map、set 使用的陷阱
- Gson使用心得(二):Map反序列化的一个陷阱
- (转)Linux共享内存使用常见陷阱与分析(3)-ftok是否一定会产生唯一的key值
- STL中map使用陷阱
- vfio 通过VFIO_IOMMU_MAP_DMA 得到iommu映射后的地址。这样就等于user space直接使用iommu接口
- 图书馆借阅是否借阅小案例(groovy中list和map的使用)
- vector和map迭代中erase的使用陷阱
- 这样使用AOP是否合理
- [ACM] POJ 3096 Surprising Strings (map使用)
- Android位置服务--BaiduMap的使用(1)
- 使用栈判断输入的表达式中括号是否配对
- C++ sizeof 使用规则及陷阱分析
- HDU 1082 Matrix Chain Multiplication(栈和map的使用)
- 使用K-S检验一个数列是否服从正态分布、两个数列是否服从相同的分布
- 使用BeanMapper把map和bean之间的转换,list<bean>和list<map>之间的转换(含测试)
- linux下使用hash_map及STL总结