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

为什么循环时创建四个不一样的对象,循环添加后,打印ArrayList四个成员却一样?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
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
对象,并根据循环的迭代次数修改了accountFrom
和accountTo
的值,以及operateType
的值。 - 在循环结束后,使用
System.out.println
打印了dtoList
中的所有对象。
【问题出现原因】
问题出现的原因在于Java中的对象引用。在Java中,如果对象的引用被修改,那么所有引用该对象的地方都会看到这种修改。在您的代码中,
accountFrom
和accountTo
变量被多次复用,并且在循环中被追加了新的字符串。由于字符串在Java中是不可变的,每次对字符串进行修改实际上都是创建了一个新的字符串对象,而原始的引用变量仍然指向同一个对象。因此,当您在循环中修改这些引用时,所有存储在dtoList
中的TransferMoneyDto
对象都会引用到这些修改后的字符串。【问题解决方案】
为了得到四个具有不同属性值的
TransferMoneyDto
对象,您需要在循环内部为每次迭代创建独立的accountFrom
和accountTo
字符串副本。以下是修改后的代码示例: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无用 - 一个名为