夕辞

JAVA字符串转数字,JAVA数字转字符串 | 夕辞夕辞

JAVA字符串转数字,JAVA数字转字符串

本篇介绍下在JAVA开发过程中,字符串和数字之间的转换使用方法,包括原生方法转换和三方工具。

顺便说下,我更喜欢使用三方的工具,更方便些。

 

一、字符串转数字。

 

1.先来看看原生方法的使用,包括parseXXXvalueOf两种。

先来看看代码:

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,所以会放在堆里面。

下面是IntegertoString方法:

public static String toString(int i) {
    if (i == Integer.MIN_VALUE)
        return "-2147483648";
    int size = (i &lt; 0) ? stringSize(-i) + 1 : stringSize(i);
    char[] buf = new char[size];
    getChars(i, size, buf);
    return new String(buf, true);
}

稍微对JVM内存管理有些经验的同学都知道,常量池和堆可不是一回事,垃圾回收成本也不同。

在小项目上可能看不出来区别,一旦在访问量比较大的项目上,内存问题就比较明显了,所以建议使用方法二,养成良好的代码习惯。

 

本篇内容到此为止。

2022年9月20日 / /
标签:  暂无标签
回到顶部