【问题标题】:Cloning arrayList in java using constructor使用构造函数在java中克隆arrayList
【发布时间】:2020-12-02 16:43:55
【问题描述】:

我正在向 Udemy 学习 Java,导师编写了以下代码...

这里的theatre.seat 是一个Seat 对象的arrayList,它是Theatre 类的内部类。 seatCopy 是通过在其构造函数中传递 theatre.seats 获得的 theatre.seats 的副本。 pritnList 仅用于在控制台上打印列表。

List<Theatre.Seat> seatCopy = new ArrayList<>(theatre.seats);

Collections.shuffle(seatCopy);
System.out.println("Printing seat copy : ");
printList(seatCopy);
System.out.println("Printing theatre.seat : ");
printList(theatre.seats);

由于这是一个浅拷贝,即 seatCopy 和 theatre.seats 都引用同一个 arrayList 对象,那么当在 seatCopy 上调用 shuffle 方法时,不应该以相同的方式对两个列表进行混洗和打印吗?

以下是输出:

seatCopy 被洗牌,但 theatre.seats 不是。为什么?

【问题讨论】:

  • 请不要发布图片。以可读的方式在您的问题中提供输出。
  • 对不起!我会注意以后的问题

标签: java arraylist collections


【解决方案1】:

List 包含引用,而不是对象

您的Theatre.Seat 对象实际上并不存在于列表中。 List 持有对象的引用pointers,内存地址)。这些座位对象中的每一个实际上都在内存中的其他地方浮动。

想象你家中不同地方的座位(将其与物体进行比较)(将其与记忆进行比较)。想象一个包含许多空架子的柜子,那个柜子就是你的List。为列表分配一个座位就像将一根电线连接到您的一张餐桌椅上,同时将电线的另一端连接到橱柜的第一个架子上。接下来,你用另一根绳子把你的看电视椅用另一根线连接到柜子的第二个架子上,为你的列表分配第二个元素。

我们说柜子(列表)有两把椅子(物体)。但我们真正的意思是该列表包含两条线(参考),将我们引向每把椅子(对象)。我们柜子里其他没有绳子的架子是null

当您复制列表(浅拷贝)时,您并没有复制对象。您正在建造另一个空架子柜,然后连接第二组电线。您家中的各种座位不重复。但是现在你有两套绳子了。

【讨论】:

    【解决方案2】:

    它们没有引用相同的 ArrayList。

    它们是 ArrayList 的 2 个实例,都包含每个元素的相同实例。

    因此,如果您对元素的实例进行更改,则两者都会更改, 但是如果你在 ArrayList 中做一个改变,它不会改变另一个。

    【讨论】:

      【解决方案3】:

      列表的浅拷贝意味着只拷贝列表,不拷贝元素。 您确实创建了一个不同的列表,但它包含相同的对象。

      如果你要这样做,例如

      List<Theatre.Seat> seatCopy = new ArrayList<>(theatre.seats);
      seatCopy.get(0).placeNumber = "13A"; // modify an element in the list(s)
      Collections.shuffle(seatCopy);
      System.out.println("Printing seat copy : ");
      printList(seatCopy);
      System.out.println("Printing theatre.seat : ");
      printList(theatre.seats);
      

      元素的修改将出现在两个打印输出中,但列表的顺序会有所不同(因为它们是不同的列表)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多