2017-10-17 80 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