2017-10-17 40 views
9

我的理解如下程序應打印0,0作爲輸出。字符串類拆分()的特殊行爲

但是,當我運行這個程序時,我得到了1,0作爲輸出。

public class Test1 { 
    public static void main(String[] args) { 
     System.out.println("".split(";").length); //1 
     System.out.println(";".split(";").length);//0 
    } 
} 

請幫我理解這裏發生了什麼?

+0

這是標有斯卡拉同樣的問題:https://stackoverflow.com/questions/4964484/why-does-split-on-an -empty-string-return-a-non-empty-array Rok Kralj的回答解決了這種特殊的不一致問題:https://stackoverflow.com/questions/4964484/why-does-split-on-an-empty-string-return-一個非空陣列#37796531 –

+1

@ nullpointer - 請檢查lang類型,它的scala !!!!你認爲scala和java是相同的? –

+1

@LoneWolf它有所作爲嗎?將這個應用到Java有什麼問題嗎? –

回答

5

初步認識代碼

 // If no match was found, return this 
     if (off == 0) 
      return new String[]{this}; 

     // Add remaining segment 
     if (!limited || list.size() < limit) 
      list.add(substring(off, value.length)); 
+0

這實際上是問題的答案。 – shinjw

+0

爲了獲得更多的上下文,我會在上面的'if(off == 0)'行中放入。 – shinjw

3

你發現一個很酷的邊緣情況: 如果字符串不包含字符您可以通過包含數組拆分它只是該字符串返回

如果分離字符是字符串,然後你得到包含數組全部拆分,除空字符串外。

所以在第二種情況下,結果應該是一個有兩個空字符串的數組,但拆分函數會將它們刪除。在第一種情況下,由於split沒有實際分割任何東西,也沒有刪除任何東西。

+0

'「;;;;」length「給出0,和'」;;; 1; 「.length」給出3.第二種情況是非常瘋狂和意外的行爲。 – clemens

+0

感謝用戶.... :)的理由 –

5

在第一種情況下,因爲是根本不存在匹配,則該字符串將返回爲每的Javadoc的這一部分:

如果表達式不匹配輸入的任何部分,然後將得到的數組只有一個元素,即這個字符串。

關於第二個情況下,在分割確實發生的情況下,在後空字符串將被移除:

如果Ñ是零,那麼圖案將被應用的次數儘可能地,該陣列可以有任何長度,並且尾隨的空字符串將被丟棄

(重點煤礦)

來源:Javadoc