Java数据类型转换:String.valueOf(i)与Integer.toString(i)的区别、最佳实践及疑问
Hey 朋友!咱们逐个拆解你的问题,讲得明明白白:
1. String.valueOf(i) 和 Integer.toString(i) 有啥区别?
得分两种情况看:
- 当
i是基本类型int时:两者完全等价!你去翻JDK源码就会发现,String.valueOf(int)底层直接调用的就是Integer.toString(int),功能上没任何差异,选哪个全看你觉得哪个读起来更顺。 - 当
i是包装类Integer对象时:差异就明显了:String.valueOf(Integer i)能安全处理null:如果i是null,它会返回字符串"null",不会报错;Integer.toString(Integer i)遇到null会直接抛NullPointerException——因为它会先把Integer拆箱成基本类型int,而拆箱null包装类肯定会触发异常。
2. 数据类型转换的最佳实践(以整数↔字符串为例)
整理几个实用原则:
- 安全处理
null:如果你要处理的Integer可能为null,优先用String.valueOf(),避免莫名其妙的空指针异常; - 语义明确优先:如果是确定非空的基本类型
int,用Integer.toString()更直观,一看就知道是把整数转成字符串; - 格式化需求用专用方法:
- 需要转成二进制、十六进制等其他进制?用
Integer.toString(int i, int radix),比如Integer.toString(42, 2)会得到"101010"; - 需要补前导零或复杂格式化?用
String.format(),比如String.format("%03d", 5)会得到"005";
- 需要转成二进制、十六进制等其他进制?用
- 避免不必要的装箱拆箱:手里是基本类型
int就直接传参,别先包装成Integer,既能省点小开销,代码也更清爽; - 字符串转整数的反向操作:要基本类型
int就用Integer.parseInt(String s),要包装类Integer就用Integer.valueOf(String s)——记得用try-catch包裹,处理字符串不是有效整数时的NumberFormatException。
3. “valueOf()是String类的静态方法”这句话到底啥意思?
先搞懂静态方法:静态方法属于类本身,而不是类的某个实例。也就是说,你不需要先创建一个String对象(比如new String("你好")),直接通过类名就能调用valueOf()——也就是String.valueOf(123)这种写法。
对比一下非静态(实例)方法,比如String.substring(int start):要调用这个方法,你必须先有一个具体的String实例,比如"你好呀".substring(1)是对的,但String.substring(1)就会报错——因为这个方法属于某个具体的字符串对象,而不是String这个类本身。
所以这句话的意思就是:
valueOf()是绑定在String类上的工具方法,不属于任何单个字符串实例;- 调用它的方式是
String.valueOf(...),而不是通过某个String对象去调用; - 它的作用是把各种类型(整数、布尔值、对象等)转成字符串,而且不需要先创建
String实例就能用。
内容的提问来源于stack exchange,提问作者Ayesha Fernando
相关产品推荐
相关产品推荐

