以下例程在WIN XP x32,JAVA版本7更新9和WIN7 x64,JAVA版本6更新32上的行为有所不同。
private int getNrOfMatches(String temp, String regex) {
String prev;
int nrOfIterations = -1;
do {
nrOfIterations++;
prev = temp;
temp = temp.replaceFirst(regex, " ");
} while (temp != prev);
return nrOfIterations;
}
replaceFirst()返回相同的对象,如果它没有修改任何东西,循环在WIN XP上结束。在Win7上它继续循环,因为!=
总是返回false,因为例程返回一个新对象,即使它没有改变任何东西。
使用.equals()
代替!=
解决了这个问题,但我的问题是,任何人都可以解释这种行为吗?
答案 0 :(得分:2)
绝对不要将字符串与==
或!=
使用(str1.equals(str2))
或(!str1.equals(str2))
==
和!=
比较非基本类型的对象引用。
equals()
比较对象的内容,当类重写它继承自Object
的方法时。
答案 1 :(得分:2)
因此,在某些时候回答部分问题是为了解决它的原因。 JVM有一些切割器优化,尝试重用相同字符串的引用,而不是创建具有相同内容的新引用。有可能在Win XP上运行时,你的JVM有这些优化,而你的Win 7没有(它们是相同的版本吗?)
This SO Question相当好地介绍了这个主题,并且接受的答案讨论了如何将字符串实际添加到常量池(调用.intern()
)。在确定相等性方面,这不是一个稳定的解决方案,因为JVM将始终优先于您在Java代码中做出的任何内存管理选择。
同样深入研究JVM options我确实找到了这个有趣的选项(-XX:+UseStringCache
)和这个SO question来讨论它的作用。也许你的Win XP JVM有-server优化,而你的Win 7没有?