2011-07-26 22 views
17

我用三個文本框創建了一個「顏色選擇器」,其中用戶定義了rgb值。
要檢查輸入的值是正確的(僅限於0-255之間的數字),我使用了以下內容:String.isEmpty()和String.equals之間的區別(「」)

public Color getColor() { 
    if (tfRed.getText().equals("") || tfGreen.getText().equals("") || tfBlue.getText().equals("")) { 
       return new Color(0, 0, 0, 0); 
    } else { 
     if (tfRed.getText().matches("\\d+") && tfGreen.getText().matches("\\d+") && tfBlue.getText().matches("\\d+")) { 
      // ... 
     } else { 
      return new Color(0, 0, 0, 0); 
     } 
    } 
} 

就是我要問:是它更好地使用String.isEmpty()?我從來沒有找到一個令人滿意的答案,我總是想知道是否有任何區別。

+1

請參閱此討論,[我應該使用string.isEmpty()或「」.equals(字符串)?](http://stackoverflow.com/questions/3321526/should-i-use-string-isempty-or -equalsstring) – bharath

回答

25

我認爲isEmpty()是一個更有效率。然而,智能編譯器無論如何都可以優化equals("")調用。從OpenJDK source

671  public boolean isEmpty() { 
    672   return count == 0; 
    673  } 

1013  public boolean equals(Object anObject) { 
1014   if (this == anObject) { 
1015    return true; 
1016   } 
1017   if (anObject instanceof String) { 
1018    String anotherString = (String)anObject; 
1019    int n = count; 
1020    if (n == anotherString.count) { 
1021     char v1[] = value; 
1022     char v2[] = anotherString.value; 
1023     int i = offset; 
1024     int j = anotherString.offset; 
1025     while (n-- != 0) { 
1026      if (v1[i++] != v2[j++]) 
1027       return false; 
1028     } 
1029     return true; 
1030    } 
1031   } 
1032   return false; 
1033  } 

另外,answer here上是否使用str.isEmpty()"".equals(str)是現貨:

"".equals(s)主要好處是你不需要空校驗(equals會檢查它的參數並返回false,如果它是空的),你似乎不關心。如果您不擔心s爲空(或者正在檢查它),我肯定會使用s.isEmpty();它顯示正是你檢查什麼,你關心s是否是空的,而不是它是否等於空字符串

11

是,使用String.isEmpty()。它更清晰(語義上)(性能也稍微好一些,但這將是不可忽略的)如果實例可以爲null,請使用commons-lang StringUtils.isEmpty(string)

4

使用myString.equals(""),首先編譯器創建一個String對象myString.equals(new String(""))

所以的isEmpty()應該是一個更好的選擇(雖然等號( 「」)是非常流行)。

+1

字符串文字通常在類加載時加載,「」幾乎保證已經存在。 –

+0

@Peter Lawrey你是什麼意思的「加載」。單身? – SJuan76

+2

它不等同於'new String(「」)'。 '「」'被攔截並且已經存在於字符串池中。 – Bozho

6

由於isEmpty()檢查是否String的長度爲0,""只是String長度爲0,每個String其中isEmpty()返回true也將返回true.equals("")。所以在技術上,他們做同樣的事情

性能可能會有很小的差異,但我根本不會打擾(如果它在生產代碼中是顯而易見的,我會非常驚訝)。

另一個區別是,如果你寫了"".equals(someString),那麼它將是「null -safe」。換句話說:如果someStringnull,則此構造將簡單地評估爲false而不是拋出NullPointerException。但是,如果你有someString.equals("")那麼這個不是適用。

最重要的區別是它是如何閱讀:isEmpty()使得非常明確的打算:要區別對待空字符串。.equals("")是如此輕微明確(「如果該字符串等於其他字符串,那恰好是空的」)。

+0

除了上面的回答 'String.equals(「」)'比一個'isEmpty()'調用慢了一點。字符串存儲一個在構造函數中初始化的count變量,因爲字符串是不可變的。 'isEmpty()'將count變量與0進行比較,而equals將檢查類型,字符串長度,然後遍歷字符串進行比較,如果大小匹配。 'isEmpty()'實際上會少得多!這是一件好事。 –

4

理論上是這樣。對於isEmpty(),只能查看字符串的內部元數據(例如,它的長度)。爲了進行比較,您會期望發生更多的案例差異。

在實踐中,也沒關係。你不會觀察到速度差異。

捶擊的規則:使用被最好地理解/程序員最可讀的方法。如果是空字符串測試,我認爲isEmpty()最適合這個目的。

4

isEmpty()是更快,因爲它只有在Stringlength整場比較0而比較空字符串將在最好的比較基準(類似的速度),並在最壞的情況 - 0反覆運行一個循環。

但最大的區別是可讀性 - isEmpty()更短,更容易把握。 BTW我希望有一個isBlank()速記.trim().isEmpty() ...

5

通常情況下,我喜歡用平等的,但相反,即:

"".equals(someString); 

空安全:)

但是,是的isEmpty ()是一個更簡單的操作,但不是太多,我認爲它會產生任何顯着的性能貢獻(除非您正在編寫嵌入式實時內容)。

2

isEmpty只在1.6推出。檢查由於標記在javadoc

因此,如果您正在編譯1.5和更低equals("")是你唯一的選擇。

但是,如果版本兼容性是您關心的問題,我會用isEmpty。正如Bozho指出的那樣,它在語義上更乾淨(並且速度更快)。

3

這部分是歷史和傳統用途的問題。 isEmpty()只添加在JDK 6:

/** 
* Returns <tt>true</tt> if, and only if, {@link #length()} is <tt>0</tt>. 
* 
* @return <tt>true</tt> if {@link #length()} is <tt>0</tt>, otherwise 
* <tt>false</tt> 
* 
* @since 1.6 
*/ 
public boolean isEmpty() { 

在此之前,每個人都""比較,看是否字符串爲空。舊習慣很難實現,所以很多人仍然使用""比較。

當然,正如其他人所提到的,如果您使用"".equals(someString),那麼它會自動爲零。許多人通過製作static isEmpty method將isEmpty的想法與無效安全性結合起來。

+0

*「在此之前,所有人都與」「比較,看看字符串是否爲空。」* - 不是每個人。有些人使用'length()== 0' –

+0

你是對的;) –

4

使用myString.equals("")myString.length() == 0的另一個原因是在Java 1.6中引入了String#isEmpty()方法。

因此,不使用String#isEmpty()的參數可能與以前版本的Java兼容。

0

我一直用.isEmpty() ......直到今天,當我發現,它並沒有在Java 5中

所以存在:

  • 在Java 6和更新的,我們都可以選擇,並且我建議使用.isEmpty(),它更易於書寫和更清晰地閱讀。我們不得不使用.equals("")
0

String.equals(「」)比isEmpty()調用稍慢。字符串存儲一個在構造函數中初始化的count變量,因爲字符串是不可變的。

isEmpty()將count變量與0進行比較,而equals將檢查類型,字符串長度,然後遍歷字符串進行比較,如果大小匹配。

所以要回答你的問題,isEmpty()實際上會少得多!這是一件好事。