You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中LinkedList的最简遍历方式及两种实现的性能疑问

Java LinkedList遍历与打印问题解答

先看你提供的代码:

public static void main(String[] args) {
    LinkedList<Integer> pres = new LinkedList<Integer>();
    pres.add(112);
    pres.add(114);
    pres.add(326);
    pres.add(433);
    pres.add(119);
// ---------------------------------- METHOD 1 ---------------------------------
    for (int i = 0; i < pres.size(); i++) {
        System.out.print(pres.get(i) + (i == pres.size() - 1 ? "" : ","));
    }

// ---------------------------------- METHOD 2 ---------------------------------
    for (int courseIndex : pres) {
        System.out.print(courseIndex + (courseIndex == pres.getLast() ? "" : ","));
    }
}

针对你的疑问逐一解答:

1. 方法1中pres.get(i)的遍历机制

Java的LinkedList基于双向链表实现,但get(int index)方法每次都会从头或尾开始遍历,不会在上一次的位置继续移动。具体逻辑是:如果索引小于链表长度的一半,就从头部开始遍历到目标索引;如果大于等于一半,就从尾部开始遍历。因此方法1的时间复杂度是O(n²),数据量大时性能会很差。

2. 方法2的foreach与getLast的性能问题

  • foreach循环本质是通过LinkedList的ListIterator实现的,迭代器会维护当前遍历的节点指针,每次移动到下一个节点都是O(1)操作,遍历整个链表的时间复杂度为O(n),确实避免了方法1的O(n²)问题。
  • Java的LinkedList是双向链表,内部维护了first和last两个指针,所以getLast()是O(1)操作,直接返回last节点的元素。但方法2存在逻辑隐患:如果后续链表出现与最后一个元素重复的值(即使当前无重复),会提前停止添加逗号,导致格式错误;另外每次循环调用getLast()虽为O(1),但完全可以提前缓存最后一个元素来减少不必要的调用。

Java中遍历LinkedList的最简方式

如果要实现无重复元素的LinkedList按逗号分隔打印,最简且高效的方式有两种:

方式一:迭代器手动处理逗号(兼容性好)

Iterator<Integer> it = pres.iterator();
if (it.hasNext()) {
    System.out.print(it.next());
    while (it.hasNext()) {
        System.out.print("," + it.next());
    }
}

仅遍历一次链表,时间复杂度O(n),逻辑清晰无冗余判断。

方式二:Java 8+ Stream API(代码最简洁)

System.out.println(String.join(",", pres.stream().map(String::valueOf).toArray(String[]::new)));

利用String.join直接完成拼接,底层采用高效遍历实现,代码极简。


内容的提问来源于stack exchange,提问作者Miles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:30:43