-1

可能重复:
如何比较 Java 中的字符串?

当我将以下代码作为“java XYZ BOY”运行时,输出为“无效类型”,如何?

public class XYZ 
{
    public static void main(String args[])
    {


        if(args[0]=="BOY")
            System.out.println("He is boy");

        else if(args[0]=="Girl")
            System.out.println("She is girl");

        else
        System.out.println("Invalid type");


    }
}

但是,当我使用 时args[0].equals("BOY"),它会提供所需的输出。我想知道为什么我不使用时会出现问题String.equals()

4

3 回答 3

6

运算符==测试两个变量是否引用了您不感兴趣的同一个对象。相反,您想知道两个 String 变量是否引用了以相同顺序和相同大小写保存相同字符的 String 对象,这是做什么equals(...)的,或者不管大小写,这是做什么equalsIgnoreCase(...)的。

equals(...)所有类都从最终的父类Object中获得一个默认方法,如果没有被覆盖,它将执行与==API 相同的操作:

Object 类的 equals 方法实现了对象上最有区别的可能等价关系;也就是说,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象(x == y 的值为 true)时,此方法才返回 true。

许多类都重写了这个方法,以使用他们自己的对类有意义的相等性测试。String 就是这样一个类。有关 String 如何执行此操作的更多详细信息,请查看其API,其中指出:

将此字符串与指定对象进行比较。当且仅当参数不为 null 并且是表示与此对象相同的字符序列的 String 对象时,结果才为真。

说了这么多——投票结束这个问题作为重复。

于 2012-09-22T14:24:13.717 回答
1

您看到“无效类型”是因为您使用的是 == 运算符。== 运算符用于比较两个具有相同值的对象及其引用是否应该相同。尽管在您的第一个条件下您使用的是 == 运算符,但它会返回 false。因为即使值相同但对象也不相同。接下来在第二种情况下,您正在检查 BOY==GIRL 这将返回 false。因此它将打印“无效类型”,即

于 2012-09-22T14:31:58.180 回答
1

如果某些对象具有相同的内容,则认为它们是相同的。对于那些,用于.equals(Object)比较对象内容。

如果某些对象是相同的实例,则它们被认为是相同的。对于那些,用于==比较对象实例。

您可以通过覆盖来更改对象的内容比较public boolean equals(Object),但如果这样做,请记住您必须遵守三个规则,Java 框架的其余部分才能正常工作。

  1. 自反:a.equals(a) 必须为真。
  2. 对称:如果 a.equals(b),则 b.equals(a) 必须为真。
  3. 传递:如果 a.equals(b) 和 b.equals(c) 则 a.equals(c) 必须为真。

此外,相等操作应该是一致的,这样如果 a.equals(b) 并且没有对 a 或 b 进行更新,那么 a.equals(b) 应该保持为真。

public int hashcode()一旦你覆盖了equals,你可以通过覆盖返回相同的值来获得哈希相关集合的性能改进,只要equals(...)会返回true。equals(...)此外,如果返回 false ,它返回相同值的机会应该非常低。不需要进行“完美”哈希,hashcode(...)如果返回 false,则保证返回不同的值equals(...),因为所有 Java 集合例程equals(...)在检查可能hashcode(...).

于 2012-09-22T14:34:12.820 回答