基本数据类型节省内存的核心在于避免封装、减少冗余、贴近硬件布局;它们无对象头、无引用跳转、无GC跟踪,天然轻量,关键在于用对场景——如用int[]替代List<Integer>可省内存数倍,禁用隐式装箱,按需选型(byte/short代替int)、紧凑字段排列、平行数组替代对象数组。

基本数据类型节省内存的核心在于“避免封装、减少冗余、贴近硬件布局”。它们不带对象头、无引用跳转、无GC跟踪,天然轻量——关键是怎么用对、用足。
用原生数组替代包装类集合
Java 中 int[] 比 List<Integer> 节省内存数倍:前者连续存 4 字节整数;后者每个 Integer 是独立堆对象(至少 16 字节),还附带 ArrayList 的容量数组和 size 字段。大数据统计、索引映射、滑动窗口等场景,直接声明 int[] counts = new int[1000000],比反复 add() 到 ArrayList 快且稳。
- 数据库批量读取数值字段时,用
ResultSet.getInt()配合预分配long[],别转成List<Long> - 禁用
Arrays.asList(new int[]{...})——它返回的是List<int[]>,不是你想要的,并可能触发意外装箱 - 排序、求和、去重等操作优先调用
Arrays.sort()、IntStream.sum(),而非先转集合再 stream
精简类型宽度与对齐填充
不盲目用 long 存 ID、不用 double 存金额。一个 int(4 字节)能覆盖 21 亿范围,足够多数业务主键或计数器;货币统一转为 long 存“分”,避免 double 的精度误差和 8 字节开销。Python 中同理:pd.read_csv(dtype={'user_id': 'int32', 'score': 'int16'}) 可比默认 int64 减少一半以上内存。
- 字符串高频重复字段(如状态码、地区名)改用
category类型(Pandas)或枚举索引(Java 枚举 +int[]映射) - 布尔值在 Java 中用
boolean[],别用Boolean[]或List<Boolean>;Python 中用pd.array(..., dtype="boolean")或 NumPybool_ - 注意 JVM 对齐规则:两个
byte不会压缩成 2 字节,常因对齐补到 4 或 8 字节;紧凑结构优先用int、long等自然对齐类型
规避隐式装箱与中间对象爆炸
循环中写 list.add(i)(i 是 int)会自动装箱;Stream.of(1,2,3) 本质是 Stream<Integer>;for-each 遍历 Integer[] 也会拆箱再装箱。这些操作在百万级循环里等于凭空创建百万对象。
- 用传统
for (int i = 0; i < arr.length; i++)替代for (Integer x : list) -
Stream处理基本数组必须用Arrays.stream(intArr)得到IntStream,而非Stream.of(intArr) - 聚合运算直接调
IntStream.average()、LongStream.max(),别走stream.mapToInt(x -> x).average()这种多层包装路径
结构扁平化:多个平行数组胜过对象数组
算法中需维护节点状态(坐标、访问标记、距离值)时,别定义 Node[] nodes = new Node[n]。每个 Node 至少含对象头 + 3 个字段 + 对齐填充,总开销远超三个独立 int[]。
- 改成
int[] x, int[] y, boolean[] visited, int[] dist,内存连续、缓存友好、GC 压力归零 - 回溯/DFS 中临时状态可复用同一组数组,用下标推进,避免 new 对象
- 如果逻辑强耦合,可用静态内部类只含 final 基本字段,但依然不如平行数组极致


















