当前位置: 首页 > 面试题库 >

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

江浩慨
2023-03-14
问题内容

我对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对象(您可以猜测为什么?
Immutability )。因此,您将不得不使用equals方法进行比较,以比较它们的内容。

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

"STring" == "STring"

您正在比较两个字符串文字。现在,由于String文字是用Java
嵌入的,所以两个文字都是相同的(从某种意义上说,它们指向相同的内存位置),因此==比较可以得出true

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



 类似资料:
  • 我有两个向量: 我试图使用比较它们。不幸的是,给出了一个意想不到的结果。 虽然我希望: 那么,这是什么原因造成的呢?怎样才能达到预期的效果呢? 这个问题似乎与这样一个事实有关,即两个向量的最后一个元素与将更改为例如确实给出了预期的结果相同,并且还因为将设置为给出而不是。 编辑 换句话说,我希望丢失的元素(当长度不同时)作为零传递(只有似乎给出

  • 问题内容: 我试图比较2个1000字节的字符串,并想知道差异的确切位置,即;字符串与哪个字节不同。.是否有任何函数可以确定它? 问题答案: 我试图测试此处给出的答案,并且提出了另一个 更快 (通常情况下)的解决方案,尽管它不太优雅。 首先,让我们看看所提出的解决方案有多快: 如您所见,genexp比快很多,但这可能是由于它比查找第一个非等号字符要好得多。 现在,我们如何加快速度?好吧,我们可以使用

  • 除了后面使用正则表达式之外,java.lang.String的和方法有什么区别?对于简单的替换,如将替换为,有什么区别吗?

  • 问题内容: 在我编写的测试案例中,字符串比较似乎在SQL Server / .NET CLR之间的工作方式不同。 此C#代码: 将输出: 此SQL Server代码: 将输出: 为什么会有所不同? 问题答案: 这在此处记录。 Windows归类(例如)使用Unicode类型的归类规则。SQL排序规则没有。 这导致在两者之间对连字符的区别对待。

  • 我有字符串数组:15MB、12MB、1TB、1GB。我想通过遵循MB小于GB和TB的规则来对它们进行词典比较。所以最后我想得到:12MB,15MB,1GB,1TB。我找到了一个比较字母的方法: 我在考虑用数字和字母拆分字符串,但我如何用字母“MB”对它们进行排序。然后根据他们的数字。我是使用两个比较器还是其他什么?

  • 问题内容: 我听说散列(即将字符串或对象转换为数字)用于字符串等,因为比较数字比字符串更容易。如果为真,这是什么原因? 问题答案: 不一定是这种情况,但大多数时候可能是这样。 请考虑以下情况: 我想比较字符串“ apples”和“ oranges”。如果我只想确定“ apples” ==“ oranges”,我只需要比较每个字符串的第一个字符:’a’!=’o’=>“ apples”!=“ oran