zoukankan      html  css  js  c++  java
  • 探讨:在循环前与在循环中创建对象的区别

    【业务场景】

    后端从数据库中获取数据传给前端。

    后端获得的数据格式:List

    前端需求的数据格式:Json

    【场景分析】

    后端获取的数据格式为 List ,而前端需求的数据格式为 Json。因此,后端需要将数据重新组装为 Json 格式才能传给前端接收。而在数据重新组装的过程中会遇到这样的问题,在将对象从 List 逐个获取放入另一个 List 时,这个中间对象是在对 List 循环之前创建还是循环中创建。

    这两种不同创建对象的方式会导致两种不同的组装效果。而这两种效果,一个是对的,一个是错的。

    【示例代码】

    代码运行环境

    • jdk: 1.8
    • 插件:lombok
    • 框架:springboot

    Item 实体

    /**
     * Item 对象
     */
    @Data
    public class Item {
    
        private String ItemId;
        private String ItemName;
    
    }
    

    循环类

    import java.util.ArrayList;
    import java.util.List;
    
    public class CreateObject {
        public static void main(String[] args) {
            //初始化数据
            List<Item> itemListIn = new ArrayList<>();
    
            Item item_1 = new Item();
            item_1.setItemId("1");
            item_1.setItemName("item_1");
    
            Item item_2 = new Item();
            item_2.setItemId("2");
            item_2.setItemName("item_2");
    
            Item item_3 = new Item();
            item_3.setItemId("3");
            item_3.setItemName("item_3");
    
            itemListIn.add(item_1);
            itemListIn.add(item_2);
            itemListIn.add(item_3);
    
            //在循环外部创建对象
            List<Item> itemListOut_t1 = new ArrayList<>();
            //创建中间对象 item_t1
            Item item_t1 = new Item();
            for (Item itemIn : itemListIn) {
                item_t1.setItemId(itemIn.getItemId());
                item_t1.setItemName(itemIn.getItemName());
                itemListOut_t1.add(item_t1);
            }
    
            System.out.println("循环外部创建对象");
            System.out.println("循环结束后,传给前端的数据:");
            System.out.println(itemListOut_t1);
    
            //在循环内部创建对象
            List<Item> itemListOut_t2 = new ArrayList<>();
            for (Item itemIn : itemListIn) {
                //创建中间对象 item_t2
                Item item_t2 = new Item();
                item_t2.setItemId(itemIn.getItemId());
                item_t2.setItemName(itemIn.getItemName());
                itemListOut_t2.add(item_t2);
            }
    
            System.out.println("循环内部创建对象");
            System.out.println("循环结束后,传给前端的数据:");
            System.out.println(itemListOut_t2);
        }
    }

    运行结果:
    这里写图片描述

    【代码分析】

    通过控制台可以很容易地看出来,在循环外部创建对象是错误的,在循环内部创建对象是正确的。

    产生出两种不同输出效果的原因如下:

    在循环外部创建对象,使得循环内部一直使用同一个对象,虽然 itemListIn 循环了三次,item 也被三次添加到 itemListOut_t1,但是三次都是同一个对象,换句话说,最后 itemListOut_t1 得到的三个对象是相同的。

    而在循环内部创建对象,循环内部使用的是三个不同的对象,最后 itemListOut_t1 得到三个不同的对象。

  • 相关阅读:
    openstack计算节点nova
    openstack控制节点nova
    openstack镜像服务glance
    openstack验证服务keystone
    openstack基础环境
    关于mysql中like查询是否通过索引的测试
    并发编程的优缺点
    mybatis中namespace配置方式
    开通技术博客的第一天
    ajax的使用
  • 原文地址:https://www.cnblogs.com/zhenggc/p/13655505.html
Copyright © 2011-2022 走看看