Java集合选型需匹配访问模式:ArrayList适合随机查ID和顺序遍历,LinkedList仅适用于频繁首尾增删;HashMap查ID必须重写equals/hashCode;多线程应选ConcurrentHashMap或CopyOnWriteArrayList;避免for-each中remove及O(n)contains。
Java集合框架不是万能容器,选错类型或误用方法会导致数据不一致、性能骤降甚至并发异常——关键不在“能不能存”,而在“该用哪个存、怎么存才安全高效”。
ArrayList 还是 LinkedList?看操作模式再决定
用户数据通常按插入顺序遍历或随机查ID,ArrayList 是默认首选;只有频繁在列表头部增删(比如消息队列回滚场景),才考虑 LinkedList。
-
ArrayList的get(int index)是 O(1),但remove(int index)平均要移动后续元素,O(n) -
LinkedList的addFirst()和removeLast()是 O(1),但get(int index)需遍历,O(n) - 别只看“链表适合增删”的笼统说法——用户列表极少在中间插入,更常见的是批量查、单点删ID,
ArrayList实际更稳
HashMap 存用户ID→User,但别忘了重写 equals 和 hashCode
用 HashMap 按ID快速查用户没问题,但如果 User 类没重写 equals() 和 hashCode(),哪怕两个对象字段完全相同,map.get("u1001") 也可能返回 null。
- IDE 自动生成的
equals()和hashCode()要确保覆盖所有业务判等字段(如userId,而非name或email) - 若用 Lombok,确认加了
@EqualsAndHashCode(of = "userId"),而不是默认全字段参与 - 测试时故意 new 两个相同ID的
User,验证map.containsKey()和map.get()行为是否符合预期
多线程修改用户列表?别直接用 ArrayList 或 HashMap
多个线程同时调用 list.add() 或 map.put(),即使加了同步块,也掩盖不了底层非线程安全的事实——可能抛 ConcurrentModificationException,或静默丢失数据。