String转基本类型需先校验非null且非空白,否则parseXxx()抛NumberFormatException;基本类型转String优先用String.valueOf(),安全且高效;包装类valueOf()有缓存机制而parseXxx()无。

String转基本类型时,空值和格式错误会直接抛异常
Java中没有自动装箱机制处理字符串到基本类型的转换,所有parseXxx()方法(如Integer.parseInt()、Double.parseDouble())都要求输入非null且格式严格匹配。传入null或像"12a"、" 42 "这类字符串,会立即抛出NumberFormatException。
- 必须先用
str != null && !str.trim().isEmpty()做前置校验 -
Integer.parseInt(" 42 ")会失败,得先trim();但Double.parseDouble(" 3.14 ")可以接受首尾空格(JDK 7+) - 十六进制或负数需显式支持:例如
Integer.parseInt("FF", 16)或Integer.parseInt("-123")
基本类型转String,优先用String.valueOf()而非+""
String.valueOf(x)对所有基本类型和null安全,而x + ""在x为null时变成字符串"null",且涉及临时StringBuilder创建,性能略低。
-
String.valueOf(123)→"123";String.valueOf(null)→"null"(注意:这是字符串"null",不是null引用) -
"" + 123本质是new StringBuilder().append("").append(123).toString(),多一次对象分配 - 对于
boolean,String.valueOf(true)比Boolean.toString(true)更统一,后者不处理null
包装类的valueOf()和parseXxx()行为差异容易混淆
Integer.valueOf("123")内部调用parseInt()再装箱,但缓存了-128~127范围内的Integer实例;而Integer.parseInt("123")只返回int原始值。二者异常行为一致,但返回类型和对象复用逻辑不同。
- 频繁转换小整数(如状态码)时,用
valueOf()可减少对象创建 - 但若后续要比较引用(
==),仅限缓存范围内才可靠:Integer.valueOf(100) == Integer.valueOf(100)为true,valueOf(200) == valueOf(200)为false -
Double.valueOf("1.5")不缓存,每次返回新对象;Double.parseDouble("1.5")永远返回原始double
涉及Locale或进制时,必须显式指定参数
默认解析使用JVM默认Locale,遇到逗号分隔的数字(如德国格式"1.234,56")会失败。同样,八进制或十六进制字符串必须传进制基数,否则按十进制解析。
立即学习“Java免费学习笔记(深入)”;
-
Double.parseDouble("1.234,56")抛异常;应改用NumberFormat.getInstance(Locale.GERMAN).parse("1.234,56").doubleValue() -
Integer.parseInt("1010", 2)→ 10;parseInt("1010")→ 1010(十进制) -
Long.parseLong("FF", 16)合法,但parseLong("0xFF")非法——前缀0x只被Long.decode()识别
valueOf()的缓存边界。别依赖==比较包装类数值,也别把parseXxx()当万能兜底——它不处理null,也不做截断或四舍五入。










