Java 基本类型优化实用技巧全解析

Java 基本类型优化建议清单

一、优先使用基本类型(primitive)而非包装类型(wrapper)

  • 避免不必要的 装箱(boxing)拆箱(unboxing) 开销。
  • 包装类型会创建对象,占用堆内存,性能更差。
// 差:有装箱
List<Integer> list = new ArrayList<>();
list.add(123);

// 优:使用基本类型数组或第三方集合库
int[] arr = new int[10];

二、根据数据范围选择合适的类型

  • 不要一律用 int 或 long,这样会浪费内存。

类型

字节

数值范围

byte

1

-128 ~ 127

short

2

-32,768 ~ 32,767

int

4

-2^31 ~ 2^31-1

long

8

-2^63 ~ 2^63-1

float

4

~7 位小数精度

double

8

~15 位小数精度

例:状态码/布尔开关可用 byte,不要用 int。


三、使用 final 优化常量值

  • JVM 会对 final 修饰的基本类型做常量折叠优化(constant folding)。
final int MAX_SIZE = 1024;

四、避免在循环中发生装箱操作

  • 装箱不仅性能差,还可能引起潜在内存泄漏。
// 不推荐:每次循环都触发装箱
Integer sum = 0;
for (int i = 0; i < 1000; i++) {
    sum += i;
}

// 推荐
int sum = 0;
for (int i = 0; i < 1000; i++) {
    sum += i;
}

五、谨慎比较浮点数

  • 浮点数存在精度误差,不能直接 == 比较。
// 错误方式
if (a == b) {}

// 正确方式
if (Math.abs(a - b) < 1e-6) {}

六、使用位运算替代某些算术操作(仅限熟悉者)

  • 位运算效率高,可用于:
    • 判断奇偶(n & 1)
    • 乘以 2 的幂(n << k)
    • 除以 2 的幂(n >> k)
// 判断是否为 2 的幂
boolean isPowerOfTwo = (n & (n - 1)) == 0;

七、避免多线程环境下共享非线程安全的基本类型变量

  • int、long 等并非原子操作。
// 非线程安全
int count = 0;

// 推荐:使用原子类
AtomicInteger count = new AtomicInteger(0);

八、数组优化:预分配大小,避免频繁扩容

  • 提高内存效率,降低 GC 压力。
int[] data = new int[10000];

九、合理选择数据结构(配合基本类型使用)

  • Java 集合默认使用包装类型,可用高性能集合库(如 FastUtil、Trove、HPPC)替代。
// Trove 示例
TIntArrayList list = new TIntArrayList();
list.add(10); // 无装箱

十、避免 null 参与基本类型运算(容易抛出 NPE)

Integer a = null;
int b = a + 1; // 报 NullPointerException

BONUS:JVM 内部的优化机制(你不需要做,但值得了解)

  • 逃逸分析:JVM 判断对象是否可以分配在栈上。
  • 标量替换:将对象分解成多个基本字段。
  • TLAB(线程本地分配缓存):加速小对象分配。

总结记忆口诀

“优原生、选适型、避装箱、慎浮点、知并发、善数组。”