Java字符串拆分在Windows和Linux上提供不同的输出

use*_*444 11 java string split

请看下面的代码 -

String s11 ="!country=India ";    
String[] ss =s11.split("((?<=[!&|])|(?=[!&|]))");
System.out.println(ss.length);
for(String s :ss) {
  System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)

在Windows上,它给出了

2
!
country=India 
Run Code Online (Sandbox Code Playgroud)

而Ubuntu给出了它

3

!
country=India 
Run Code Online (Sandbox Code Playgroud)

那为什么会这样?

mat*_*aly 9

此行为不是因为操作系统不同,而是可能使用不同版本的JVM.

这种"行为改变"导致Java 8 错误归档.

该文档已针对JDK 8进行了更新,并且在此问题中也进行了详细讨论,其中Java 8中的split在结果数组的开头删除了空字符串.这就是为什么!没有创建额外的空字符串(因此长度为2而不是3).

注意在文档中的差异split()的方法中的Java 7爪哇8Pattern类和字符串类(爪哇7,爪哇8)分别.请参阅原始问题,以获取有关此内容的更多信息.

我还在Java 7上重现了这个问题:sun-jdk-1.7.0_10(ideone)和Java 8 sun-jdk-8u25(ideone).请在此处查看Java版本. Java 8的拆分将不提供额外的空字符串到数组,而Java 7的拆分将.

这不是因为系统是Linux或Windows,而是JVM版本.你可以仔细检查你的JVM版本java -version