java基本类型选型需严格匹配业务场景:int适用于≤21亿的id或计数器,金融金额须用long或bigdecimal防溢出;float仅限容忍误差场景,货币等必须用bigdecimal或整数单位;包装类应少用,优先原生类型集合与optionalint;字段按宽度降序排列可减少内存对齐浪费。

Java 变量类型选择直接影响数据精度和内存开销,不能只看“够用就行”——小数用 float 可能丢精度,大整数用 int 会溢出,而对象引用滥用则悄悄吃掉堆内存。
基础类型选型:精度与范围必须对齐业务场景
Java 的 8 种基本类型各有明确的取值范围和精度特性,错误选用会导致隐性 bug:
-
整数类型:ID、计数器等非负且不超过 21 亿时可用
int;用户账户余额、订单金额等涉及金融计算必须用long(防溢出)或更稳妥地用BigDecimal(保精度);枚举状态码、数组索引可考虑short或byte(节省内存,但需显式类型检查) -
浮点类型:
float(单精度,约 7 位有效数字)仅适用于图形渲染、传感器原始数据等容忍误差的场景;所有涉及货币、科学计算、配置阈值等需精确比较的场合,一律禁用float/double,改用BigDecimal或整数单位(如“分”代替“元”) -
布尔与字符:
boolean无固定字节大小(JVM 实现相关),勿用于位运算;char是 16 位无符号整数,处理 Unicode 补充字符(如 emoji)时需配合String.codePointAt(),避免用char数组直接遍历
包装类与自动装箱:少用、慎用、懂代价
使用 Integer、Double 等包装类型时,每次赋值、比较、算术运算都可能触发装箱/拆箱,带来性能损耗和空指针风险:
- 集合(
List、Map)必须存对象?优先考虑 Trove、Agrona 等原生类型集合库,或 Java 16+ 的Vector+ 基本类型数组优化路径 - 方法参数/返回值需泛型兼容?若实际调用方 90% 以上传非 null 值,用基本类型 + 显式判空替代
Integer;必要时用OptionalInt等专用容器,比Optional<integer></integer>更省内存 - 缓存陷阱:
Integer.valueOf(127)返回常量池对象,==比较可能意外为 true;但valueOf(128)每次新建对象,==必然 false —— 统一用.equals()或直接比基本值
内存布局与对象瘦身:从字段粒度控制开销
JVM 对象在堆中存储包含对象头、实例数据、对齐填充三部分。字段声明顺序和类型直接影响内存占用:
- 按宽度降序排列字段:
long/double→int/float→short/char→byte/boolean,减少对齐填充浪费。例如:long id; int status; byte flag;比byte flag; int status; long id;少约 4–8 字节/实例 - 合并小布尔字段:多个
boolean可用一个int的位运算管理(如 flags |= 1 boolean 实际占 1 字节,但对齐后常浪费更多) - 延迟加载与弱引用:高频创建但低频访问的附属数据(如日志上下文、预计算结果),用
Supplier<t></t>延迟初始化;缓存类字段若允许被回收,优先用WeakReference或SoftReference,避免内存泄漏
运行时验证与监控:让精度与内存问题暴露在上线前
静态代码无法覆盖所有边界情况,需结合工具主动探测:
- 用
@CheckReturnValue(Error Prone)、@MustBeClosed等注解强制检查关键操作;对数值计算添加断言:assert value.compareTo(expected) == 0 : "Precision loss detected"; - JVM 启动参数加入
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps观察 GC 频率;用 JFR(Java Flight Recorder)录制生产流量,分析对象分配热点(Allocation Profiling)和大对象(> 8KB)生成位置 - 单元测试覆盖极端值:对
int类型输入,必测Integer.MAX_VALUE、Integer.MIN_VALUE、MAX_VALUE + 1(应抛异常或回退);对BigDecimal运算,验证scale和roundingMode是否符合业务约定
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











