有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

    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)第二个将每次生成一个新字符串,不是吗

这只是一个例子,在我的例子中,毫秒将非常重要

提前谢谢


共 (3) 个答案

  1. # 1 楼答案

    这两者都将是100%等效的。没有区别,甚至毫秒都没有

  2. # 2 楼答案

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

        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=100万

    输出:

    First : 42ns
    Second : 34ns
    

    numOfTrials=1亿

    输出:

    First : 31ns
    Second : 31ns
    
  3. # 3 楼答案

    第一个版本(如下所列)将执行得更快,因为它只创建一次字符串

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