Java 为什么可以';我是否重新分配传递给静态方法的LinkedList引用?
当我从main向这个静态方法传递一个链表并删除重复项时,该列表保持不变。我想这是因为一些奇怪的传递值问题…有人知道为什么吗Java 为什么可以';我是否重新分配传递给静态方法的LinkedList引用?,java,reference,linked-list,parameter-passing,Java,Reference,Linked List,Parameter Passing,当我从main向这个静态方法传递一个链表并删除重复项时,该列表保持不变。我想这是因为一些奇怪的传递值问题…有人知道为什么吗 public class LinkedListHelper{ public static <T> void eliminateDuplicates(LinkedList<T> list) { LinkedList<T> temp = new LinkedList<>(); temp.add(list.peek
public class LinkedListHelper{
public static <T> void eliminateDuplicates(LinkedList<T> list)
{
LinkedList<T> temp = new LinkedList<>();
temp.add(list.peekFirst()); //initialize this list with first element
ListIterator<T> itr1 = list.listIterator();
ListIterator<T> itr2 = temp.listIterator();
while(itr1.hasNext())
{
T element = itr1.next();
boolean found = false;
while(itr2.hasNext() && !found)
{
T current = itr2.next();
if(element == current)
found = true;
}
if(!found)
temp.add(element);
itr2 = temp.listIterator();
}
list = temp; //Why does this not work????
}
公共类LinkedListHelper{
公共静态无效消除副本(LinkedList列表)
{
LinkedList temp=新建LinkedList();
temp.add(list.peekFirst());//使用第一个元素初始化此列表
ListIterator itr1=list.ListIterator();
ListIterator itr2=临时ListIterator();
while(itr1.hasNext())
{
T元素=itr1.next();
布尔值=false;
while(itr2.hasNext()&&!找到)
{
T电流=itr2.next();
如果(元素==当前)
发现=真;
}
如果(!找到)
温度添加(元素);
itr2=临时列表迭代器();
}
list=temp;//为什么这不起作用????
}
}要使其工作,不应使用temp变量,而应直接引用list参数。此外,您应该修改参数引用的列表,但不要为参数指定任何值,因为这不会对名为“list”的变量产生任何影响。因为您创建了新的list对象,并且您刚刚为变量
list
指定了一个引用,但原始的list
对象没有改变
在末尾添加,而不是list=temp
list.clear();
list.addAll(tmep);
您还可以使用=
操作符检查对象是否相等。阅读关于equals(Object)
method
智能解决方案:
<T> void eliminateDuplicates(LinkedList<T> list) {
LinkedHashSet<T> set = new LinkedHashSet<T>();
set.addAll(list);
list.clear();
list.addAll(set);
}
void EliminatedReplicates(链接列表){
LinkedHashSet=新LinkedHashSet();
set.addAll(列表);
list.clear();
列表。添加全部(集合);
}
Java中没有像C/C++中的指针那样工作的引用调用。您的参数LinkedList
不是传递给方法的引用变量,而是一个副本。您可以更改数据结构本身(即添加、删除项目等),但不能使引用引用其他列表
相反,试试看
myList=已删除的副本(myList)
实际上,这会更改实际引用。发生这种情况是因为您只有对对象的引用,因此无法在调用程序上更改其实例。尽管如此,您可以尝试删除所有内容并再次添加
list.clear();
list.addAll(temp);
因为Java按值传递引用,也就是说,它创建引用的一个副本并将该副本传递给方法。影响此副本的新值不会更改调用方方法中的引用。