选对集合类型可显著降低java内存占用:查多用arraylist,删多且非尾部才考虑linkedlist;去重用hashset,慎用treeset;高并发优先concurrenthashmap;务必预估大小并显式指定初始容量。

选对集合类型,是降低 Java 内存占用最直接、见效最快的方式之一。它不只是“快不快”的问题,更直接影响对象头、数组扩容、哈希桶数量等底层内存开销。
看操作特征:查得多就用 ArrayList,删得多就用 LinkedList
ArrayList 底层是动态数组,每个元素连续存放,没有额外指针开销;而 LinkedList 每个节点要存前后两个引用(共 16 字节,64 位 JVM),内存占用明显更高。哪怕只存 1 万个字符串,LinkedList 的对象数多出一倍,GC 压力和堆内存占用都会上升。
- 随机访问(如
get(i))、遍历为主 → 优先 ArrayList - 频繁在头部/中间增删(非尾部)→ 才考虑 LinkedList;但多数场景其实用 ArrayList + 尾部操作或重建列表更省内存
看数据唯一性:去重用 HashSet,排序用 TreeSet(但慎用)
HashSet 底层复用 HashMap,只存 key,结构紧凑;TreeSet 底层是红黑树,每个节点含颜色标记、左右子节点、父节点等字段,单个对象体积大、内存碎片多。同样存 10 万个字符串,TreeSet 占用内存通常是 HashSet 的 2–3 倍。
- 只需判重、无序 → HashSet(记得设初始容量,避免多次扩容)
- 真需要有序迭代且不能接受外部排序 → 再用 TreeSet;否则建议用 HashSet +
new ArrayList(set).sort()
看并发需求:高并发读写优先 ConcurrentHashMap
用 HashMap 配合 Collections.synchronizedMap() 或手动加锁,虽线程安全,但锁粒度粗、吞吐低,还容易因锁竞争导致线程阻塞——间接拉高 GC 频率和内存驻留时间。ConcurrentHashMap 分段锁(或 JDK8+ 的 CAS + 红黑树)不仅性能好,内存布局也更紧凑,扩容更平滑。
- 多线程环境下的缓存、计数器、会话映射 → 直接上 ConcurrentHashMap
- 如果只是偶尔读写、线程数少(≤3),且已有同步控制 → 普通 HashMap 仍可接受
控容量:预估大小,显式指定初始容量
ArrayList 默认容量 10,HashMap 默认初始容量 16、负载因子 0.75 —— 这意味着存 13 个元素就会触发首次扩容。每次扩容都要新建数组、复制老数据,既耗 CPU 又临时多占一倍内存。大数据量下,这会成倍放大内存峰值。
- ArrayList:知道大概条数,比如 5000 条日志 →
new ArrayList(5120)(按 1.2 倍预留) - HashMap/HashSet:预计存 8000 个用户 ID → 初始容量设为
10240(≥ 8000 / 0.75),避免 rehash
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











