引用与对象之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的值就变成了保存两次的世界
第二次提交,第一次的对象内容修改为世界,但是两次提交得都是这个对象,所以提交了两次世界
如果将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;}}
- 引用与对象之Iterator中添加数据忘记new对象的错误
- Iterator new一个对象的过程
- C++之对象的new与delete
- 对象引用与对象的区别 ,String s = new String("abc");创建了几个对象?
- C++之创建对象时的new与不new
- C++之创建对象时的new与不new
- Java中对象与引用的理解
- java中对象的引用与赋值
- JAVA中对象的赋值与引用
- Java中对象的赋值与引用
- Java学习之对象与对象引用的区别
- java初学之对象引用与对象的区别
- java之对象引用与对象的区别
- 将对象添加到List集合中添加的是对象的引用
- Java中对象与引用
- Java中对象与引用
- Java中对象与引用
- Java中引用与对象
- MTCNN中将自己训练的o-net接在作者提供的net1,net2后面python代码解读
- POJ 3463 Sightseeing(最短路次短路计数)
- JDK对国际化的支持
- 休整之后
- 三千记之知识备忘
- 引用与对象之Iterator中添加数据忘记new对象的错误
- crontab条目包含%号问题
- Spring Cloud Sleuth与Zipkin整合时遇到的问题记录
- 由浅至深学习block
- attribute value must be constant
- Git学习(GitHug安装及其闯关攻略)
- http协议笔记
- Swift3中数组创建方法
- poj 1509 Glass Beads(最小表示法模板题)