Java基本数据类型易踩坑,关键在理解边界:金额用BigDecimal或long(分),避免float/double精度问题;大数用long防溢出;包装类比较用equals()或Objects.equals();char与byte勿强转;泛型须用包装类,注意NPE。

Java 基本数据类型看着简单,但实际开发中翻车最多的地方往往就藏在这里。不是语法写错,而是类型选错、用错、混用,结果不报错却出错——比如金额变 19.899999999、订单号突然变负数、字符串比较永远 false。避开这些坑,关键不是死记硬背,而是理解每种类型“能干什么、不能干什么、在哪容易断”。
别拿 float/double 做精确计算
浮点类型天生不精确,因为它们用二进制表示十进制小数,很多常见小数(如 0.1)根本无法精确存储。
- 金额、价格、金融类数值,一律用 BigDecimal 或整型(如用“分”为单位的 long)
- 避免写
double price = 19.90 - 0.01;,结果可能不是 19.89 - 如果只是科学计算或对精度要求不高(如图形渲染、物理模拟),float/double 可用,但别用于业务判断
int 不是万能整数,long 才是长期选择
int 最大值是 2147483647,超了就静默溢出成负数——不抛异常,只给错结果。
- 订单号、用户ID、时间戳(毫秒)、文件大小(>2GB)、高并发计数器,优先用 long
- 数据库主键若用自增 bigint,Java 端必须对应 long,否则取值错误
- 注意:
int a = 1000000000; int b = a * 3;会溢出;改用long b = (long) a * 3;防止中间计算溢出
== 和 equals 别混,尤其在包装类上
基本类型用 == 比较值没问题;但 Integer、Long 等包装类,== 比的是引用地址,不是数值。
立即学习“Java免费学习笔记(深入)”;
- 永远用 equals() 比较包装类数值(如
Integer a = 127; Integer b = 127; a.equals(b)) - 注意缓存陷阱:-128 ~ 127 的 Integer 会复用对象,所以
a == b偶尔为 true,但超出范围就 false,行为不稳定 - 更安全写法:
Objects.equals(a, b),自动处理 null,也兼容基本类型和包装类
char 不是 byte,字符流和字节流别乱转
char 是 16 位 Unicode 字符单元(UTF-16),byte 是 8 位有符号整数。直接强转会丢数据。
- 别写
os.write((byte) '中')—— 中文会变成乱码,因为只取低 8 位 - 涉及文本 I/O,统一用 Reader/Writer(如
InputStreamReader指定 UTF-8) - 需要操作单个字符时,用 char 完全没问题;但要存到文件或网络,必须经过正确编码转换
泛型里不能用基本类型,得靠包装类
Java 泛型擦除后只认引用类型,int、boolean、char 等基本类型不能直接当泛型参数。
- 错误:
List<int> nums = new ArrayList();</int>→ 编译失败 - 正确:
List<integer> nums = new ArrayList();</integer>,JVM 自动装箱拆箱 - 注意 NPE 风险:
Integer x = null; int y = x;会触发自动拆箱,抛 NullPointerException - 建议:方法入参/返回值尽量用基本类型(性能好),集合/泛型场景用包装类
这些误区背后其实就一条主线:基本类型存值、轻量、高效,但没对象能力;包装类有方法、可空、能泛型,但带开销和陷阱。清楚边界,按场景选,比记住所有规则更管用。



















