我应该在不需要时将整数解析为 Java 中的字符串吗? [复制]
Posted
技术标签:
【中文标题】我应该在不需要时将整数解析为 Java 中的字符串吗? [复制]【英文标题】:Should I parse an integer to string in Java, when not necessary? [duplicate] 【发布时间】:2015-11-01 04:11:28 【问题描述】:我想将一个整数附加到一个字符串。 做有没有区别:
String str = "Number: " + myInt;
和
String str = "Number: " + Integer.toString(myInt);
换句话说,我应该在不必要的时候使用Integer.toString()
方法吗?
编辑:我不是想知道“如何将整数转换为字符串”,而是想知道“如果我需要使用某种方法,则进行转换”。
【问题讨论】:
【参考方案1】:没有区别。编译器 (Oracle JVM 1.8) 将 sn-ps 转换为
(new StringBuilder()).append("Number: ").append(myInt).toString();
就我个人而言,我不会使用Integer.toString()
,因为它会增加代码的噪音,并且不会提供清晰性和可读性。
编辑
我在原始答案上犯了一个错误,并描述了会有细微差别(如果需要,请参阅答案历史记录!)
【讨论】:
另一个问题是append(int)
方法如何将int
转换为String
,因此直接调用Integer.toString(int)
是否会更好地提高性能。
我相信构建 JVM 的人知道性能,我认为他们这样做是故意的,因为使用 StringBuilder.append(int)
可能会提高性能...但我无法评论这个,我只是不知道。
这里没有任何猜测的理由,所有的JDK源码都可以使用
@JarrodRoberson 我认为你错过了编译器优化,如果在源代码中它不存在。我原来的(和错误的)答案完全基于源代码。【参考方案2】:
澄清 Augusto 的回答:您可以运行一个简单的基准测试。
public static void main(String[] args)
// TODO Auto-generated method stub
System.out.println("Race Started");
int []noArr = new int[100];
for(int i=0;i<100;i++)
noArr[i] = i+1;
String str = "";
long startedTime = System.nanoTime();
for(int j=0;j<100;j++)
str = str + noArr[j];
long runningTime = System.nanoTime() - startedTime;
System.out.println("Concatenation String + int took : "+runningTime);
startedTime = System.nanoTime();
String str2 = "";
for(int h=0;h<100;h++)
str2 = str2 + Integer.toString(noArr[h]);
runningTime = System.nanoTime() - startedTime;
System.out.println("Concatenation String with Wrapper obj took : "+runningTime);
startedTime = System.nanoTime();
StringBuilder sb = new StringBuilder("");
for(int k=0;k<100;k++)
sb.append(k);
runningTime = System.nanoTime() - startedTime;
System.out.println("StringBuilder took : "+runningTime);
摘要纳秒时间
比赛开始(这些是粗略的数值;但您可以看到巨大的差异)
连接字符串 + int 占用:250555 使用 Wrapper obj 连接字符串:485413 StringBuilder 占用:98411【讨论】:
以上是关于我应该在不需要时将整数解析为 Java 中的字符串吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
将十六进制字符串解析为整数会引发 NumberFormatException?