java对象相互覆盖问题解决

业务需求场景:
    明细内容数据表:当前例子中最小粒度的表。
    明细内容数据分组表(即将多个明细数据以包的形式组合起来形成一个组合包):与明细内容数据多对多的关系。
    主数据表(主数据根据需要配置一个或者多个明细数据组合包,每个组合包可以根据需要配置不同的使用场景,每个明细数据也可以根据需要配置不同的使用场景,同一个主数据表中不同的明细数据包中可能出现相同的明细数据):主数据和明细内容数据分组数据多对多关系。

异常:
    当主数据表配置了多个明细数据组合包后且不同的包里面出现相同的明细数据,对这些明细数据配置不同的规则,就回出现后面配置的规则覆盖了前面配置的规则。

原因举例:
    var arr = [[{A}],[{A}]] 
    for(int i =0 ;i<arr.length;i++){
        A [] arrA = arr[i];
        for(int j = 0;j<arrA.length;j++){
            A a = arrA[j] ;
        }
    }
    System.out.println(arr);
    输出结果内层数组的里面对象的值就是一样的,原因A a = arrA[j] 这里是对象的引用,会导致a直接指向arrA[j]的内存地址

结论:
    for循环里面如果直接用对象赋值,会导致后面的对象覆盖前面的对象

解决方法:
    使用set属性的方式赋值,或者使用BeanUtils.copyProperties的方式
推荐写法:
    var arr = [[{A}],[{A}]] 
    for(int i =0 ;i<arr.length;i++){
        A [] arrA = arr[i];
        for(int j = 0;j<arrA.length;j++){
            A a = new A();
            BeanUtils.copyProperties(arrA[j],a);
        }
    }
    System.out.println(arr);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java面向对象程序设计笔记: 目录----非原创,上课的时候老师给的资料哦 第一章 Java 前凑 3 1. Java前凑 3 Java产生的目的 3 Java的诞生的历史 3 2.Java语言的特点 3 简单性 3 面向对象 3 网络技能 3 3.Java语言与其他语言的区别 4 第二章 Java面向对象程序设计初步 4 1. 程序语言的分类 4 解释型语言 4 Java是编译解释型语言 4 Java编译器、解释器、JVM以及OS之间的关系 4 JVM的结构与作用 4 2. 程序设计的发展过程 4 程序设计的发展过程 4 O-O发展过程 5 O-O的体系 5 O-O程序设计与结构化程序设计的区别 5 3. Java应用程序 5 搭建开发环境 5 4. 类的设计与对象的构造 6 类的两个要素 6 构造函数 7 Java对内存的管理 7 Java源文件的结构 7 第三章 Java语法 8 1. Java注释 8 2. 标识符 9 3. 数据类型 9 基本数据类型 9 引用数据类型 9 5. 变量 9 6. 运算符 9 7. 数据的传输 9 8. 程序的逻辑控制语句 9 9. 数组 9 第四章 JavaOO程序设计 9 1.Java面向对象编程的特点 9 2.继承 10 2.1继承 10 2.2.Super关键字: 10 2.3.this关键字: 10 2.4.子类对象的构造和初始化: 11 2.5.方法的覆盖: 11 2.6.各种数据类型之间的相互转换: 12 3.静态成员 13 4. Final关键字: 13 5. 抽象类: 13 6. 接口 14 7. 接口与抽象类的区别: 15 8. 设计模式 15 单一设计模式: 15 策略模式: 16 模板模式: 16 组合设计模式: 16 9. 多态 16 10. 内部类 17 第五章 Java集合对象 18 1.List 18 2.Set 18 3.Map 19 第六章 常用的API类 21 1.对文件进行操作的类 21 2.对String对象操作的类 24 3. 对时间处理的类 25 4. 对系统处理的类: 26 5. 数据运算的类 27 6. 正则表达式 27 第七章 异常处理 32 第八章Oracle数据库基础 32 第九章JDBC编 32 第十章GUI编程 32
