Java equal vs ==(String Instance Variable)

时间:2014-12-14 10:34:17

标签: java

据我所知==基本上比较了内存​​位置,所以我完全理解第1行返回true。但是我们没有在类中重写等于的方法,那么为什么第2行返回true?

private String category = "procedura1";
public static void main(String[] args) {
    Lang obj1 = new Lang();
    Lang obj2 = new Lang();
    if (obj1.category == obj2.category) {  ///  Line 1
        System.out.println("Equal");
    } else {
        System.out.println("Not equal");
    }
    if (obj1.category.equals(obj2.category)) {  /// Line 2
        System.out.println("Equal");
    } else {
        System.out.println("Not equal");
    }
}

为什么以下第3行返回false?

    String a1 = new String("String 1");
    String a2 = new String("String 1");

    if (a1 == a2) {      // Line 3
        System.out.println("True");
    } else {
        System.out.println("False");

    }

    if (a1.equals(a2)) {
        System.out.println("True");
    } else {
        System.out.println("False");

    }

4 个答案:

答案 0 :(得分:2)

category属于String类型,使用String equals()实现。

答案 1 :(得分:0)

这是因为您完全忽略了自定义对象并转到定义了equals方法的字段。

如果您正在做这样的事情:

if(obj1.equals(obj2))

...如果在equals上未定义Lang,您就会遇到问题。但是,正如我们所知,equals确实是在String上定义的,所以你会发现它工作正常。

这当然是假设category实际上 String;我现在只推断它。

答案 2 :(得分:0)

category字段的值是一个String literal ,它是interned,因此每个实例的类别都引用相同的 String对象因此根据==它们是相等的。

equals()的合同是,当它自己被调用时它返回true,并且你可以依赖JDK中遵守这个合同的类。

答案 3 :(得分:0)

这是真的,因为你基本上比较了两件事物......这相当于:

public static void main(String[] args) {
    String str1 = "procedura1";
    String str2 = "procedura1";

    if (str1.equals(str2)) {
        System.out.print("Both String objects represent the same sequence of characters");
    }
}

但如果你可以比较一下,那就是:

public static void main(String[] args) {
    Lang obj1 = new Lang();
    Lang obj2 = new Lang();

    if (obj1.equals(obj2)) {
        System.out.println("Both Lang objects are equal.");
    }
}

你不会得到任何消息..希望这有帮助;)