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进去的值,最终来取到这个值。
不知道本人有没有叙述明白,如有问题,请高手看到给你纠正,谢谢。
先说下问题,在网上查了下,我用的是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进去的值,最终来取到这个值。
不知道本人有没有叙述明白,如有问题,请高手看到给你纠正,谢谢。
相关文章推荐
- map中无法使用TCHAR*作为key的解决方法
- map中使用自定义类指针作为key
- C++中 使用数组作为map容器VAlue值的解决方法
- 历年世界杯冠军队伍如下,使用map存储这些队伍,使用年份作为key,冠军队伍名称作为value。 完成下面的功能: 1) 输入一个年份,如果当年有世界杯比赛,则输出获奖队伍,如果没有则输出“当年没有举
- linux下C++ STL hash_map的使用以及使用char *型变量作为Key值的一大“坑”
- 使用map来进行票数统计工作,循环输入多个人名,作为key存储到map中,对应的value就是该人获得的票数(即重复输入的次数),当重复输入时,需要对相应的数据进行修改。最红输quit结束循环,打印
- java中map使用非系统类作为key
- 使用用户自定义类型作为map的key
- Map使用非系统类作为key,要覆写equals和hashCode方法
- byte[]数组作为map的key的问题
- 使用类/结构体作为boost::unordered_map中的key时需要实现hash_value函数
- C++中 使用数组作为map容器VAlue值的解决方法
- 给定["a","b","a","b","c","a","b","c","b"]字符串数组,然后使用Map的key来保存数组的字符串元素,value保存该字符串元素出现的次数。
- map中使用自定义类指针作为key
- groovy 使用变量值作为 map 的key--需要注意的
- [转载]C++中 使用数组作为map容器VAlue值的解决方法
- 【LibUIDK系列文章】使用字符串作为map的Key
- Java 在 Map 中使用复杂数据类型作为 Key
- java中map使用非系统类作为key
- Oracle中as关键字作为别名使用时的用法详解