2010-04-14 93 views
2

這些是否有區別?Java中各種字符串比較之間的區別

if(myString.equals("")){ 

} 

if(myString.equals(null)){ 

} 

if(myString == ""){ 

} 

我有一個字符串,我不知道是不是空的,或者有一些emtpy空間我只是wan't阻止它被寫入數據庫,如果它是無效的(如果爲空或有一些空格)。

+0

這個答案將有助於http://stackoverflow.com/questions/767372/java-string-equals-versus/767379 #767379 – Babar 2010-04-14 15:39:11

回答

5

達到你想要什麼,寫:

if (!myString.trim().equals("")) { 
    // write to database 
} 

,或者還有一種可能性,即myString可能null

if (myString != null && !myString.trim().equals("")) { 
    // write to database 
} 
+0

我不這麼認爲。 myString可以爲null,這樣會拋出一個NPE。 – Freiheit 2010-04-14 16:03:20

+0

我專門省略了對'null'的檢查,因爲OP說'我不知道它是空的還是有一些空格'。但是,也許我會添加一個檢查'null'的版本。 – pajton 2010-04-14 16:06:30

+0

現在掛起,所以如果字符串是空的它並不意味着它的空? – 2010-04-14 16:07:29

3

是的。

如果字符串爲空,則首先返回true。

第二個將總是返回false。

三會返回真,如果你的字符串精確定義是這樣的:

String myString = ""; 

注意,這是不一樣的1的情況下!價值平等的第一次測試,而身份的第二次​​測試。

String myString = ""; 
    String myOtherString = new String(myString); 

    assert myString == ""; 
    assert myOtherString.equals(""); 
    assert myOtherString != ""; 

底線是:

  • 使用字符串之間的比較第一種情況下,
  • 使用myString == null爲空測試,
  • 從來沒有使用第三個!
+0

所以1和3之間沒有區別? – 2010-04-14 15:39:36

+2

你不應該使用3,應該檢查諸如字符串之類的對象是否與.equals相等。但是,您應該使用==來檢查字符串是否爲空。 – ColinD 2010-04-14 15:41:49

10

你的每個例子都是互不相同的。

  1. 第一個是一個簡單的比較,以查看是否myString是空
  2. 第二(其中不帶字符的字符串)總是有誤或一個NullPointerException
  3. 第三檢查以查看是否變量myString引用空字符串常量。如果變量是用空字符串常量()明確初始化的,如果變量用某個「生成的」空字符串初始化(例如new StringBuilder().toString()),然後通過intern()明確添加到常量池中,則這將成立。

正如在評論中指出的那樣,第一個例子也可能拋出NullPointerException,但不是第三個。

+0

不錯,非常簡潔:]。 – pajton 2010-04-14 15:41:10

+1

第二個始終是false - 'equals'正確處理null參數。 – 2010-04-14 15:49:19

+1

@PéterTörök:是的,equals與null無關,但myString本身可能爲null,在這種情況下確實會有NullPointerException。 – jjujuma 2010-04-14 15:54:42

2

pajton加入了正確的答案。以澄清你的嘗試有什麼問題:

//true if myString is the empty string. will fail on " " 
if(myString.equals("")){ 

} 

//always false, or fails 
//if myString is null, you'll get a NullPointerException 
//if it isn't, you'll get false 
if(myString.equals(null)){ 

} 

//a bad way to do things with unexpected results. 
//when dealing with objects, == is true when each are the same object. 
//two different objects that have the same content or value (e.g. clones) 
//will return false using this technique 
if(myString == ""){ 

} 
0

Java中的字符串只是另一個對象。你的第一個比較是最正確的。它將myString與空白進行比較,如果字符串也爲空(「」),則返回true。第二個比較總是假的。第三,它比較對象的平等性(將它想象爲比較對象的地址)。我認爲將總是返回false,除非你的字符串是字符串myString =「」(不確定在這一個)。

0

它們都是不同的。假設myString的非空,

  1. 將返回true如果String提到了myString的代表空字符串
  2. 將始終返回false
  3. 如果myString的情況來指代同樣的實例將返回true的字符串爲「」。在你的程序中這可能是真的,但也可能是錯誤的。
0

只需使用Apache的百科全書StringUtils.isBlank()

編輯:達到你想要使用的是什麼// @ zim2001的方法做到這一點:

if (StringUtils.isNotBlank(myString)) { 
    // write to database 
} 

這是容易得多比目前公認的答案閱讀。 (但請在此處查看其他帖子以瞭解與String一起工作的細節)。

+0

我的猜測是他開始學習編程,或者至少是java。將他指向API而不是解釋發生的事情並不是最好的教學。 – 2010-04-14 15:59:10

+0

我發佈的時候已經有4篇文章教Java了。我選擇「教」一種替代方法。總有不止一種方法來給貓換膚。此外,請參閱@ zim2001回答當前最佳答案。是的,最好的海事組織,因爲它提供了一個更簡潔的方法,因此比目前接受的答案更容易閱讀。 – harschware 2010-04-16 19:03:33

1

如果您不打算依賴外部庫,則可以使用apache commons的StringUtils類,它提供了一種名爲「 isNotBlank()」,這似乎完全適合你的需要:

Checks if a String is not empty (""), not null and not whitespace only. 

StringUtils.isNotBlank(null)  = false 
StringUtils.isNotBlank("")  = false 
StringUtils.isNotBlank(" ")  = false 
StringUtils.isNotBlank("bob")  = true 
StringUtils.isNotBlank(" bob ") = true 

http://commons.apache.org/lang/api/org/apache/commons/lang/StringUtils.html#isBlank%28java.lang.CharSequence%29