应根据语义和场景选择:需对象(如集合、泛型)用Integer.valueOf(),需基本类型数值计算用parseInt();金融计算必须用BigDecimal(String);判等须注意NaN和跨类型比较陷阱。

Integer.valueOf() 和 Integer.parseInt() 到底该用哪个?
二者都用于字符串转整数,但语义和异常行为完全不同:Integer.valueOf() 返回 Integer 对象(会走缓存),Integer.parseInt() 返回基本类型 int。关键区别在于空值和异常处理:
-
Integer.valueOf(null)直接抛NullPointerException -
Integer.parseInt(null)抛NumberFormatException -
Integer.valueOf("123")可能复用缓存对象(-128 ~ 127 范围内),而parseInt总是返回新计算的int - 如果后续要调用
.equals()或传入泛型集合,优先用valueOf();若明确只需要数值计算,parseInt()更轻量
Double.parseDouble() 在科学计数法下容易忽略的精度陷阱
Double.parseDouble("1.2345678901234567e10") 看似无害,但 double 本身只有约 15~17 位有效数字,超出部分会被静默舍入。这不是 bug,而是 IEEE 754 的固有限制:
- 不要用
Double做精确金融计算——哪怕输入是字符串形式的“100.00”,转成double后可能变成99.99999999999999 - 需要精确小数时,必须用
BigDecimal(String)构造器,绝不能用new BigDecimal(double) -
Double.parseDouble("NaN")、"Infinity"是合法的,会分别返回对应特殊值,但多数业务逻辑未做防御性判断
Apache Commons Lang 的 NumberUtils 为什么比原生更实用?
原生 API 缺少安全兜底,而 NumberUtils 提供了大量防崩操作:
瑞宝通B2B系统使用当前流行的JAVA语言开发,以MySQL为数据库,采用B/S J2EE架构。融入了模型化、模板、缓存、AJAX、SEO等前沿技术。与同类产品相比,系统功能更加强大、使用更加简单、运行更加稳 定、安全性更强,效率更高,用户体验更好。系统开源发布,便于二次开发、功能整合、个性修改。 由于使用了JAVA开发语言,无论是在Linux/Unix,还是在Windows服务器上,均能良好运行
-
NumberUtils.toInt("abc", 0)—— 解析失败时返回默认值,不抛异常 -
NumberUtils.createInteger(" 42 ")自动 trim 并处理空白,原生parseInt会直接报错 -
NumberUtils.isCreatable("12.34")可预检字符串是否可转为任意数字类型(包括浮点),避免 try-catch 泛滥 - 注意:它对
null输入默认返回null(对象方法)或0(primitive 方法),行为需查文档确认,不是完全“零配置安全”
Integer 和 Double 的 equals() 比较为什么经常出错?
这是最隐蔽的坑:自动拆箱 + 缓存机制混合导致非对称行为。
立即学习“Java免费学习笔记(深入)”;
Integer a = 100; Integer b = 100; System.out.println(a.equals(b)); // true —— 缓存内同一对象 Integer c = 200; Integer d = 200; System.out.println(c.equals(d)); // true —— equals 比较的是数值,不是引用 Double e = 1.0; Double f = 1.0; System.out.println(e.equals(f)); // true Double g = Double.NaN; Double h = Double.NaN; System.out.println(g.equals(h)); // false —— NaN.equals(NaN) 定义为 false!
-
Integer在 -128 ~ 127 范围内用缓存,但equals()仍按数值比较,所以不会出错 -
Double.equals()对NaN特殊处理:永远返回false,哪怕两个都是NaN - 跨类型比较如
new Integer(1).equals(new Double(1.0))永远是false(类型不同,不尝试转换) - 判等务必先明确语义:是数值相等?还是对象身份?还是允许误差的浮点近似?
NaN 的显式校验和 BigDecimal 的构造方式。这两个点一旦出问题,往往出现在生产环境的边缘 case 里,日志还不容易暴露。









