Java基本类型是硬件友好写法,因其为内存“裸值”,无对象头、不走GC、不占堆,大小精确固定:byte(1字节)、short/char(2字节)、boolean常按1字节对齐;需避免装箱、关注溢出与浮点精度、对齐缓存行以提升性能。

直接用对基本类型,就是最硬核的硬件友好写法。Java基本类型在内存中是“裸值”,不带对象头、不走GC、不占堆——它们贴着CPU寄存器和RAM物理边界运行,是离硬件最近的Java表达方式。
看清每1字节在RAM里怎么躺
Java基本类型大小由JVM规范强制固定,不是“大约”,而是精确到字节的物理映射:
-
byte(1字节):刚好填满一个内存地址单元,适合状态标志、协议字节、索引偏移——比如用
byte status = 1;代替int,省下3字节;在百万级数组中,能少占3MB纯物理内存 -
short(2字节):覆盖-32768~32767,足够存年龄、HTTP状态码、小范围ID——比
int省一半空间,且现代CPU对16位整数运算无性能折损 -
char(2字节):本质是无符号16位整数,可当小整数用(如计数器),避免自动提升为
int带来的隐式转换开销 -
boolean(JVM未规定具体字节,但实际存储常按1字节对齐):别用它存大量开关量;高密度场景改用
byte[]或位运算(int flags+&/|操作),单个int可管32个布尔状态
避开自动装箱——让值 stays on stack
包装类(如Integer)不是基本类型,它是对象:至少24字节(64位JVM),含16字节对象头+4字节字段+4字节对齐填充。一旦出现在泛型、集合、方法参数中,就触发装箱,把栈上轻量值拖进堆里,还增加GC压力。
- 循环中不用
for (Integer i : list)遍历Integer列表,改用原始数组:int[] data+ 普通for,避免每次迭代都拆箱 - Map键值不用
HashMap<integer string></integer>存小范围ID,考虑Object[]或int[]配合自定义查找逻辑——尤其在实时系统或嵌入式JVM中 - 函数参数能用
long就不用Long,返回值同理;接口设计优先暴露原始类型API
运算时盯紧溢出与精度的物理边界
基本类型运算不报错,但结果可能翻转或失真——这是CPU ALU的真实行为,不是Java缺陷,而是你需要承接的硬件事实。
立即学习“Java免费学习笔记(深入)”;
-
int加法溢出后变成负数(补码翻转),若业务需饱和运算(如音量调节),得手动判断:if (val > Integer.MAX_VALUE - delta) val = Integer.MAX_VALUE; - 浮点运算是近似计算:
float只有6~7位有效数字,double约15位;金融计算必须用BigDecimal或定点整数(如金额存“分”为long) - 除法注意零除:
int/0抛ArithmeticException,但float/0.0f得Infinity——后者不中断执行,适合信号处理等连续计算场景
数组与缓存行对齐——让CPU预取更高效
CPU从内存读数据不是按字节,而是按缓存行(通常64字节)。如果一个long[8]数组刚好占64字节,一次加载就能取完;若因对象头或填充错位,可能跨两行加载,吞吐减半。
- 密集数值计算优先用原始类型数组:
double[]比List<double></double>快5~10倍,且内存连续,利于SIMD指令(如Vector API)加速 - 避免“假共享”(False Sharing):多个线程频繁修改同一缓存行内的不同
long变量(如计数器),会引发总线震荡;可用@Contended注解(需开启-XX:-RestrictContended)或手动填充隔离 - 批量处理时,按64字节对齐分配——例如用
Unsafe.allocateMemory(64 * n)做极致控制(仅限底层框架)


















