`
yznxing
  • 浏览: 367197 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

【新手记录】Map中存放Object类型使用小记

    博客分类:
  • java
阅读更多

之前在使用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的操作都用字符串,一直没注意这个问题,很简单的一个问题,这里记录下。不过找到问题了我还还是很开心的,虽然耗费了一些时间。。。


            ^_^


 

0
0
分享到:
评论
9 楼 RednaxelaFX 2010-05-04  
night_stalker 写道
这里新东西很多啊,譬如各种轮子 ……

那是你运气好至少能从scratch开始各种山寨东西……现在觉得前段时间山寨东西的时候就算再折磨也比在老系统上改造要舒服多了 T T
8 楼 yznxing 2010-05-04  
RednaxelaFX 写道
night_stalker 写道
以前的东西不要碰可以理解,但做新东西的时候不用好工具就纯属偏见了。

感觉、习惯、经验 都是会欺骗人的。

你不觉得这部很少有机会能做“新”东西么……很多时候新需求也是在旧系统上改出来了,那就是个茶几啊 =_=|||



“新”东西,哎,我们现在就是在茶几上摆“杯具”,而且本身“杯具”就算了,
还担心会把以前放上去的“杯具”碰到,到时候直接就成 惨剧了。。。
7 楼 night_stalker 2010-05-04  
这里新东西很多啊,譬如各种轮子 ……
6 楼 RednaxelaFX 2010-05-04  
night_stalker 写道
以前的东西不要碰可以理解,但做新东西的时候不用好工具就纯属偏见了。

感觉、习惯、经验 都是会欺骗人的。

你不觉得这部很少有机会能做“新”东西么……很多时候新需求也是在旧系统上改出来了,那就是个茶几啊 =_=|||
5 楼 night_stalker 2010-05-04  
以前的东西不要碰可以理解,但做新东西的时候不用好工具就纯属偏见了。

感觉、习惯、经验 都是会欺骗人的。
4 楼 yznxing 2010-05-04  
RednaxelaFX 写道
其实真是奇怪……明明装一个东西就可以为自己省去很多麻烦让自己能更懒,咋这“惰性”不是倾向于让自己更舒服而是倾向于虐待自己呢……


因为习惯和“以前就是这样的,动就会出问题”,“经验”
这些东西,是很大的压力和阻力的。

当初从antx换到maven中间是有很多技术人员的努力和坚持推广的。。。
不然现在还是antx的天下。。。
3 楼 RednaxelaFX 2010-05-04  
其实真是奇怪……明明装一个东西就可以为自己省去很多麻烦让自己能更懒,咋这“惰性”不是倾向于让自己更舒服而是倾向于虐待自己呢……
2 楼 yznxing 2010-05-04  
lombok 这个东东,感觉还是侵入性有点大。。
额,需要给eclipse装个东东。

我当时用的时候还不知道,不好推吧估计。
再说现在大家貌似都比较惰性了。。。
推新阻力有点大,只能小范围搞搞,然后再推广!
1 楼 RednaxelaFX 2010-05-02  
呃嗯……所以我已经习惯了在写这种类的时候让Eclipse帮我生成出equals()和hashCode()
在用Lombok以前 =_=|||
可惜服务这边加Lombok的依赖貌似不太方便,所以没有推这玩儿……

相关推荐

Global site tag (gtag.js) - Google Analytics