《疯狂Java讲义(附光盘第2版)》是《疯狂Java讲义》的第2版,第2版保持了第1版系统、全面、讲解浅显、细致的特性,全面介绍了新增的Java 7的新特性。 《疯狂Java讲义(附光盘第2版)》深入介绍了Java编程的相关方面,全书内容覆盖Java的基本语法结构、Java的面向对象特征、Java集合框架体系、Java泛型、异常处理、Java GUI编程、JDBC数据库编程、Java注释、Java的IO流体系、Java多线程编程、Java网络通信编程和Java反射机制;覆盖java.lang、java.util、java.text、java.io和java.nio、java.sql、java.awt、javax.swing包下绝大部分类和接口。《疯狂Java讲义(附光盘第2版)》全面介绍了Java 7的二进制整数、菱形语法、增强switch语句、多异常捕获、自动关闭资源的try语句、JDBC 4.1新特性、NIO.2、AIO等新特性。 与第1版类似,《疯狂Java讲义(附光盘第2版)》并不单纯从知识角度来讲解Java,而是从解决问题的角度来介绍Java语言,所以《疯狂Java讲义(附光盘第2版)》中涉及大量的实用案例开发:五子棋游戏、梭哈游戏、仿QQ的游戏大厅、MySQL企业管理器、仿EditPlus的文本编辑器、多线程、断点下载工具、Spring框架的IoC容器……这些案例既能让读者巩固每章的知识,又可以让读者学以致用,激发编程自豪感,进而引爆内心的编程激情。《疯狂Java讲义(附光盘第2版)》光盘里包含书中所有示例的代码和《疯狂Java实战演义》的所有项目代码,这些项目可以作为《疯狂Java讲义(附光盘第2版)》课后练习的“非标准答案”。如果读者需要获取关于课后习题的解决方法、编程思路,可以登录站点与笔者及《疯狂Java讲义(附光盘第2版)》庞大的读者群相互交流。 《疯狂Java讲义(附光盘第2版)》为所有打算深入掌握Java编程的读者而编写,适合各种层次的Java学习者和工作者阅读,也适合作为大学教育、培训机构的Java教材。但如果只是想简单涉猎Java,则《疯狂Java讲义(附光盘第2版)》过于庞大,不适合阅读。
Java 中,可以使用集合框架中的 List 接口及其实现类来存储对象列表。常见的 List 实现类包括 ArrayList、LinkedList、Vector 等。如果需要将不同对象的 List 集合相互转换,可以使用以下方法: 1. 使用 for 循环逐个转换 ```java List<Object1> list1 = new ArrayList<>(); List<Object2> list2 = new ArrayList<>(); // 将 Object1 对象列表转换为 Object2 对象列表 for (Object1 obj1 : list1) { Object2 obj2 = new Object2(obj1.getField1(), obj1.getField2()); list2.add(obj2); } // 将 Object2 对象列表转换为 Object1 对象列表 for (Object2 obj2 : list2) { Object1 obj1 = new Object1(obj2.getField1(), obj2.getField2()); list1.add(obj1); } ``` 2. 使用 Java 8 的 Stream API 转换 ```java List<Object1> list1 = new ArrayList<>(); List<Object2> list2 = new ArrayList<>(); // 将 Object1 对象列表转换为 Object2 对象列表 List<Object2> newList2 = list1.stream() .map(obj1 -> new Object2(obj1.getField1(), obj1.getField2())) .collect(Collectors.toList()); // 将 Object2 对象列表转换为 Object1 对象列表 List<Object1> newList1 = list2.stream() .map(obj2 -> new Object1(obj2.getField1(), obj2.getField2())) .collect(Collectors.toList()); ``` 以上代码中,`Object1` 和 `Object2` 分别表示需要转换的两个不同对象。在第一种方法中,使用 for 循环逐个转换,需要手动创建新对象并添加到目标列表中。在第二种方法中,使用 Java 8 的 Stream API,可以使用 `map` 方法将一个列表中的对象转换为另一个对象,并使用 `collect` 方法将转换后的对象列表收集到一个新的列表中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值