我们在开发过程中,很多时候需要将String类型数据转换成Integer,而比较常用的方式就是--nteger.parseInt(s)、Integer.valueOf(s)与new Integer(),那么他们具体有那些异同呢?
首先我先介绍一下这三种方式的使用方法吧。
Integer.parseInt(s)用法
Integer.parseInt(s)的作用就是把字符串s解析成有符号的int基本类型。
String s1 = "1234"; String s2 = "1234"; int n1 = Integer.parseInt(s1); int n2 = Integer.parseInt(s2); System.out.println(n1 == n2? "Integer.parseInt(s1) == Integer.parseInt(s2)":"Integer.parseInt(s1) != Integer.parseInt(s2)"); ------------------------- Integer.parseInt(s1) == Integer.parseInt(s2)
Integer.valueOf(s)用法
Integer.valueOf(s)把字符串s解析成Integer对象类型,返回的integer 可以调用对象中的方法。
String s = "1234"; Integer integer = Integer.valueOf(s); System.out.println("integer : " + integer); int n1 = Integer.parseInt(s1); int n2 = Integer.parseInt(s2); System.out.println(n1 == n2? "Integer.parseInt(s1) == Integer.parseInt(s2)":"Integer.parseInt(s1) != Integer.parseInt(s2)"); -------------- 1000 Integer.parseInt(s1) == Integer.parseInt(s2)
new Integer(s)用法
Integer i = new Integer("1234"); Integer j = 1234; System.out.print(i == j); ------------------- false
因为 Integer变量 指向的是 java 常量池 中的对象,
而 new Integer() 的变量指向 堆中 新建的对象,两者在内存中的地址不同。
三者的区别
Integer.parseInt(s)多次解析同一个字符串得到的int基本类型数据是相等的,可以直接通过“==”进行判断是否相等。
ps: int是基本类型,不含有equals方法,所以只能用“==”比较,基本类型用“==”比较的是两个值的大小。
Integer.valueOf(s)多次解析相同的一个字符串时,得到的是Integer类型的对象,得到的对象有时是同一个对象,有时是不同的对象,要根据把s字符串解析的整数值的大小进行决定:如果s字符串对应的整数值在 -128~127之间,则解析出的Integer类型的对象是同一个对象;如果s字符串对应的整数值不在-128~127之间,则解析出的Integer类型的对象不是同一个对象。
ps:不管对象是否相等,对象中的value值是相等的。
new Integer(s) s字符串对应的整数值在-128到127之间,可时直接从常量池获取;s字符串对应的整数值不在-128~127之间需要在堆内存开辟一块空间存储该值,取值的时候根据栈中地址映射到堆内存中。
ps:当s字符串对应的整数值为1000,不在-128~127之间,通过Integer.valueOf(s)、new Integer(s)解析出的两个对象i1和i2是不同的对象,对象中的value值是相同的。
三者的联系
Integer.parseInt(s)是把字符串解析成int基本类型,Integer.valueOf(s)和new Integer(s)是把字符串解析成Integer对象类型,其实int就是Integer解包装,Integer就是int的包装,在jdk8中已经自动实现了自动解包装和自动包装,所以两种方式都能得到想要的整数值。
结束语
当我们需要的是一个基本类型int 的时候我们需要使用Integer.parseInt()
函数
当我们需要的是一个Integer对象类的时候我们就是用Integer.valueOf()
函数,new Integer()的方式我个人不是很喜欢。
当我们确定需要转换的数值范围在-127~128,最好选择Integer.parseInt(),当然选择int和Integer接收是没有任何关系的。