月度归档:2013年07月

Java的String.valueOf转换与、空串+类型变量转换与封装类(Integer)的toString方式转换比较

1、空串+类型变量方式转换

int i=20;
String s=""+i;

这种方式实际上经过了两个步骤,首先进行了i.ToString()把 i 转换为 字符串,然后再进行加法运算,这里利用了java的toString机制来做转换。

2、String.valueOf方式转换类型

int i=20;
String s=String.valueOf(i);

查看源码发现,这种方式实际上是使用了封装类(Integer)的toString方式来进行转换的。

1 public static String valueOf(int i) {
2    return Integer.toString(i);
3 }

3、使用类型封装类的toString()方法

Integer i=20;
String s=i.toString();

查看java源码发现,toString实际上是new 了一个String。

简单进行速度的测试。

public class toStringDome {
    public static void main(String[] args)
    {
        Random ra=new Random(new java.util.Date().getTime());
        String tmp=null;
        int runtimes=1000000;
        int range=50;

        long startTime=System.currentTimeMillis();   //获取开始时间
        for (int i = 0; i <runtimes; i++) {
            tmp=String.valueOf(ra.nextInt(range));
        }
        long endTime=System.currentTimeMillis(); //获取结束时间

        System.out.println("使用String.valueOf程序运行时间: "+(endTime-startTime)+"ms");

        long startTimeToString=System.currentTimeMillis();   //获取开始时间
        for (int i = 0; i <runtimes; i++) {
            tmp = ""+ra.nextInt(range);
        }
        long endTimeString=System.currentTimeMillis(); //获取结束时间
        System.out.println("使用(空串来转换+类型变量)程序运行时间: "+(endTimeString-startTimeToString)+"ms");


        Integer temp=0;
        long startTimeToString1=System.currentTimeMillis();   //获取开始时间
        for (int i = 0; i <runtimes; i++) {
            temp= ra.nextInt(range);
            tmp =temp.toString();
        }
        long endTimeString2=System.currentTimeMillis(); //获取结束时间

        System.out.println("使用Integer的toString程序运行时间: "+(endTimeString2-startTimeToString1)+"ms");


    }
}

运行结果:

使用String.valueOf程序运行时间: 87ms
使用(空串来转换+类型变量)程序运行时间: 245ms
使用Integer的toString程序运行时间: 77ms


经过简单测试后发现,使用(空串来转换+类型变量)方式转换比String.valueOf与Integer的toString慢了两倍以上。

我个人理解使用(空串来转换+类型变量)方式转换效率慢是因为这种方式实际上经过了两个步骤,首先进行了i.ToString()把 i 转换为 字符串,然后再进行字符串加法运算,由于字符串是不可变的,要需要new一个内存空间来存放新的字符串,字符串加法运算影响了效率。