我应该在不需要时将整数解析为 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?

React-Slick 在不应该时将内容包装在 div 中

Graphql ID 解析为字符串,即使它是整数

运行java jar时整数数组作为参数

我应该如何在不使用 C++ 中的构造函数的情况下将值(不是指针)转换为子类?

加载 Angular UI Bootstrap Datepicker 时将日期字符串解析为 Date 对象