都说开发五分钟,bug 两小时,今天还真的遇到了。
一般来说,map 作为一种 key-value 的存储结构,当然我采用 HashMap 方式实现。
今天遇到一个问题,明明去数据库中用一组 id 去拿数据,然后封装在 map 返回,但是根据对应的 key 去找,却又是没有数据。
于是 debug 去调试,发现还跳过了 map.get(id) 的数据,有点奇怪,于是重新打包,编译,打日志都没有数据出来。
我静下心看着 IDEA 给的不明显提示,这才焕然大悟,原来我封装的时候,key 是 String 类型。
而去 map 取数据的时候,是 Long 类型,难怪找不到,尽管值是一样。
先说说 HashMap,它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。
HashMap 最多只允许一条记录的键为 null,允许多条记录的值为 null。HashMap非线程安全,即任一时刻可以有多个线程同时写 HashMap,可能会导致数据的不一致。
如果需要满足线程安全,可以用 Collections 的 synchronizedMap方法使HashMap具有线程安全的能力,或者使用 ConcurrentHashMap。
之前封装是因为调用了 put 方法,但是不管增加、删除、查找键值对,定位到哈希桶数组的位置都是很关键的第一步。
所以最先调用 Hash 算法计算出 key 的 hash 值,这里要分 JDK 1.7 和 1.8 ,感兴趣的可以自己去找资料看。
因为类型不同,比如 Long 和 String 不同,哪怕值看起来一样,最终计算出来的 key 是不同的!!!
网友评论