1. 如何实现Map中key为泛型,value为泛型集合
public static void main(String[] args) {
Map<String,List<String>> dataMap = Maps.newHashMap();
setMap(dataMap);
}
public static void setMap(Map<?,?> dataMap){
Set<?> dateSet = dataMap.keySet();
for (Object obj : dateSet) {
List<?> dataList = (List<?>) dataMap.get(obj);
}
}
2.遇见的错误
private void viewDetail(){
Map map1 = new HashMap();
Map<String,Object> map2 = new HashMap<String,Object>();
Map<Object,Object> map3 = new HashMap<Object,Object>();
Map<String,String> map4 = new HashMap<String,String>();
test1(map1);
test1(map2);
test1(map3); //编译错误
test1(map4); //编译错误
}
private void test1(Map<String,Object> map){
}
在泛型这里 Object 就只表示Object 不能表示所有对象
因为泛型是保证编译时你给的实际类型和参数声明的类型一致,它的意义就在于此,不需要解释,这是需要你学习的规则而已。
那为什么map1就可以呢,这里有历史原因,因为泛型是后加入的,早期的版本没有,但是java的开发者希望不能因为加入泛型就要修改成千上万的现有应用,所以默认他可以通融老版本不加泛型的变量,但是编译时一定会有提示你有危险代码的。
正因为这样,泛型非常的好破,随便写点代码就可以让编译通过,而运行时错误,所以现在开发,一定要使用一种代码,千万不要两者都用,那样太危险,如果你用了泛型,就全部都用,切记切记
3.遍历的方法
public static void main(String[] args) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("aaa", 111);
map.put("bbb", 222);
map.put("ccc", 333);
map.put("ddd", 444);
//Map集合循环遍历方式一
System.out.println("第一种:通过Map.keySet()遍历key和value:");
for(String key:map.keySet()){
//keySet获取map集合key的集合 然后在遍历key即可
String value = map.get(key).toString();//
System.out.println("key:"+key+" vlaue:"+value);
}
//Map集合循环遍历二 通过迭代器的方式
System.out.println("第二种:通过Map.entrySet使用iterator遍历key和value:");
Iterator<Entry<String, Object>> it = map.entrySet().iterator();
while(it.hasNext()){
Entry<String, Object> entry = it.next();
System.out.println("key:"+entry.getKey()+" key:"+entry.getValue());
}
// Map集合循环遍历方式三 推荐,尤其是容量大时
System.out.println("第三种:通过Map.entrySet遍历key和value");
for (Map.Entry<String, Object> m : map.entrySet()) {
System.out.println("key:" + m.getKey() + " value:" + m.getValue());
}
// 第四种:
System.out.println("第四种:通过Map.values()遍历所有的value,但不能遍历key");
for(Object m:map.values()){
System.out.println(m);
}
}
}
4.Java Map释放内存置null以及调用clear()的区别
如果你需要将map中的数据清除掉,然后继续使用这个map,就用clear(),如果你是不再使用了,或者想要new一个新的map,那就最好使用null,这样子垃圾回收器才能及时回收内存空间。建议去了解一下垃圾回收机制,你就知道什么情况下用null,什么情况下用clear()