引用与对象之Iterator中添加数据忘记new对象的错误

来源:互联网 发布:java 线程安全的list 编辑:程序博客网 时间:2024/05/30 23:01

一次想从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的值就变成了保存两次的世界

imageimage

第二次提交,第一次的对象内容修改为世界,但是两次提交得都是这个对象,所以提交了两次世界

如果将Map<String, String> map=new HashMap<>(); 放到iterator里面,每次都是重新new 了一个hashmap赋值给map,

然后赋值并将map引用所指的对象,添加到listmap中,接着下一轮再次更改引用指向的对象(Map<String, String> map= new HashMap<>();),再将引用所指的对象添加到listmap中

这样一来,第一次添加的是第一次new hashmap指的对象,第二次添加的是第二次指的hashmap对象,所以第二次的map.put不会因为两次的对象是同一个,而修改第一个的值。

imageimage

第二次提交,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;}}


原创粉丝点击