Java 基本类型优化实用技巧全解析
文章标签:
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(线程本地分配缓存):加速小对象分配。
总结记忆口诀
“优原生、选适型、避装箱、慎浮点、知并发、善数组。”