【问题标题】:List value gets Modify in java列表值在java中得到修改
【发布时间】:2019-11-20 09:29:01
【问题描述】:

我有三个列表,在第三个列表中我正在合并两个列表。如果我在第三个中进行更改,为什么更改会反映到其他列表以及如何克服?

List<Communication> communicationFromList = fromTicket.getCommunications();
List<Communication> communicationToList = toTicket.getCommunications();
List<Communication>  mergedCommunication=new  ArrayList<>();

mergedCommunication.addAll(communicationToList);
mergedCommunication.addAll(communicationFromList);

for (int i = index; i < mergedCommunication.size(); i++) {
        if (!ObjectUtils.isEmpty(mergedCommunication.get(i))) {
          int j =i;
         Communication communication = mergedCommunication.get(i);
         communication.setCommSeqId(++j);
         communication.setMergeInfo("Merged From: " + fromTicketId);
        }
      }

由于上述更改也会反映到其他列表中。如何克服

【问题讨论】:

  • 您正在更改Communication 对象,而不是列表。

标签: java spring spring-boot collections java-8


【解决方案1】:

因此,在 java 中,对象是通过引用传递的。在这种情况下,当您在mergedCommunication 上执行addAll 时,它添加了两个列表中所有对象的引用,即communicationToListcommunicationFromListmergedCommunication。因此,mergedCommunication 中的 Communication 对象与其他两个列表中的对象相同。

**建议:**如果您不想修改原始对象,可以进行克隆。

【讨论】:

  • Java 对象不是通过引用传递的!这是一种误解和错误。 Java 是按值传递:journaldev.com/3884/…
  • 那是一个错误的博客。变量 o1 和 o2 正在引用对象,但与调用此方法的方法中的引用变量不同。简而言之,您在互联网上看到的不是事实,它只是信息,请始终进行测试,否则您将永远陷入困境。 Java 通过值传递原语,但通过引用传递对象。
  • 也许我应该引用 stackOverflow,如果这对您更有意义:stackoverflow.com/questions/40480/… 一个对象具有引用的价值。这个引用是按值传递的,即使它是一个引用。
  • Java is always pass-by-value. Unfortunately, when we pass the value of an object, we are passing the reference to it. 希望这条线被清楚地理解。如果我重新表述这个对象,内存位置最终会被传递(在这里被称为值)。所以,这就是我要说的。不过谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
相关资源
最近更新 更多