【问题标题】:ArrayList added item is replaced by the next item in for loopArrayList 添加的项目被 for 循环中的下一个项目替换
【发布时间】:2020-09-20 18:13:39
【问题描述】:

我正面临一个非常奇怪的情况。我在循环中将一个对象添加到 arrayList,但它被下一个对象替换。实际上第二项是重复的。 (它替换了第一项并将另一个对象插入到 ArrayList 中。)

这是我的代码。我已经完成了调试并在需要的地方包含了 cmets。有人能指出为什么会这样吗?我正在从数据库中获取对象详细信息,并且这些信息按预期工作。

public class Serv
{
    @Autowired
    GrpHeader objGrpHeader;

    @Autowired
    CompPesoOutgoingMsg objMsg;

    @Autowired
    OutwardMessage objOutwardMessage;

    public List<OutwardMessage> outgoingMessagesAsSingleTrx()
    {
        List<OutgoingMsg_Obj> trxList = myRepo.getTrx("5");
        List<OutwardMessage> myTrxList = new ArrayList<>();


        for (OutgoingMsg_Obj outgoingMsg : trxList)
        {
            BigDecimal trxAmt = outgoingMsg.getIntrBkSttlmAmt().getTrxn_amt();
            trxAmt = (trxAmt).divide(new BigDecimal(100));

            GrpHeader grpHeader = objGrpHeader;
            CompPesoOutgoingMsg outMsg2 = objMsg;
            OutwardMessage objOutwardMessage2 = objOutwardMessage;

            outgoingMsg.setRmtInf(objRmtInf);
            outgoingMsg.setPmtTpInf(objPmtTpInf);

            outMsg2.setHeader(grpHeader);
            outMsg2.setCdtTrfTxInf(Arrays.asList(outgoingMsg));
            objOutwardMessage2.setObjMsg(outMsg2);

            **//Here, Correct object details are printed**
            log.info("outwardMsg 100 {} ", objOutwardMessage2);

            //Add Item to the list
            myTrxList.add(objOutwardMessage2);

            for (OutwardMessage outwardMsgx : myTrxList)
            {
                //1. When this loop executed first time, first object details are printed
                //2. When printed second time, first added object is no more. And second added object is there twice.
                log.info("outwardMsg 101 {} ", outwardMsgx);
            }
        }
        return myTrxList;
    }
}

【问题讨论】:

标签: java list arraylist


【解决方案1】:

您只有一个参考。通过将objOutwardMessage2设置为objOutwardMessage,您只是在更改引用中的数据。

【讨论】:

  • 感谢您的回答。知道如何解决吗?我对springboot有点陌生
  • 据我所知,您应该创建一个 OutwardMessage 的新实例,而不是:OutwardMessage objOutwardMessage2 = objOutwardMessage; 这样做。根据您要实现的目标,您可能需要其他东西,因为 OutwardMessage 是一个 bean。如果您需要该对象内的数据,请查看:this question
【解决方案2】:

由于每次迭代都不会创建新对象,因此每次都会替换相同的 objOutwardMessage2 值。

试试

OutwardMessage objOutwardMessage2 = new OutwardMessage();

并将 objOutwardMessage 的值复制到新创建的 objOutwardMessage2。

【讨论】:

  • 感谢您的回答。但是因为我正在创建一个 Spring Boot 应用程序,所以不能使用“new”关键字。
  • @Ran_Macavity Spring Boot 不会禁止您使用 new 关键字。
  • 是的。没有什么反对创建新实例。您甚至不能通过注释返回 new stuff 的方法来创建新实例,还可以创建新 bean
  • @Ivar 是的,我知道。如果失败,我会尝试。谢谢
猜你喜欢
  • 2019-05-22
  • 1970-01-01
  • 2021-05-21
  • 2019-11-05
  • 1970-01-01
  • 2021-08-23
  • 2018-12-29
  • 2012-11-19
  • 2018-05-16
相关资源
最近更新 更多