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

Java:为什么更改局部变量会影响全局变量的原始副本?,java,android,variables,scope,android-recyclerview,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()); notifyItemR

我试图分配一个全局变量的数据并改变局部变量的数据,但是当我改变局部变量的结构时,全局变量也会改变

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);
}
有两件事我不明白:

为什么x会影响列表 为什么会再次触发notifyItemRemoved。 无论如何,在原始的私有列表中,第一个和最后一个项目只是占位符。从该列表中删除某个项目时,我希望存储该列表的新副本,而不使用占位符

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

在生成局部变量x之前

在生成局部变量x之后

从x中删除元素后

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

如果要在不影响全局变量的情况下对x进行更改,则必须使x指向新对象,并将全局变量的所有内容复制到x中。请注意,这可能是多余的。比如说这个就行了,

List<Message> x = new ArrayList<Message>();
//modify x here
由于评论中指出的原因,这是多余的,因为

方法完成后,局部变量将丢失 List x=ArrayList可以重写为List x=ArrayList,因为对象类型可以从列表中推断出来,所以无需重述它 如果我们有:

List<String> a = new ArrayList<String>();
a.add("a");
a.add("b");
a.add("c");
我们可以将a的内容复制到b中,如下所示

List<String> b = new ArrayList<>(a);

两个变量引用同一个对象。它们只是指向内存位置的指针变量是引用;两个变量都指向同一个对象。@Jeroenvanevel如何将x放在一个新位置上,以使改变x不会改变列表内存位置的数据。用上一个列表的内容创建一个新列表。列表x=新列表是抽象的,不能在那里实例化,&之前我尝试了列表x=新ArrayList,这就变得多余了。@Relm你试过Listx=new ArrayList吗?是的,我之前的评论中有一个输入错误,new ArrayList变得多余了。@Relm你是说创建新列表浪费了多余的空间吗?否则,我可以问一下,如果你不想创建一个新的列表,为什么你需要在不改变全局变量的情况下对局部变量x进行更改?@Relm可以理解,我决定折衷一下,并在我的答案中包含这两种推理。祝你好运!