为什么字符串 == “” 在 Java 中返回 false 而在 C# 中返回不

本文关键字:返回 false 而在 Java 字符串 为什么 | 更新日期: 2023-09-27 18:37:21

>我有一个简单的递归方法,用Java和C#编写

爪哇岛

public static String reverse(String letter) {
    if (letter == "")
        return "";
    else
        return letter.substring(letter.length() - 1)
                + reverse(letter.substring(0, letter.length() - 1));
}

C#

public static string reverse(string letter)
{
    if (letter == "")
        return "";
    else
        return letter[letter.Length - 1]
                + reverse(letter.Substring(0, letter.Length - 1));
}

但是Java版本在letter == ""失败,即使字母为空,它也返回false。为什么 C# 版本有效,而 Java 版本失败?

为什么字符串 == “” 在 Java 中返回 false 而在 C# 中返回不

在 C# 和 Java 中,默认情况下,==运算符检查引用是否相等。

但是,在 .NET 中,string 类型的重载==运算符以检查值是否相等:

public static bool operator ==(string a, string b)
{
    return string.Equals(a, b);
}

使用这两种语言时需要考虑的另一个因素是字符串实习,这甚至可能导致引用相等对可能看起来不同的字符串成功。从 MSDN(适用于 C#):

公共语言运行库通过维护一个表(称为 intern 池)来节省字符串存储,该表包含对程序中以编程方式声明或创建的每个唯一文本字符串的单个引用。因此,具有特定值的文本字符串的实例在系统中仅存在一次。

例如,如果将同一文本字符串分配给多个变量,

则运行时将从实习生池中检索对文本字符串的相同引用,并将其分配给每个变量。

字符串实习适用于 Java 和 C#,通常提供一致的结果。例如,两种语言都在编译时评估字符串连接,这意味着"a" + "b"存储为 "ab"

"ab" == "a" + "b"                                      // Java: Gives true
object.ReferenceEquals("ab", "a" + "b")                // C#:   Gives true

但是,获取零长度子字符串时,只有 C# 返回暂留的空字符串:

"" == "abc".substring(0, 0)                            // Java: Gives false
object.ReferenceEquals("", "abc".Substring(0, 0))      // C#:   Gives true

因为对于对象,运算符==测试引用的相等性。您必须始终使用equals

字符串是一个对象。

当您使用 == 时,您正在进行身份比较。这意味着a == b在询问ab是否是同一个对象。

变量 letter 和常量对象""不是同一个对象,因此得到 false。

相反,您应该使用:

letter.equal("")

这是在询问letter对象的值是否等于 "" ,这就是您要问的问题。

有几种方法可以做到这一点:

  1. 为了比较Java中的字符串,我们必须使用.equals().equalsIgnoreCase()方法。 ... if (letter.equals("")) { ...
  2. 检查长度会告知此字符串长度是否为 0。 ... if (letter.length() == 0) { ...
  3. 在Java中(letter.length() == 0)是等价的。这就是.isEmpty()方法。

顺便说一句:
别忘了if (letter == null).

在java中

==比较两个变量是否包含相同的对象。常量""可能始终是 String 的不同实例,即使这两个实例可能包含相同的字符串值。

如果要比较对象的内容,那么在 String 的情况下,可以这样做:

letter.equal(")

在Java中,

==运算符比较变量中的值。

因此,在基元

类型变量的情况下,它将起作用,因为变量中的值是基元的实际值。

例如

 int a = 1;
 int b = 2;
 if(a == b) { 

在上面,它正在做你认为它正在做的事情。


但是,对于引用类型变量,变量中的值是对它们所指向的对象的引用。

因此,如果要进行标识检查(即要查看两个不同的变量是否指向同一对象),则必须使用==。如果变量引用了两个不同的对象(对象的内容相同,则返回 false。

但是,如果您尝试露营的是对象的内容,那么您必须使用equals方法(但您必须确保equals方法已正确实现)。

例如

String a = "a";
String b = new String("a");
if(a == b) { //... identity check (returns false)
//...
if(a.equals(b)) { //... comparing the contents (returns true)

'因为您正在比较引用,请使用 String.equals 或 String.equalsIgnoreCase

你应该使用equalsletter.equals("")这样的方法,因为相等运算符(==)最终比较对象的引用而不是值。

此外,对于C#来说,更好的做法是使用string.Empty而不是""

if (letter == string.Empty)

== 适用于字符串对象((在谷歌中查找字符串池 java),但你应该(并且必须)真正使用 .equals()。