您的位置:首页 > 其它

Map中使用数组作为key的用法

2013-04-22 22:58 2071 查看
这个是今天我的个人经历,作为经验教训,鄙视自己一下。

先说下问题,在网上查了下,我用的是ConCurrentMap接口来作为引用,创建的ConCurrentHashMap做键值对的处理,这个不是主要的,主要的是Map中使用的数组Key。

通过一下一段代码来说明一下我的问题所在吧:

package com.test;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

public class TestMap {

/**
* @param args
*/
public static void main(String[] args) {
ConcurrentMap<String[], String> map = new ConcurrentHashMap<String[], String>();
String[] str1 = {"1", "001"};
String[] str2 = {"2", "002"};

map.put(str1, "1001");
map.put(str2, "2002");

String[] str3 = {"1", "001"};

System.out.println(map.get(str3));
}

}

以Map为说明,我在map中put了两个值,泛型中分别是以String数组为key,String为value。

分别是以str1和str2作为引用,然后我在get的时候,想通过同样的key数组来调用str1的值,但是始终是null。

基础不扎实的我搞这个竟然搞了一天,真是惭愧。

最终经人提醒,才发现了Map在进行put的时候,如果key作为以数组或其他非字符串为键的时候,

java内部是视为其Object类型的,因此put到内存中的时候,它存在于一个具体的地址。

用debug来调试的话,显示为如下内容:

{[Ljava.lang.String;@1006d75=1001, [Ljava.lang.String;@1125127=2002}
因此当指定一个相同的字符串数组的时候,也不会找到上述对应的value,因为你给予的str3,在内存中的地址根本就是不存在的。

具体解决的办法,可以通过map的keySet方法,并获得你的iterator方法,在遍历循环中找到你的信息,即你传递的两个数组来判断匹配是否等于之前put进去的值,最终来取到这个值。

不知道本人有没有叙述明白,如有问题,请高手看到给你纠正,谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