为什么String ==""在Java中返回false而在C#中不返回?

Tim*_*ess 1 c# java string

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

Java的

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

C#

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

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

Dou*_*las 6

在C#和Java中,==运算符默认检查引用相等性.

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

public static bool operator ==(string a, string b)
{
    return string.Equals(a, b);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

"ab" == "a" + "b"                                      // Java: Gives true
object.ReferenceEquals("ab", "a" + "b")                // C#:   Gives true
Run Code Online (Sandbox Code Playgroud)

但是,在获取零长度子字符串时,只有C#返回实例化的空字符串:

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


UmN*_*obe 5

因为对象操作符 ==测试引用的相等性.你必须经常使用equals

  • 确保你在'null`的情况下.否则`letter.anything`将抛出一个`NullPointerException`(``"something".equals(letter)`总是优于`letter.equals("something")`因为这个原因). (3认同)