Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么可以';我是否重新分配传递给静态方法的LinkedList引用?_Java_Reference_Linked List_Parameter Passing - Fatal编程技术网

Java 为什么可以';我是否重新分配传递给静态方法的LinkedList引用?

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

当我从main向这个静态方法传递一个链表并删除重复项时,该列表保持不变。我想这是因为一些奇怪的传递值问题…有人知道为什么吗

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按值传递引用,也就是说,它创建引用的一个副本并将该副本传递给方法。影响此副本的新值不会更改调用方方法中的引用。