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可以理解,我决定折衷一下,并在我的答案中包含这两种推理。祝你好运!