Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中将整数转换为字符串的最佳方法_Java_String - Fatal编程技术网

Java中将整数转换为字符串的最佳方法

Java中将整数转换为字符串的最佳方法,java,string,Java,String,我已经看到了,它提供了几种将整数转换为字符串的方法,但我想知道它们之间是否有任何区别 如果我只想把一个整数I转换成一个字符串,那么这三种方法之间是否有区别(有些方法比其他方法快) 我倾向于使用第二个或第三个,因为第一个对我来说很奇怪。另一方面,如果我想将整数I转换为字符串,然后将其连接到另一个字符串s,我可以: i+s Integer.toString(i)+s String.valueOf(i)+s 在这里,我倾向于使用第一个,因为我正在连接。但我的问题是:这里有没有应该使用的标准实践,这三

我已经看到了,它提供了几种将整数转换为字符串的方法,但我想知道它们之间是否有任何区别

如果我只想把一个整数I转换成一个字符串,那么这三种方法之间是否有区别(有些方法比其他方法快)

我倾向于使用第二个或第三个,因为第一个对我来说很奇怪。另一方面,如果我想将整数I转换为字符串,然后将其连接到另一个字符串s,我可以:

i+s
Integer.toString(i)+s
String.valueOf(i)+s
在这里,我倾向于使用第一个,因为我正在连接。但我的问题是:这里有没有应该使用的标准实践,这三种方法之间到底有什么区别(如果有的话)

String.valueOf(i); 
实际上打电话

Integer.toString(i)

还有一件事,如果在null对象中调用
toString()
,您将得到
NullPointerException

此外,String类的static
valueOf()
采用不同的原语参数,并提供了更大的灵活性

实际上打电话

Integer.toString(i)

还有一件事,如果在null对象中调用
toString()
,您将得到
NullPointerException

此外,String类的静态
valueOf()
采用不同的基本参数,并提供了更大的灵活性

差异:

字符串到int

//overhead as you are appending a empty string with an int
""+i
//More generic (can be the same for float, double, long & int)
String.valueOf(i)
//Type Safe you know for sure that what you are converting is an Integer.
Integer.toString(i)
不,没有标准的方法,这完全取决于您要完成的任务,如果您希望代码更健壮,您可以尝试valueOf(),如果您希望确定它实际上是一个小于第二个整数的整数(不建议使用第一个整数)

这三者之间没有显著的性能差异。

另一种方式类似于字符串注释到int。

差异:

字符串到int

//overhead as you are appending a empty string with an int
""+i
//More generic (can be the same for float, double, long & int)
String.valueOf(i)
//Type Safe you know for sure that what you are converting is an Integer.
Integer.toString(i)
不,没有标准的方法,这完全取决于您要完成的任务,如果您希望代码更健壮,您可以尝试valueOf(),如果您希望确定它实际上是一个小于第二个整数的整数(不建议使用第一个整数)

这三者之间没有显著的性能差异。


另一种方式类似于字符串的注释,即int.

i+“”;它的计算速度往往比其他两个更快,但就行业标准而言,它往往是不受欢迎的。我个人会使用String.valueOf(I),但我相信Integer.toString(I)也是可以接受的。在串联的情况下,i+“S”也可以;它的计算速度往往比其他两个更快,但就行业标准而言,它往往是不受欢迎的。我个人会使用String.valueOf(I),但我相信Integer.toString(I)也是可以接受的。在串联的情况下,i+“S”也很好。

一个简单的测试揭示了它们之间的巨大差异

考虑到运行之间的启动和冷却,然后对于每个测试,运行到每个选项的Integer.MAX_值,我得到以下结果:

""+1 took 675 millis
String.valueOf(1) took 52244 millis
Integer.toString(1) took 53205 millis
结果:只要可能,使用
i+“”
“”+1

社会责任感在这里发挥作用: 我的测试是(正如我指出的那样)“+1、String.valueOf(1)和Integer.toString(1)。当我重新运行测试时,我发现相同的结果。然而,当我使用变量时,正如ASantos和VSchäfer所指出的,我得到的解之间的时间相似


呼。我现在感觉好多了。

一个简单的测试揭示了他们之间的巨大差异

考虑到运行之间的启动和冷却,然后对于每个测试,运行到每个选项的Integer.MAX_值,我得到以下结果:

""+1 took 675 millis
String.valueOf(1) took 52244 millis
Integer.toString(1) took 53205 millis
结果:只要可能,使用
i+“”
“”+1

社会责任感在这里发挥作用: 我的测试是(正如我指出的那样)“+1、String.valueOf(1)和Integer.toString(1)。当我重新运行测试时,我发现相同的结果。然而,当我使用变量时,正如ASantos和VSchäfer所指出的,我得到的解之间的时间相似


呼。我现在感觉好多了。

String.valueOf(int)
的源代码是:

public static String valueOf(int i) {
    return Integer.toString(i);
}
由于
String
类是final,因此此调用可能由JIT内联


i+“”
的情况下,它将创建一个
StringBuilder
并调用其
append(int)
方法,最终导致调用
Integer.getChars
,该方法与
Integer.toString
用于获取整数字符串表示形式的方法相同。它还调用
append(String)
方法来追加空字符串,然后
toString
StringBuilder
字符串的源代码中获取结果
字符串。value of(int)
是:

public static String valueOf(int i) {
    return Integer.toString(i);
}
由于
String
类是final,因此此调用可能由JIT内联

i+“”
的情况下,它将创建一个
StringBuilder
并调用其
append(int)
方法,最终导致调用
Integer.getChars
,该方法与
Integer.toString
用于获取整数字符串表示形式的方法相同。它还调用
append(String)
方法来追加空字符串,然后
toString
StringBuilder
获取结果
String
,选项1
“+i
实际上被编译器解释为选项1b
新的StringBuilder(“”)。append(i).toString()

第二个选项
String.valueOf(i)
在内部调用
Integer.toString(i)
,因此有一个方法调用的开销

第三个选项
Integer.toString(i)
在下面的基准测试中似乎是最快的

在我的测试中(大约多次运行的平均值):

  • 选项1:~64000毫秒
  • 备选方案1b
    public class Main{
        public static void main(String[] args) throws InterruptedException
        {
            // warm up the JVM
            for (int i = 0; i < 1000; i++)
            {
                String aString = ""+i;
            }
    
            long now = System.currentTimeMillis();
            for (int i = 0; i < Integer.MAX_VALUE; i++)
            {
                String aString = ""+8;
            }
            System.out.println("Option 1 (K) \"\"+8 "+(System.currentTimeMillis()-now));
    
            now = System.currentTimeMillis();
            for (int i = 0; i < Integer.MAX_VALUE; i++)
            {
                String aString = ""+i;
            }
            System.out.println("Option 1 (var) \"\"+i "+(System.currentTimeMillis()-now));
    
            Thread.sleep(1000); 
            now = System.currentTimeMillis();
            for (int i = 0; i < Integer.MAX_VALUE; i++)
            {
                String aString = String.valueOf(i);
            }
            System.out.println("Option 2 String.valueOf(i) "+(System.currentTimeMillis()-now));
    
            Thread.sleep(1000); 
            now = System.currentTimeMillis();
            for (int i = 0; i < Integer.MAX_VALUE; i++)
            {
                String aString = Integer.toString(i);
            }
            System.out.println("Option 3 Integer.toString(i) "+(System.currentTimeMillis()-now));
    
        }
    }