You need to enable JavaScript to run this app. Java自定义集合filter方法适配不同Predicate时运行结果异常
优惠活动
大模型
产品
解决方案
定价
更多

Java自定义集合filter方法适配不同Predicate时运行结果异常

问题根源定位

你遇到的不同过滤条件下结果不一致,完全是遍历逻辑设计巧合导致的假异常,和Predicate判断逻辑无关,核心bug出在自定义filter方法上。

核心问题点

  • 循环存在双重指针跳步:for循环本身已经在每轮迭代末尾执行item = item.next完成节点后移,但循环体中在判断删除逻辑后,又手动执行了一次item = item.next,相当于每轮循环要连续跳过两个节点,遍历的停靠位置完全错位。
  • 这种错位遍历刚好和你测试的场景形成了巧合的结果差:
    1. 当过滤条件为x->x%2==0(删除偶数元素)时,错位遍历的停靠节点,刚好依次对应链表上所有值为偶数的元素,这些元素全部被正常移除,最终留下全量奇数,结果看似符合预期——本质是巧合,不是逻辑正确。
    2. 当过滤条件替换为x->x%2==1(删除奇数元素)时,错位遍历的停靠节点,刚好依次对应链表上所有值为偶数的元素,这些节点不满足删除条件,remove方法从头到尾一次都没被调用,整个链表没有任何改动。而你的测试代码只循环输出前10个节点,自然会直接输出原链表的前10个值0-9,和你观察到的异常表现完全匹配。

链表操作的额外隐患

哪怕修正了双重跳步的问题,你当前的边遍历边删除逻辑也不符合链表操作规范:

  • 被remove移除的节点,往往会在方法内部清空自身的next引用帮助GC,此时再依赖被删节点的原有next引用做遍历跳转,很容易触发空指针。常规的链表遍历删除实现,需要引入前置节点引用,删除当前节点时直接将前置节点的next指向当前节点的next,全程不依赖被删节点的原有引用完成跳转,稳定性更高。

内容的提问来源于stack exchange,提问作者alex.zxg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 15:06:00