2013-11-28 110 views
0
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,不是嗎?

這只是一個例子,在我的情況下,毫秒會很重要。

在此先感謝。

+0

#2不會每次都創建一個新的字符串,但它將不得不每次都檢查池並檢索實習生。請參閱字符串實習:https://en.wikipedia.org/wiki/String_interning – Radiodef

+0

@Radiodef:是什麼讓您認爲每次都要查看實習字符串? –

+0

@LouisWasserman我讀過那幾個地方。爲什麼不需要檢索? JLS指出String字符串是通過'String#intern'方法實現的,該方法的文檔指定池被查詢。 – Radiodef

回答

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 =百萬

輸出:

First : 42ns 
Second : 34ns 

numOfTrials =億

輸出:

First : 31ns 
Second : 31ns 
0

第一個版本(下面列出)執行速度更快,因爲它只創建一次字符串。

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

這些都是100%等價。沒有區別,甚至毫秒。