之前在使用google Collections的MapMaker的时候,比较正式的写的时候,map中存放的Key是我自己写一个CacheKey的Object,但是在存放过后,再通过cache的get却总是找不到缓存记录,心里纳闷了很久为啥。
无奈之下,debug进去了get的源码,发现了。。。
这里就放HashMap的get代码,其它类型的map都差不多类似:
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
hash(key.hashCode());
这里会调用key的hash方法。
key.equals(k),这里就会调用key的equals方法了。
心里恍然大悟,我需要对我这个CacheKey的object重载下hash方法和equals方法,这样才会认为两个CacheKey是同一个。
于是改了相关代码,以下是相关的测试代码。
public class TestKey {
private String keyValue;
public String getKeyValue() {
return keyValue;
}
public void setKeyValue(String keyValue) {
this.keyValue = keyValue;
}
public TestKey(String keyValue) {
this.keyValue = keyValue;
}
/**
* 只有重载了hashCode和equals方法,
* 才能使得map中get会有预期的行为!
*/
public int hashCode() {
return this.keyValue.hashCode();
}
public boolean equals(Object o) {
TestKey testKeyTemp = (TestKey) o;
return testKeyTemp.getKeyValue().equals(this.keyValue);
}
}
public class TestHashMap {
/**
* @param args
*/
public static void main(String[] args) {
TestKey testKey = new TestKey("123");
TestKey testKey1 = new TestKey("123");
Map map = new HashMap();
map.put(testKey, "this is the value of testKey");
System.out.println(map.get(testKey1));
}
}
小结:以前一直对map的操作都用字符串,一直没注意这个问题,很简单的一个问题,这里记录下。不过找到问题了我还还是很开心的,虽然耗费了一些时间。。。
^_^
分享到:
相关推荐
这程序应用了MapObject,对Shp文件实现了添加,放大,缩小,鹰眼图,还有DragFeedback等功能。
Java代码Map转Object对象
mapobject使用手册
MapObject控件的使用.doc,讲Gis的东西
基于MapObject,地图浏览、空间查询、空间分析等GIS基本功能
mapobject的中文学习指南,比较经典的教程
mapobject二次开发mapobject二次开发mapobject二次开发
一般使用springjdbc、hibernate的sql查询,库获取到的数据都是List<Map, Object>>结果集,如果我们要转化为JavaBean,则需要做一系列的map.get(),然后obj.set()。 此工程中就是解决List<Map, Object>>转化为...
Map 转为Object Object 转为 Map java jdk1.4以上 应用java 反射机制实现 有工程,直接运行
MapObject二次开发教程 详细的阐述了MapObject的开发过程
c#+MapObject实例 c#+MapObject实例
Mapobject2.0 与VB结合所开发的例子。
Java中 List《map》把里面map中某个key相同记录的其他key 的 value 合并 Java中 List《map》把里面map中某个key相同记录的其他key 的 value 合并
gis二次开发mapobject开发教程
Map Object 安装文件 版本为2.3。
MapObject 2.4 ,很多人在找,就不用多说了。这是第二部分。
MapObject2.4 很多人在找,多余的就不说了。
MapObject2.3 的 vc代码 common 文件
在SpringBoot中怎么注入各种类型(String,List,Map,Object)配置?背景String类型配置注入List类型配置注入Map类型配置注入Object类型配置注入结语 背景 在开发过程中,绝大多数场景都是要使用一些配置项的。至于...
利用mapobject 开发的mo的点线编辑程序 希望使用mapobject的朋友们能用的着