记录自己今天理解的 equals 方法

来源:互联网 发布:激光打标机软件配套 编辑:程序博客网 时间:2024/05/20 23:36

今天在看java视频的时候,没有理解他所讲的 equals 方法,于是百度、问同学,总算弄懂了(也许只是我觉得懂了),就像记录一下自己的见解。


  a:

String s1,s2;

s1 = new String("god");

s2 = new String("god");

System.out.println(s1.equals(s2));


这里的结果是 true,因为这里的equals比较的是两个对象的内容即“god”,而如果是这样的话:

 b:

public class EqualsTest
{
public static void main(String[] args)
{
Student s1 = new Student("zhangsan");
Student s2 = new Student("zhangsan");

System.out.println(s1.equals(s2));
}
}


class Student
{
String name;


public Student(String name)
{
this.name = name;
}

}



 这是为什么?


后来了解了,原来在a中的s1,s2因为是String类型的,而在源代码中String类里已经将equals重写了,下面是源代码:


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;
    } 


 而在b中,因为s1,s2是Student类型的,而Student类没有重写equals方法,s1.equals(s2) 调用的是Object类中的equals方法,而Object类中的equals方法是比较地址的,如下是Object中的equals方法

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

所以,equals方法比较的是s1,s2的地址,而不是内容,所以输出就会为false.



总结的话,就是说如果说比较的对象的类中没有重写equals方法,那么就是比较的地址,如果比较的对象的类中重写了equals方法,那么就要看重写后的方法实现的是什么。



0 0
原创粉丝点击