这个是今天我的个人经历,作为经验教训,鄙视自己一下。
先说下问题,在网上查了下,我用的是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进去的值,最终来取到这个值。
不知道本人有没有叙述明白,如有问题,请高手看到给你纠正,谢谢。