字符串比较结果b / w ==和String#replace用==的差异 - java

This question already has answers here:

Closed 7 years ago.

Possible Duplicate:
String comparison and String interning in Java

我对Java中的字符串比较有一点疑问,请考虑以下代码:

if("String".replace('t','T') == "String".replace('t','T')) {
  System.out.println("true");
}
else {
  System.out.println("false");
}

上面的代码始终打印false,就像我尝试这样:

if("STring" == "STring") {
  System.out.println("true");
}
else {
  System.out.println("false");
}

它将始终打印true。是的,我知道应该使用String.equals() or equalsIgnoreCase()方法完成字符串比较。但这是面试中提出的问题之一,我很困惑。谁能指导我这种行为?

据我所知,在代码片段1中,"String.replace('t','T')返回对象,因此对象比较返回false。我对吗?

参考方案

“ String.replace('t','T')返回对象,因此对象比较
返回false。我对吗?

是的,对于这种情况,您是对的。 String#replace(或与此有关的String类的任何方法)将返回一个新的String对象(您可以猜测为什么?不可变)。因此,您必须使用equals方法进行比较,以比较它们的内容。

现在,在第二种情况下:-

"STring" == "STring"

您正在比较两个字符串文字。现在,由于Java中的String literals are interned,所以两个文字都是相同的(从某种意义上说,它们指向相同的内存位置),因此==比较为您提供了true

使用==equals进行比较的不同之处在于,==比较参考值-即对象的内存位置值,这对于两个不同的字符串对象将是不同的,就像在第一种情况下一样。而equals比较这些对象中的实际内容。

Java:找到特定字符并获取子字符串 - java

我有一个字符串4.9.14_05_29_16_21,我只需要获取4.9。数字各不相同,所以我不能简单地获得此char数组的前三个元素。我必须找到最正确的.并将其子字符串化直到那里。我来自Python,因此我将展示Python的实现方法。def foobar(some_string): location = some_string.rfind('.&…

在Map中,如果我们使用现有键进行修改,则不会获得ConcurrentModificationException - java

我有以下代码,我希望从情况2的情况下抛出ConcurrentModificationException,但它运行成功。据我所知,如果我对地图中的单个键执行相同的操作,则不会抛出异常,因为here但是当我重现这种具有两个案例的多个密钥的场景时,通过新密钥修改。通过现有密钥进行修改。情况1: Map<String,String> mp = new H…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java Double与BigDecimal - java

我正在查看一些使用双精度变量来存储(360-359.9998779296875)结果为0.0001220703125的代码。 double变量将其存储为-1.220703125E-4。当我使用BigDecimal时,其存储为0.0001220703125。为什么将它双重存储为-1.220703125E-4? 参考方案 我不会在这里提及精度问题,而只会提及数字…