一次想从list<object>中取出数据,然后依次赋值给ArrayList<Map<String, String>>
就是这样写的(错误写法)
package collect; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; public class iter { public static void main(String[] args) { List<Object> list = new ArrayList<Object>(); object object1 =new object(); object1.setName("你好"); object1.setWork("你好"); list.add(object1); object object2 =new object(); object2.setName("世界"); object2.setWork("世界"); list.add(object2); ArrayList<Map<String, String>> listmap = new ArrayList<Map<String, String>>(); Iterator<Object> it=list.iterator(); Map<String, String> map= new HashMap<>(); while (it.hasNext()) { object str=(object) it.next(); map.put("name", str.getName()); map.put("work", str.getWork()); listmap.add(map); } System.out.println(listmap); } }
先创建list并添加数据,然后用iterator遍历,每次把数据取出来put到map里面,
然后add到ArrayList<Map<String, String>>里面
结果,确实存入了两次数据,但是存进了同一个数据两次
[{work=世界, name=世界}, {work=世界, name=世界}]
然后把Map<String, String> map=new HashMap<>();放入iterator内部,
package collect; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; public class iter { public static void main(String[] args) { List<Object> list = new ArrayList<Object>(); object object1 =new object(); object1.setName("你好"); object1.setWork("你好"); list.add(object1); object object2 =new object(); object2.setName("世界"); object2.setWork("世界"); list.add(object2); ArrayList<Map<String, String>> listmap = new ArrayList<Map<String, String>>(); Iterator<Object> it=list.iterator(); while (it.hasNext()) { Map<String, String> map= new HashMap<>(); object str=(object) it.next(); map.put("name", str.getName()); map.put("work", str.getWork()); listmap.add(map); } System.out.println(listmap); } }
结果,正好是期望的结果
[{work=你好, name=你好}, {work=世界, name=世界}]
这个非常简单,就是多次存取,有点蒙了
将Map<String, String> map=new HashMap<>(); 放到iterator外面时(错误情况下)
iterator遍历了list,每次都赋值给str,然后str将属性添加到map里面,但是map是引用,不代表具体数据
第一次添加将 “你好”的数据保存进map对象,然后将map引用指向的对象添加到listmap中
第二次put添加”世界”的时候,还是用的第一次的map引用,map引用指的还是第一次的map对象,里面保存着”你好”,所以map修改了对象,将原来的map改为了保存着”世界”的map,又添加一次map到listmap中
所以,一共在listmap中添加了两次map,而这个map引用的对象变成了”世界”这个值,所以输出listmap的值就变成了保存两次的世界
第二次提交,第一次的对象内容修改为世界,但是两次提交得都是这个对象,所以提交了两次世界
如果将Map<String, String> map=new HashMap<>(); 放到iterator里面,每次都是重新new 了一个hashmap赋值给map,
然后赋值并将map引用所指的对象,添加到listmap中,接着下一轮再次更改引用指向的对象(Map<String, String> map= new HashMap<>();),再将引用所指的对象添加到listmap中
这样一来,第一次添加的是第一次new hashmap指的对象,第二次添加的是第二次指的hashmap对象,所以第二次的map.put不会因为两次的对象是同一个,而修改第一个的值。
第二次提交,map新建了一个对象,并将引用指向新的对象,所以最后提交的是,第一个对象你好,第二个世界
最后把object也贴上
package collect;
public class object {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getWork() {
return work;
}
public void setWork(String work) {
this.work = work;
}
private String work;
public object() {
super();
// TODO Auto-generated constructor stub
}
public object(String name, String work) {
super();
this.name = name;
this.work = work;
}
}