为什么arraylist1 = arraylist2不将arraylist2的值分配给arraylist1?

时间:2019-04-11 08:25:37

标签: android arraylist android-recyclerview

这使RecyclerView为空白:

      public void onTicketsFetched(SupportTicketModel[] fetchedTickets) {
            ArrayList<SupportTicketModel> ticketModelsUpdated = new ArrayList<>(Arrays.asList(fetchedTickets));
            ticketModels.clear();
            ticketModels = ticketModelsUpdated;
            ticketAdapter.notifyDataSetChanged();
      }

这可行:

     public void onTicketsFetched(SupportTicketModel[] fetchedTickets) {
            ArrayList<SupportTicketModel> ticketModelsUpdated = new ArrayList<>(Arrays.asList(fetchedTickets));
            ticketModels.clear();
            ticketModels.addAll(ticketModelsUpdated);
            ticketAdapter.notifyDataSetChanged();
     }

差异

  • 第一:ticketModels = ticketModelsUpdated;

  • 第二:ticketModels.addAll(ticketModelsUpdated);

据我所知,ticketModelsticketModelsUpdated完成时ticketModels = ticketModelsUpdated基本上将引用同一列表。因此,从技术上讲,ticketModels应该具有ticketModelsUpdated的每个值。但这给了我错误。有什么想法吗?

我知道ticketMOdels.AddAll(ticketModelsUpdated)将创建两个值相同的列表。而且工作正常。

那怎么了?

4 个答案:

答案 0 :(得分:0)

在Java中,按引用列出工作。在第一部分中,您将更改内存地址和项目值,而在第二部分中,仅更改值。这就是您的第二个解决方案起作用的原因。

答案 1 :(得分:0)

问题可能出在您的适配器上

假设您将ticketModels传递给适配器,并将此引用保存在列表变量中。

这样做的时候

ticketModels.addAll(ticketModelsUpdated);

内部适配器列表指针始终在引用ticketModel。因此,它有效。

但是,这个:

ticketModels = ticketModelsUpdated;

您正在更改ticketModels指针,但是适配器始终指向先前的ticketModel值。

您还应该更新适配器列表指针。

答案 2 :(得分:0)

在第一种情况下,您在两个链接ticketModelsticketModelsUpdated之间共享数组元素的相同内存地址。这意味着您可以从两个不同的入口点访问相同的元素。

在第二种情况下,您将使用新的内存地址创建相同的元素。这意味着ticketModelsticketModelsUpdated没有共享相同的内存空间。

尽管ticketModelsUpdated是局部变量,分配的内存将一直存在,直到引用该地址为止。因此,据我了解,即使ticketModels被销毁后,ticketModelsUpdated也应该有权访问所有元素。两种情况都应该起作用。

编辑:似乎您将适配器绑定到ticketModels的引用,而不绑定到ticketModels的值。这就是为什么您的方法ticketModels.clear()会清除适配器已链接到的旧的已分配内存空间。因此,在第一种情况下,您将ticketModels的链接更改为新的内存空间,而适配器仍引用已清除的内存空间。在第二种情况下,您保留对旧内存空间的引用,并在其中用新元素填充已清除的数据。

这只是我的猜测,因为您没有提供如何将适配器与ticketModels绑定的任何信息。

答案 3 :(得分:0)

差异:

  • 首先:ticketModels = ticketModelsUpdated;
  • 第二:ticketModels.addAll(ticketModelsUpdated);

第一种情况:这种情况将ticketModelsUpdated的引用分配给ticketModels。因此,每当“ ticketModels”列表被修改时,“ ticketModelsUpdated”也将被修改。这就是为什么这种情况不起作用的原因。

第二种情况:这种情况仅将ticketModelsUpdated的值分配给ticketModels。因此,“ ticketModels”列表中的更改不会修改“ ticketModelsUpdated”列表。