String.replaceFirst不同的行为

时间:2012-11-29 17:31:21

标签: 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;
                temp = temp.replaceFirst(regex, " ");
            } while (temp != prev);
            return nrOfIterations;
        }

replaceFirst()返回相同的对象,如果它没有修改任何东西,循环在WIN XP上结束。在Win7上它继续循环,因为!=总是返回false,因为例程返回一个新对象,即使它没有改变任何东西。   使用.equals()代替!=解决了这个问题,但我的问题是,任何人都可以解释这种行为吗?

2 个答案:

答案 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没有?