探讨:在循环前与在循环中创建对象的区别

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

【业务场景】

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

后端获得的数据格式: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 得到三个不同的对象。

相关文章
|
4月前
|
人工智能 缓存 运维
为什么企业级知识处理场景越来越偏爱 Claude?
企业数字化升级中,知识处理是AI落地关键场景。Claude凭借超大上下文(最高1M tokens)、会话压缩、Prompt缓存及精准溯源等工程能力,高效应对长文档、多源碎片化知识挑战,显著提升售前、客服与新人培训效率。统一网关进一步简化多模型接入与运维,加速AI规模化落地。
233 0
|
移动开发 前端开发 JavaScript
前端摸鱼神器,设计稿一键导出 「小程序/Vue/Uni-app」代码
这款神器就是「CodeFun」,它号称“UI 设计稿智能生成源代码,10 分钟完成 8 小时工作量”,让我们做前端,不搬砖
2761 0
前端摸鱼神器,设计稿一键导出 「小程序/Vue/Uni-app」代码
|
2月前
|
人工智能 运维 API
TokenOps:AI 调用成本从失控到可控的技术框架
黄仁勋称工程师年薪50万,却要花25万在AI Token上——揭示AI成本正从人力转向算力。Uber烧光全年AI预算、微软停用外部工具、账单碎片难追踪……企业正面临“能调不能管”的困境。TokenOps应运而生:实时计量、精准归属、动态预算,让AI调用从失控走向可控。
174 2
|
2月前
|
人工智能 编解码 安全
一站式AI视频翻译的技术架构:ASR→NMT→TTS→字幕压制的全链路设计
本文提出一套可落地的AI视频翻译系统架构,强调构建稳定、可追踪的数据管线而非简单串联模型。全链路分为输入、ASR、说话人分离、NMT、TTS、后处理和任务编排7层,以带时间轴/角色/状态的segment为核心数据结构,确保时间轴精准、声音不串、成品直发,专为出海、课程本地化与短剧翻译等场景优化。
|
5月前
|
人工智能 运维 供应链
企业建设BI平台要多少钱?2026年最新报价、成本构成与选型指南
2026年企业建设BI平台成本差异大:轻量级SaaS年投入5–23万元,中型私有化40–100万元,大型全栈超160万元。本文详解软件、实施、数据治理等真实成本构成,破除“重采购、轻服务”误区,并推荐瓴羊Quick BI——以智能小Q实现对话式分析、模块化降本增效、全域数据融合,助力企业高性价比迈向数据驱动。
|
机器学习/深度学习 编解码 监控
近红外和可见光图像融合的ICA变换
近红外(NIR)与可见光图像融合中应用独立成分分析(ICA)变换,是一种基于统计独立特性的图像融合方法,旨在结合可见光图像的纹理细节与近红外图像的光谱 / 辐射信息(如低光照、穿透能力等)。
375 5
|
Java 编译器 C语言
【C/C++】 switch-case 详解/全面总结
关于 C语言/C++ 中,switch-case 的尽量详细和全面的解释与总结
5262 0
|
机器学习/深度学习 人工智能 算法
《搞懂朴素贝叶斯:先验概率与后验概率的深度剖析》
朴素贝叶斯算法在文本分类、垃圾邮件过滤等领域广泛应用。先验概率基于历史数据或经验,是对事件发生概率的初步估计;后验概率则结合新证据,通过贝叶斯定理更新概率估计,更准确反映实际情况。掌握这两者及贝叶斯定理,能更好地应用该算法解决实际问题。
1145 24
|
网络协议 网络架构
网络工程师必知:什么是OSPF多区域?如何配置?
网络工程师必知:什么是OSPF多区域?如何配置?
1302 2
网络工程师必知:什么是OSPF多区域?如何配置?
|
分布式计算 Hadoop 大数据
数据工程师必须掌握的7个大数据实战项目
值得收藏,数据工程师必须掌握的7个大数据实战项目
8319 1
数据工程师必须掌握的7个大数据实战项目