直接字符串比字符串变量更快?

时间:2013-11-28 00:22:16

标签: java string variables

    final String string1 = "somestring1";
    for (int i = 0; i < 30; i++) {
        final String string2 = "somestring2";
        if (string2.equals(string1)) { // Using variable
            // do stuff
        }
    }

    for (int i = 0; i < 30; i++) {
        final String string2 = "somestring2";
        if (string2.equals("somestring1")) { // Not using variable
            // do stuff
        }
    }

其中哪一个会更快?

1)第一个将它保存为变量并使用变量直到循环完成。

2)第二个是每次都会生成一个新的String,不是吗?

这只是一个例子,在我的情况下,毫秒很重要。

提前致谢。

3 个答案:

答案 0 :(得分:0)

第一个版本(下面列出的)将执行得更快,因为它只会创建一次String。

final String string1 = "somestring1";
for (int i = 0; i < 30; i++) {
    final String string2 = "somestring2";
    if (string2.equals(string1)) { // Using variable
        // do stuff
    }
}

答案 1 :(得分:0)

这两者都是100%相同的。没有区别,甚至没有毫秒。

答案 2 :(得分:0)

最简单的方法是尝试看看会发生什么:

    public static void main(String[] args) {

    final int numOfTrials = 100000;

    long first = 0;
    for (int index = 0; index < numOfTrials; index++) {
        long start = System.nanoTime();
        final String string1 = "somestring1";
        for (int i = 0; i < 30; i++) {
            final String string2 = "somestring2";
            if (string2.equals(string1)) { // Using variable
                // do stuff
            }
        }
        first+= (System.nanoTime()-start);
    }

    long second = 0;
    for (int index = 0; index < numOfTrials; index++) {
        long start = System.nanoTime();
        for (int i = 0; i < 30; i++) {
            final String string2 = "somestring2";
            if (string2.equals("somestring1")) { // Not using variable
                // do stuff
            }
        }
        second+= (System.nanoTime()-start);
    }


    System.out.println("First : "+(first/numOfTrials)+"ns");
    System.out.println("Second : "+second/numOfTrials+"ns");
}

numOfTrials = 10000

输出

First : 139ns
Second : 59ns

JVM中有一个缓存机制,如果已经有一个匹配并且使用现有的字符串对象,JVM将不会创建新的字符串对象。有一些方法可以强制jvm创建新的字符串,如关键字“new”。如果你想深入了解,你可能需要找一篇文章并阅读它。


numOfTrials = 1百万

输出:

First : 42ns
Second : 34ns

numOfTrials = 1亿

输出:

First : 31ns
Second : 31ns