Java String.replaceFirst具有不同的行为

Java String.replaceFirst具有不同的行为,java,Java,以下例程在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

以下例程在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()
而不是
=
解决了这个问题,但我的问题是有人能解释这个行为吗?

永远不要将字符串与
==
进行比较=

使用
(str1.equals(str2))
(!str1.equals(str2))

==
=比较非基元类型的对象引用


equals()
在类重写从
对象继承的此方法时比较对象的内容
切勿将字符串与
=
进行比较=

使用
(str1.equals(str2))
(!str1.equals(str2))

==
=比较非基元类型的对象引用


equals()
在类重写它从
Object
继承的此方法时比较对象的内容,以便尝试回答问题的一部分,即为什么它会在某些时间工作。JVM有一些解理器优化,尝试重用相同字符串的引用,而不是创建具有相同内容的新引用。在Win XP上运行时,您的JVM可能有这些优化,而Win 7没有(它们是相同的版本吗?)

很好地介绍了这个主题,公认的答案讨论了向常量池中实际添加字符串的方法(调用
.intern()
)。就确定相等性而言,这不是一个稳定的解决方案,因为JVM总是优先于您在Java代码中所做的任何内存管理选择


此外,我还发现了这个有趣的选项(
-XX:+UseStringCache
)以及它的功能。也许你的Win XP JVM有服务器优化,而你的Win 7没有?

所以试着回答一下为什么它会在某些时候工作的问题。JVM有一些解理器优化,尝试重用相同字符串的引用,而不是创建具有相同内容的新引用。在Win XP上运行时,您的JVM可能有这些优化,而Win 7没有(它们是相同的版本吗?)

很好地介绍了这个主题,公认的答案讨论了向常量池中实际添加字符串的方法(调用
.intern()
)。就确定相等性而言,这不是一个稳定的解决方案,因为JVM总是优先于您在Java代码中所做的任何内存管理选择


此外,我还发现了这个有趣的选项(
-XX:+UseStringCache
)以及它的功能。也许你的Win XP JVM有服务器优化,而你的Win 7没有?

虽然我不能解释为什么它在一个操作系统中工作,而在另一个操作系统中不工作,但我可以说temp!=prev不是你想象的那样。即比较对象引用而不是值如果观察结果正确,则在一个版本中,replaceFirst()返回对同一对象的引用,但在另一个版本中,只返回对具有相同值的字符串的引用。猜测实现不同。在比较字符串时,使用.equals()检查值是否相同,=检查对象引用是否相同(完全相同的对象)。equals()不是!=除非你的意思是使用.equals()==false或其他什么,否则这可能是问题的一部分
temp
regex
的值是什么?虽然我不能解释为什么它在一个操作系统中工作,而在另一个操作系统中不工作,但我可以说temp!=prev不是你想象的那样。即比较对象引用而不是值如果观察结果正确,则在一个版本中,replaceFirst()返回对同一对象的引用,但在另一个版本中,只返回对具有相同值的字符串的引用。猜测实现不同。在比较字符串时,使用.equals()检查值是否相同,=检查对象引用是否相同(完全相同的对象)。equals()不是!=除非您的意思是使用.equals()==false或其他什么,否则这可能是问题的一部分
temp
regex
的值是什么?此答案很好地解释了原因:此答案很好地解释了原因:感谢您尝试回答问题中稍微有趣的部分。但为了得分,我认为它还应该包含一些关于“改进”引入了这种新行为的参考:)感谢您尝试回答问题中稍微有趣的部分。但为了得分,我认为它还应该包含一些关于“改进”引入了这种新行为的参考:)