java基本数据类型是内存中的实在存在,用对可省资源避bug,用错会导致计算失准、npe或溢出崩溃;需按场景选型:时间戳等用long,io处理用byte,布尔标记数组宜用byte[]配合位运算,浮点数禁用于金额而须用bigdecimal,char与boolean不可与数字类型互转,避免自动装箱引发的缓存与npe风险。

按场景选对整数类型,别让int成性能瓶颈
日常计数、循环变量、数组下标用int足够,它在32位和64位JVM上都是4字节,访问快、兼容好。
但以下情况必须换类型:
-
时间戳、订单ID、大文件大小:用long,且字面量加
L后缀(如1625097600000L),避免编译器误判为int溢出 - 网络/IO字节流处理:用byte,比如读取图片头、解析协议包,能省75%内存(相比int)
- 百万级数组缓存状态:如布尔标记数组,用byte[ ]代替boolean[ ](后者JVM实际可能按字节对齐填充),再配合位运算压缩,可降内存8倍
浮点数不用于金额,double也不行
float/double底层是二进制IEEE 754表示,无法精确存储0.1、0.01这类十进制小数。代码0.1 + 0.2 == 0.3结果为false,这是根源性限制。
金融、计费、库存扣减等场景必须用BigDecimal,且注意两点:
- 构造时用
new BigDecimal("19.99")字符串,绝不用new BigDecimal(19.99)(后者先经double转码,已失真) - 除法必须指定
scale和RoundingMode,如divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP)
char和boolean不是“小int”,别乱转型
char是无符号16位整数(0~65535),本质是Unicode码点,不是“字符对象”。它和short虽同占2字节,但char c = 'A'; short s = c;会编译报错——Java禁止隐式转,因语义不同(字符 vs 有符号数)。
boolean更特殊:JVM规范未规定其具体字节数,实际中可能是1位、1字节甚至4字节(取决于实现与对齐),它不能和任何数字类型互转,连(int)true都不合法。开关状态就用if (flag) { ... },别写status == 1这种C风格伪码。
自动装箱拆箱看着方便,实则埋雷
写Integer a = 100; Integer b = 100; System.out.println(a == b);输出true;但换成128就输出false——因为IntegerCache只缓存-128~127。
实战中要避开这些坑:
- 比较用
.equals(),不用==(除非确定是基本类型或缓存内小整数) - 方法参数接收Integer时,先判
null,否则拆箱int i = obj;直接NPE - 高频循环里少用包装类,如
for (Integer i : list)比for (int i : primitiveArray)多对象创建和GC压力
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











