gpt4 book ai didi

java - String.replaceFirst 不同的行为

转载 作者:行者123 更新时间:2023-12-01 18:57:02 26 4
gpt4 key购买 nike

以下例程在 WIN XP x32、JAVA 版本 7 Update 9 和 WIN7 x64、JAVA 版本 6 Update 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() 而不是 != 解决了这个问题,但我的问题是任何人都可以解释这种行为吗?

最佳答案

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

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

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

关于java - String.replaceFirst 不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13631398/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com