0

以下例程在 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()而不是!=解决这个问题,但我的问题是任何人都可以解释这种行为吗?

4

2 回答 2

2

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

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

==!=比较非原始类型的对象引用。

equals()当类重写它继承自的此方法时,比较对象的内容Object

于 2012-11-29T17:33:59.417 回答
2

因此,尝试回答为什么它有时会起作用的部分问题。JVM 有一些切割器优化,尝试并重用相同字符串的引用,而不是创建具有相同内容的新引用。在 Win XP 上运行时,您的 JVM 可能有这些优化,而您的 Win 7 没有(它们是相同的版本吗?)

这个 SO Question很好地涵盖了这个主题,并且接受的答案讨论了将字符串实际添加到常量池(调用.intern())的方法。在确定相等性方面,这不是一个稳定的解决方案,因为 JVM 将始终优先于您在 Java 代码中做出的任何内存管理选择。

在深入研究JVM 选项时,我确实发现了这个有趣的选项 ( -XX:+UseStringCache) 和这个关于它的作用的SO question 。也许你的 Win XP JVM 有 -server 优化,而你的 Win 7 没有?

于 2012-11-29T17:38:34.823 回答