本篇介绍下在JAVA开发过程中,字符串和数字之间的转换使用方法,包括原生方法转换和三方工具。
顺便说下,我更喜欢使用三方的工具,更方便些。
一、字符串转数字。
1.先来看看原生方法的使用,包括parseXXX
和valueOf
两种。
先来看看代码:
String str = "1234"; /**字符串转Integer,可以制定进制**/ //十进制转换,底层是默认传入10进制 Integer intResult1 = Integer.parseInt(str); Integer intResult2 = Integer.valueOf(str); //指定进制转换 Integer intResult3 = Integer.parseInt(str, 10); Integer intResult4 = Integer.valueOf(str, 10); /**字符串转Long,可以制定进制**/ //十进制转换,底层是默认传入10进制 Long longResult1 = Long.parseLong(str); Long longResult2 = Long.valueOf(str); //指定进制转换 Long longResult3 = Long.parseLong(str, 10); Long longResult4 = Long.valueOf(str, 10); /**字符串转Double和Float,注意没有带进制的参数,默认十进制**/ Double doubleResult1 = Double.parseDouble(str); Double doubleResult2 = Double.valueOf(str); Float floatResult1 = Float.parseFloat(str); Float floatResult2 = Float.valueOf(str);
原生方法虽然很简洁,但是不会catch异常,也就是说如果传入一个非数字的字符串,会直接抛异常,所以我喜欢用三方的。
2.三方sdk的使用,我经常使用的是commons-lang包里的。
首先pom引入commons-lang依赖,代码如下:
<dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency>
然后使用时也很简单,不过注意,目前只支持默认的10进制。
String str = "1234"; /**无论是哪种数字类型,都有两种方法,如果输入第二个参数,代表默认值,及如果转换失败,会返回默认值**/ //默认值是0 Integer integerResult1 = NumberUtils.toInt(str); Long longResult1 = NumberUtils.toLong(str); Double doubleResult1 = NumberUtils.toDouble(str); Float floatResult1 = NumberUtils.toFloat(str); //指定默认值 Integer integerResult2 = NumberUtils.toInt(str, -1); Long longResult2 = NumberUtils.toLong(str, -1L); Double doubleResult2 = NumberUtils.toDouble(str, -1D); Float floatResult2 = NumberUtils.toFloat(str, -1F);
其实底层逻辑比较简单,就是catch exception
,然后返回默认值,相当于多一层封装吧,如果不想用三方的,自己也可以写util
方法。
下面是NumberUtils.toInt
的底层代码:
public static int toInt(String str, int defaultValue) { if (str == null) { return defaultValue; } else { try { return Integer.parseInt(str); } catch (NumberFormatException var3) { return defaultValue; } } }
二、数字转字符串。
这里其实也有两种方法,但是两种方法的性能是不一样的。
//在这里我们以Integer举例,其他都是类似的 Integer number = 111; //方法1:只接加一个空字符串 String numberStr1 = number + ""; //方法2:用valueOf String numberStr2 = String.valueOf(number);
方法一是加上一个空字符串,方法二是String.valueOf
。
在这里我们推荐使用方法二,除了代码更优雅以外,主要是性能问题。
尤其是使用jdk7
,而且垃圾回收器是CMS
的应用,方法一相当于创建了一个新的字符串常量,占用的是常量池的空间,而方法二底层调用的是对象的toString
方法,常用的数字类型的toString方法底层实际上是new String
,所以会放在堆里面。
下面是Integer
的toString
方法:
public static String toString(int i) { if (i == Integer.MIN_VALUE) return "-2147483648"; int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i); char[] buf = new char[size]; getChars(i, size, buf); return new String(buf, true); }
稍微对JVM内存管理有些经验的同学都知道,常量池和堆可不是一回事,垃圾回收成本也不同。
在小项目上可能看不出来区别,一旦在访问量比较大的项目上,内存问题就比较明显了,所以建议使用方法二,养成良好的代码习惯。
本篇内容到此为止。