数组长度固定、不支持泛型、缺乏内置操作,而集合框架提供标准化实现:ArrayList支持随机访问,HashSet自动去重,TreeSet有序存储,HashMap高效查找,且需注意容量预设、hashCode/equals重写、遍历删除等坑。

因为不用它,你连“存多个学生”都得自己造轮子,还容易出错、低效、难维护。
为什么数组不够用?
Java里最原始的容器是数组,但它有硬伤:
-
int[] scores = new int[5]—— 长度写死,加第6个成绩就ArrayIndexOutOfBoundsException - 没法直接存
Student对象以外的类型(泛型缺失前还得靠Object强转) - 没有内置
contains、remove、sort等操作,每次都要手写循环 - 扩容、去重、按条件筛选……全得你自己实现,而且大概率不如
ArrayList或HashSet快
集合框架到底帮你省了什么?
它不是“多学一个API”,而是把高频数据组织模式标准化、工业化:
- 想按顺序存、支持重复、能用下标查?→ 用
ArrayList(查O(1))或LinkedList(中间删插O(1)) - 要自动去重,且不关心顺序?→
HashSet(依赖hashCode()+equals()) - 既要唯一,又要按成绩排序?→
TreeSet(红黑树,O(log n)插入+有序遍历) - 学生ID查姓名?→
HashMap(平均O(1)查,但key不能为null除非你用ConcurrentHashMap) - 需要保持插入顺序 + 去重?→
LinkedHashSet,一行搞定,不用先new HashSet再转List
新手最容易踩的三个坑
这些不是理论问题,是上线后真会抛异常或内存爆掉的点:
- 用
ArrayList装上万条日志却没预设容量 → 频繁扩容(1.5倍复制数组),CPU飙升;应写成new ArrayList(10000) - 拿自定义类当
HashMap的key,但忘了重写hashCode()和equals()→ 同样内容的两个对象被当成不同key,查不到、删不掉 - 在
for-each循环里调list.remove()→ 立刻ConcurrentModificationException;该用iterator.remove()或list.removeIf(x -> x.isExpired())
集合框架不是“学完就扔”的知识点,它是你每天写if、for、log.info之外,最常打交道的基础设施。选错实现类,可能让接口响应从20ms变成2s;忽略泛型和重写规则,可能埋下线上数据不一致的隐患——这些都不是面试题,是压测报告和监控告警里的真实数字。










