Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java';s String#replace()方法对字符和字符串的工作方式是否不同?_Java_String - Fatal编程技术网

为什么Java';s String#replace()方法对字符和字符串的工作方式是否不同?

为什么Java';s String#replace()方法对字符和字符串的工作方式是否不同?,java,string,Java,String,为什么以下表达式的计算结果为false aStr.replace("H", "H") == "Hello" 而此替代表达式的计算结果为true aStr.replace('H', 'H') == "Hello" 字符串比较应使用.equals() 如果比较是在字符串文本之间进行的,那么==比较可能有效,因为文本缓存在池中并引用相同的变量 equals()比较值,=比较引用。Java缓存字符串池中的Stringliteral,所以,若字符串中并没有变化,它将从池中获取一个不可变的实例,这样这两

为什么以下表达式的计算结果为false

aStr.replace("H", "H") == "Hello"
而此替代表达式的计算结果为true

aStr.replace('H', 'H') == "Hello"

字符串比较应使用
.equals()

如果比较是在字符串文本之间进行的,那么==比较可能有效,因为文本缓存在池中并引用相同的变量


equals()
比较值,
=
比较引用。

Java缓存字符串池中的
String
literal,所以,若
字符串
中并没有变化,它将从池中获取一个不可变的实例,这样这两个实例都引用内存中的同一个实例,因此引用上的
=
返回
true

所以要比较字符串对象,应该使用
equals()
method/
compareTo()
method


另请参见

使用String.equals()比较字符串

        System.out.println((aStr.replace("H","H").equals("Hello")));

将返回true

字符串
类的
替换(char,char)
方法扫描以查找匹配的字符。如果找不到,它将按原样返回主机
String
实例。自然地,通过
=
操作符将返回的引用与原始引用进行比较会返回true,因为这是在测试引用相等性,并且两个引用是相同的

但是,如果使用您的示例,原始字符串包含一个“H”字符,则返回的字符串将与原始字符串不同(即使每个字符都是相同的);它将是一个新分配的实例,通过引用相等(同样是
=
操作符)进行比较将失败。通过
对象#equals()
将返回的
字符串
与原始字符串进行比较将返回true,因为这两个字符串是等效的,但它们是不同的实例,无法通过引用相等进行匹配

相反,
String#replace(CharSequence,CharSequence)
将目标字符串视为正则表达式;它在内部使用
Matcher#replaceAll()
将目标模式中的匹配项替换为提供的替换序列

现在的问题是,即使模式不匹配,
Matcher#replaceAll()
是否会返回原始字符串或新分配的副本。通过阅读Oracle库中的代码,如果
匹配器
没有找到要匹配的模式,它会在原始
CharSequence
上返回
CharSequence#toString()
,对于
字符串
对象,它只会返回未受干扰的
引用。这让我怀疑你是否在这里报告了真实的结果

提出的问题中一个突出的漏洞是
aStr
引用的
字符串的原始内容。你可能想展示这样的声明

final String aStr = "Hello";

但你没有。两个表达式的结果应取决于
aStr
是否包含“H”字符。假设是这样,我希望这两个表达式都会产生false,假设
字符串#replace()
重载中没有任何一个在起作用。我们知道字符串文本是内部的,但是我们在Oracle库中看到的两个
string#replace()
方法的实现中构造的返回值是新分配的,而不是从内部池中提取的。

使用
.equals()
比较
String
s.
aStr
是否包含“H”字符?每个人都错过了根本问题,这不是重复的!在这种特定的情况下,
replace(char,char)
的实现以
if(oldChar!=newChar){…}返回该值开始因此您的简单测试返回了相同的实例。。。这就是
==
成功的原因。正如已经提到的,使用<代码>等于比较对象是等价的,而不是检查同一个对象实例的<代码> ==/COD>。正如李察指出的,我正在编写一个对实际问题的冗长回答,但是即使是,如果<代码> AST不包含<代码> h < /代码>字符,然后,对
String#replace(CharSequence,CharSequence)
的第一次调用也应该返回true。这与Oracle的JDK有关。研究一下Matcher#replaceAll()
是如何工作的,看看为什么。我重新打开了它,因为我认为有一些人忽略了真正的问题。