使用LinkedList迭代器未加return导致列表为空的原因咨询
为什么不添加return会导致LinkedList输出为空?
我写了一段Java代码,其中addAndSortElements方法接收LinkedList和String参数,目的是把新增元素按A-Z排序插入列表。但如果不在下面这个代码块里加return,最终输出的列表是空的,想知道原因:
else if(compareResult>0) { iterator.previous(); iterator.add(element); return; // 去掉这行就会出问题 }
完整代码如下:
public class Main { public static void main(String[] args) { LinkedList<String> list=new LinkedList<>(); addAndSortElements(list,"a"); addAndSortElements(list,"b"); addAndSortElements(list,"c"); addAndSortElements(list,"f"); addAndSortElements(list,"d"); System.out.println(list); } private static void addAndSortElements(LinkedList<String> linkedList, String element) { var iterator= linkedList.listIterator(); while (iterator.hasNext()) { String editedElement=element.toLowerCase(); int compareResult=iterator.next().toLowerCase().compareTo(editedElement); if(compareResult==0) { System.out.println("Element is already on the list"); return; } else if(compareResult>0) { iterator.previous(); iterator.add(element); return; // 关键的return } else { } } iterator.add(element); } }
原因解析
当compareResult>0时,说明当前遍历到的列表元素比要插入的元素大,我们通过iterator.previous()回到该元素的前一个位置,调用add完成插入。如果不添加return,会触发以下问题:
- 死循环:插入元素后,迭代器的位置停在新插入元素的后方,此时
iterator.hasNext()仍然为true(因为后面还有未遍历完的元素),循环会继续执行。再次调用iterator.next()会拿到之前的那个大元素,和要插入的元素再次比较,结果还是compareResult>0,于是又执行一次插入操作。这个过程会无限重复,程序陷入死循环,永远走不到System.out.println(list)这行代码。 - 无输出/空输出:因为程序卡死在死循环里,要么永远不会执行打印语句,要么因为长时间循环导致内存溢出、程序被强制终止,最终你看到的“空输出”其实是打印语句根本没被执行。
另外,就算没有触发死循环(比如插入位置是列表末尾),不添加return也会导致同一个元素被重复插入两次:一次是在循环内的插入,另一次是循环结束后执行的iterator.add(element)。
内容的提问来源于stack exchange,提问作者Marko Vasiljevic
相关产品推荐
相关产品推荐

