yuankee1722 2024-05-17 13:13 采纳率: 80%
浏览 2
已结题

为什么循环时创建四个不一样的对象,循环添加后,打印ArrayList四个成员却一样?

为什么循环时创建四个不一样的对象,循环添加后,打印ArrayList四个成员却一样?
该怎么得到四个不一样数组成员?
后来我把遍历放for循环里面还是打印四个一样的。

img

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-05-17 13:13
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    【您想要解决的问题】

    您提问的目的是解决在Java中使用循环创建并添加到ArrayList中的四个TransferMoneyDto对象,尽管在创建时它们具有不同的属性值,但在打印时却显示相同的属性值的问题。

    【图片内容】

    您上传的图片显示了一个Java程序的代码片段,其中包含了以下内容:

    • 一个名为ConcurrentTransferMoney的Java类,其中有一个main方法。
    • main方法中,创建了一个BigDecimal对象changeNumber,其值为10。
    • 创建了一个TransferMoneyDto对象dto,随后创建了一个ArrayList对象dtoList来存储多个TransferMoneyDto对象。
    • 一个for循环,循环次数为4,每次循环中都创建了一个新的TransferMoneyDto对象,并根据循环的迭代次数修改了accountFromaccountTo的值,以及operateType的值。
    • 在循环结束后,使用System.out.println打印了dtoList中的所有对象。

    【问题出现原因】

    问题出现的原因在于Java中的对象引用。在Java中,如果对象的引用被修改,那么所有引用该对象的地方都会看到这种修改。在您的代码中,accountFromaccountTo变量被多次复用,并且在循环中被追加了新的字符串。由于字符串在Java中是不可变的,每次对字符串进行修改实际上都是创建了一个新的字符串对象,而原始的引用变量仍然指向同一个对象。因此,当您在循环中修改这些引用时,所有存储在dtoList中的TransferMoneyDto对象都会引用到这些修改后的字符串。

    【问题解决方案】

    为了得到四个具有不同属性值的TransferMoneyDto对象,您需要在循环内部为每次迭代创建独立的accountFromaccountTo字符串副本。以下是修改后的代码示例:

    BigDecimal changeNumber = BigDecimal.valueOf(10);
    List<TransferMoneyDto> dtoList = new ArrayList<>();
    for (int i = 0; i < 4; i++) {
        String accountFromBase = "me";
        String accountToBase = "you";
        TransferMoneyDto dto = new TransferMoneyDto(
            accountFromBase + "fr".repeat(i + 1), // 创建新的字符串副本
            accountToBase + "To".repeat(i + 1), // 创建新的字符串副本
            i % 2 == 0 ? OperateType.add : OperateType.reduce,
            changeNumber
        );
        System.out.println(dto);
        dtoList.add(dto);
        System.out.println(); // 打印空行以便区分各个对象的输出
    }
    for (TransferMoneyDto dto1 : dtoList) {
        System.out.println(dto1);
    }
    

    【提供代码】

    上面的代码块展示了如何修改原始代码以解决您遇到的问题。

    【代码运行方式】

    您需要有一个Java开发环境,如JDK 17或更新版本。将上述代码保存为一个.java文件,并通过命令行编译并运行该文件。

    【代码预期运行结果】

    TransferMoneyDto[accountFrom=mefr, accountTo=youTo, operateType=add, changeNumber=10]
    TransferMoneyDto[accountFrom=mefrfr, accountTo=youToTo, operateType=reduce, changeNumber=10]
    TransferMoneyDto[accountFrom=mefrfrfr, accountTo=youToToTo, operateType=add, changeNumber=10]
    TransferMoneyDto[accountFrom=mefrfrfrfr, accountTo=youToToToTo, operateType=reduce, changeNumber=10]
    

    【推荐相关链接】

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月25日
  • 已采纳回答 5月17日
  • 创建了问题 5月17日