Java:为什么要更改影响全局变量原始副本的局部变量?

时间:2016-10-08 10:21:22

标签: java android variables scope android-recyclerview

我尝试分配全局变量的数据并更改局部变量的数据,但是当我更改局部变量的结构时,全局变量会变为好。

private void remove(Message M) {
      int           p = list.lastIndexOf(M);
      List<Message> x = list;
      list.remove(p);
      indexedMessages.remove(M.getMessageid());
      notifyItemRemoved(p);
      notifyItemRangeChanged(p, list.size());

// Removing the following items from "x" also causes the elements to be removed from recycleView.
      x.remove(0);
      x.remove(x.size() - 1);
}

我不理解的两件事:

  1. 为什么&#34; x&#34;影响&#34;列表&#34;
  2. 为什么&#34; notifyItemRemoved&#34;再次触发。
  3. 无论如何,在原始&#34;列表&#34; (私人清单),第一个&amp;最后的项目只是占位符。从此列表中删除某个项目时,我想在没有占位符的情况下存储该列表的新副本。

    每次创建适配器时都会添加占位符。

1 个答案:

答案 0 :(得分:3)

在制作本地变量x之前,

制作局部变量x后,

x删除元素后,

因为变量x是对List<Message>类型的对象list的指针/引用。因此,对x的更改将同时应用于list,因为它们都指向同一个对象。

如果要在不影响全局变量的情况下对x进行更改,则必须使x指向新对象并将全局变量的所有内容复制到{{1} }。请注意,这可能是多余的。例如,这将起作用,

x

由于评论中指出的原因,这是多余的,因为

  • 方法完成后局部变量丢失
  • List<Message> x = new ArrayList<Message>(); //modify x here 可以重写为List<Message> x = ArrayList<Message>(),因为可以从List<Message> x = ArrayList<>()推断出对象类型,因此无需重新设置

如果我们有:

List<Message>

我们可以将“a”的内容复制到“b”中,如下所示。

List<String> a = new ArrayList<String>();
a.add("a");
a.add("b");
a.add("c");