【问题标题】:Java string split gives different outputs on Windows and linuxJava 字符串拆分在 Windows 和 linux 上给出不同的输出
【发布时间】:2015-06-23 17:41:42
【问题描述】:

请看下面的代码--

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

在 Windows 上它提供

2
!
country=India 

而在 Ubuntu 中它提供了

3

!
country=India 

为什么会这样?

【问题讨论】:

  • 两个平台的 Java 版本是多少?
  • 新行是 Ubuntu 输出的一部分吗?
  • 我认为 split 的行为在最近的 Java 版本中发生了变化。
  • 您能否发布两个环境中的确切 JVM 版本 (java -version)?
  • ideone 也给出了 2 个不同的结果。 ideone.com/EeN5Ka(Java 7:sun-jdk-1.7.0_10)和ideone.com/e6NS0c(Java 8:sun-jdk-8u25)。绝对是 JVM 而不是操作系统相关的问题。

标签: java string split


【解决方案1】:

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

这种“行为变化”导致了 Java 8 的错误为 filed incorrectly

文档已针对 JDK 8 进行了更新,并且还详细讨论了 in this question, 其中 Java 8 中的split 删除了结果数组开头的空字符串。这就是为什么没有创建! 之前的附加空字符串(因此长度为 2 而不是 3)。

请注意split() 方法in Java 7Java 8Pattern 类和字符串类(Java 7Java 8)的区别。有关更多信息,请参阅链接的原始问题。

我还在 Java 7 上重现了这个问题:sun-jdk-1.7.0_10 (ideone) 和 Java 8 sun-jdk-8u25 (ideone)。 See the Java versions here. Java 8 的拆分不会将多余的空字符串添加到数组中,而 Java 7 的拆分会。

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

【讨论】:

  • 谢谢...看起来像...我自己尝试过 ideone 但 7 和 8 都给了我相同的结果(没有额外的行),但后来我只是分叉了你的链接并尝试并注意到了什么你说...谢谢你的帮助。
  • @user2931444 很高兴你解决了这个问题,这是你发现的一个有趣的行为。如果答案正确且有帮助,请不要忘记接受答案!欢迎来到 SO。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 2017-02-26
相关资源
最近更新 更多