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

一次想从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;
	}

		
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值