List的“有序”指插入顺序而非自然排序,支持重复元素;ArrayList基于数组实现O(1)随机访问,LinkedList基于链表实现O(n)索引查找;遍历时修改必须用Iterator.remove()避免ConcurrentModificationException。

直接上手做综合实战项目,关键不是堆功能,而是把泛型、集合、迭代器三者协同的逻辑跑通——类型定得准、结构选得对、遍历走得稳。
明确业务场景,反推集合类型
别一上来就写 ArrayList。先问清楚数据要怎么用:
- 要按插入顺序遍历且偶尔查下标 → 用 ArrayList<String>
- 要快速去重、不关心顺序 → 用 HashSet<User>(记得重写 User 的
equals和hashCode) - 要边遍历边安全删元素 → 必须用 Iterator<Order> 配合
it.remove(),不能调list.remove(obj) - 要保留插入顺序又去重 → 选 LinkedHashSet<Product>
泛型声明必须全程一致
泛型不是“写一次就完事”,它要贯穿声明、创建、遍历三个环节:
- 声明:
Set<Book> bookshelf = new HashSet<>(); - 获取迭代器:
Iterator<Book> it = bookshelf.iterator();(不能写成Iterator it,否则next()返回Object,还得强转) - 遍历中取值:
Book b = it.next();—— 编译期就锁死类型,运行时不会因类型错乱崩溃
如果泛型断在某一处,比如用裸 Iterator,后面所有类型安全都归零。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
用 while + hasNext/next 做主干遍历
这是最可控、最通用的写法,适配所有 Collection 子类(List、Set、Queue):
- 不依赖
size(),也不假设底层是数组还是哈希表 - 空集合时
hasNext()直接返回false,循环体一次都不执行,不会抛异常 - 每轮只做三件事:
hasNext()判断 →next()取值 → 处理该值 - 找第一个匹配项?取到后
break即可;批量过滤?在处理逻辑里加if判断,不满足就跳过
结合真实小需求练闭环
比如做一个「订单状态检查」小模块:
- 定义
List<Order>存订单,Order含id、status(枚举)、amount - 用迭代器遍历,找出所有
status == PENDING且amount > 500的订单 - 对这些订单调用
it.remove()移出待处理队列(注意:不是orders.remove(order)) - 最后打印剩余订单数 —— 这就串起了泛型约束、集合选择、迭代器安全删除三个要点
不复杂但容易忽略细节,真正动手写一遍比看十篇理论更管用。

















