Java中Map,List与Set的区别

2021-04-09 07:27

阅读:492

怎么让HashMap同步?

  • synchronizeMap
  • JAVA5以上 ConcurrentHashMapHashTable的替代 (即线程安全的)

关于List<Map<String, Object>>理解

首先map是定义了一个Map集合变量,然后list>是定义了一个List的集合变量,是map的一个集合;map是那个list的其中一个值。
List list=new ArrayList>;
Map map=new HashMap;
  
list.add(map);//map是list中的其中一个值。

List集合中的对象是一个Map对象,而这个Map对象的键是String类型,值是Object类型

package com.test;

import java.util.*;

public class MyTest01 {
public static void main(String[] args) {

List> listMaps = new ArrayList>();

Map map1 = new HashMap();
map1.put("1", "a");
map1.put("2", "b");
map1.put("3", "c");
listMaps.add(map1);

Map map2 = new HashMap();
map2.put("11", "aa");
map2.put("22", "bb");
map2.put("33", "cc");
listMaps.add(map2);

for (Map map : listMaps) {
for (String s : map.keySet()) {
System.out.print(map.get(s) + " ");
}
}
System.out.println();
System.out.println("========================");
for (int i = 0; i ) {
Map map = listMaps.get(i);
Iterator iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String string = (String) iterator.next();
System.out.println(map.get(string));
}
}
System.out.println("++++++++++++++++++++++++++++");
for (Map map : listMaps) {
for (Map.Entry m : map.entrySet()) {
System.out.print(m.getKey() + " ");
System.out.println(m.getValue());
}
}
System.out.println("-----------------------------");
}
}

List<Map<String, Object>>存放的对象问题

一、提出问题
代码一:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test {
public static void main(String args[]) {
List> list = new ArrayList>(); 
Map map = new HashMap(); 
for(int i=0;i5;i++) {
//    Map map = new HashMap(); 
map.put("a", i); 
map.put("b", i); 
list.add(map); 
} 
System.out.println(list);
}
}

代码二:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test {
public static void main(String args[]) {
List> list = new ArrayList>(); 
//    Map map = new HashMap(); 
for(int i=0;i5;i++) {
Map map = new HashMap(); 
map.put("a", i); 
map.put("b", i); 
list.add(map); 
} 
System.out.println(list);
}
}
 

二、给出答案
猜猜看代码一二运行的结果分别是啥?

没错,就是:

代码一:

[{a=4,b=4},{a=4,b=4},{a=4,b=4},{a=4,b=4},{a=4,b=4}]
代码二:

[{a=0,b=0},{a=1,b=1},{a=2,b=2},{a=3,b=3},{a=4,b=4}]
 

三、问题分析
代码一中,List>里面存放的是map对象的地址,尽管循环了五次,但是每次的map对象对应的都是同一个地址,即listMap里面存放的是五个同样的map对象。 
代码二中,每次循环的时候都实例化一个新的map对象,这样list在执行add方法的时候,每次都是存的不一样的map对象。
 可以通过debug来观察list存放的map对象对应的id。如图:

代码一:

 技术图片

代码二:

 技术图片

四、总结
通过上面的分析,我们可以知道,以后需要创建不同的map对象的时候,需要在循环里面进行map的创建。

而不是在循环体外面,因为List>指向的是map对象的地址。


评论


亲,登录后才可以留言!