意外在Java中为equals方法和==运算符输出以下代码

时间:2017-04-20 05:56:01

标签: java string operators

public class Counter {

    String s1;

    Counter(String s) {
        this.s1 = s;
    }

    public static void main(String[] args) {
        Counter t1 = new Counter("test");
        Counter t2 = new Counter("test");
        System.out.println(t1 == t2); //false - Output
        System.out.println(t1.equals(t2)); //false - Output

        String s1 = new String("rt");
        String s2 = new String("rt");
        System.out.println(s1 == s2); //false - Output
        System.out.println(s1.equals(s2)); //true - Output
    }
}

原因:为equals方法获取不同的输出。

由于java.lang.String类重写equals方法,如果两个String对象包含相同的内容,则返回true,但如果两个引用指向同一个对象,则返回true。

对于==运算符我得到了正确的结果但是对于equals方法我在程序中有点困惑,因为输出不同。请问,有人可以分享他们对此的看法吗?提前谢谢

5 个答案:

答案 0 :(得分:0)

String课程会覆盖equals,但您的Counter课程不会,这就是equals==行为相同的原因。 t1.s1.equals(t2.s1)会返回true

答案 1 :(得分:0)

  

类Object的equals方法实现最具辨别力   对象可能的等价关系;也就是说,对于任何非null   引用值x和y,当且仅当x时,此方法返回true   和y引用相同的对象(x == y的值为true)。

您的班级Counter未覆盖equals方法,因此其行为与==相同。但是在String类中,如果字符串的内容匹配,则此方法将覆盖以返回true。您可以覆盖类中的方法以实现相同的功能

答案 2 :(得分:0)

equals()类的

String方法定义为:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

而Counter类的equals()方法定义如下(继承Object类)

public boolean equals(Object obj) {
    return (this == obj);
}

正如您所看到的,这两种方法都有不同的效果,您会得到不同的结果。如果你想要相同的结果,那么你可以覆盖equals()类中的Counter方法来实现类似String的功能,如下所示:

public class Counter {

    String s1;

    Counter(String s) {
        this.s1 = s;
    }

    @Override
    public boolean equals(Counter counter) {
        return this.s1.equals(counter.s1);
    }

    ...
    ...
}

答案 3 :(得分:0)

==equals不一样,==是一个可以比较对象的内存地址的操作。但是相等的方法只返回一个布尔值,它依赖于包含内部的相等方法。等于方法位于Object类。所以你可以覆盖方法,你可以说它是否相等。

在你的情况下

例如

class Counter {
       private int count;
       public boolean equals(Object another){
           return another instanceof Counter && ((Counter)another).count == this.count;
       }
}

因此,如果您要处理HashMap并将对象作为键,则需要覆盖等号方法,您需要覆盖hashcode方法。不仅是HashMap,其中涉及散列技术,这就是原因所在。 http://tutorials.jenkov.com/java-collections/hashcode-equals.html

答案 4 :(得分:0)

您的班级Counter既不会覆盖hashCode()也不会覆盖equals()。因此,您的班级Counter的行为与班级Object完全相同。只有两个Objects ==equals()代表同一个实例时才会equals()

如果您想更改此行为,则必须根据hashCode()方法定义的合同覆盖Counter equals() - (IBAction)shareBtnAction:(id)sender { NSString *textToShare = @""; NSURL *myWebsite = [NSURL URLWithString:@"www.facebook.com"]; NSArray *objectsToShare = @[textToShare, myWebsite]; UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:objectsToShare applicationActivities:nil]; NSArray *excludeActivities = @[UIActivityTypeAirDrop, UIActivityTypePrint, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAddToReadingList, UIActivityTypePostToFlickr, UIActivityTypePostToVimeo]; activityVC.excludedActivityTypes = excludeActivities; [self presentViewController:activityVC animated:YES completion:nil]; }