用泛型集合配合迭代器实现不依赖下标的检索,核心是放弃索引思维、转为“状态驱动”的逐个探查,通过while+hasnext/next稳定单向推进,保障类型安全且适配各类集合结构。

用泛型集合配合迭代器实现不依赖下标的检索,核心是放弃索引思维,转为“状态驱动”的逐个探查。它不关心元素在哪儿,只关心“下一个是否存在”“它是否匹配”。这种做法天然适配无序、无下标结构(如 HashSet、LinkedHashSet),也避免了 ArrayList 中因删除导致的下标偏移问题。
泛型保障类型安全,但不改变检索逻辑
声明 Iterator<string></string> 或 Iterator<document></document> 的意义在于编译期校验——你取出来的一定是 String 或 Document,不用手动强转,也不会在运行时因类型错乱崩溃。但它不影响底层怎么走:迭代器仍按内部指针顺序推进,泛型只是契约,不是加速器。
- 泛型声明要与集合一致,比如
Set<user> users = new HashSet(); Iterator<user> it = users.iterator();</user></user> - 避免裸类型(
Iterator),否则后续it.next()返回 Object,还得强转,失去泛型价值 - 泛型不解决性能问题;若需快速查找,仍得靠索引(如 HashMap 的 key 查找)或倒排结构,而非仅靠泛型+迭代器
用 while + hasNext/next 实现稳定单向推进
这是最稳妥、最符合迭代器设计意图的写法。它不预估集合大小,不依赖 size(),也不假设底层是数组还是哈希表,完全由迭代器自身状态控制流程。
- 每次循环只做三件事:调
hasNext()判断 → 为 true 才调next()取值 → 处理该值(打印、比对、收集) - 即使集合为空,
hasNext()直接返回 false,循环体一次都不执行,不会抛异常 - 不要用 for 循环模拟,例如
for (int i = 0; i ——这本质仍是索引依赖,且对 Set 不适用
检索中支持提前终止与安全过滤
平滑检索不只是“全扫一遍”,而是能根据业务需要灵活中断或剔除。关键在于把判断逻辑放在 next() 之后、本轮循环结束前。
- 找第一个匹配项:取到元素后立即
if (item.equals(target)) { found = item; break; } - 批量移除符合条件的元素:必须用
it.remove(),绝不能调collection.remove(item),否则触发ConcurrentModificationException - 跳过某些元素:不调
remove(),也不做处理,直接进入下一轮循环即可;迭代器指针已在next()时自动推进
避免几个典型误操作
这些错误看似微小,却极易引发运行时异常,且调试困难。
- 没调
hasNext()就直接next()→ 抛NoSuchElementException - 连续两次调
next()而中间没再判hasNext()→ 可能越界或取到 null - 在
hasNext()返回 false 后还试图next()→ 必然异常 - 对同一
next()结果调多次remove()→IllegalStateException - 迭代器用完后想重用 → 不行,必须重新获取:
it = collection.iterator();











