对java中equals方法的简单理解

先附上equals的源码:

    public boolean equals(Object obj) {   
        return (this == obj);   //判断本类中的对象和传过来的obj对象比较是否相等。比较的是地址,返回的是一个布尔类型
    }

源码简洁明了,equals是Object类中的一个方法,很多时候我们都会用到

一、在Object中equals的作用是一个判断是否相等,而比较的规则是比较两个对象的地址,如果地址相等返回ture,否则返回false

eg:

public class equalstest {
    public static void main(String[] args) {
        Dog dd = new Dog();    
        Dog dd2 = new Dog();
        
        dd.equals(dd2);  //dd和dd2两个引用对象存储在栈内存中,保存的数据是两个不同的对象在堆内存中地址,显然两个不同的对象在堆内存中存储的地址不一样,所有返回false
        dd.equals(dd);   //同理,dd和dd比较返回的是ture,因为本来就是一个对象     
    }
}

我们可以得出equals比较的内容具体是:引用在栈内存中保存的地址。即dd和dd2在栈内存中保存的数据

 

二、因为所有创建的类都默认继承了Object,所以我们可以直接使用它,但是很多时候我们的需求并不是比较地址,这个时候就需要对equals进行重写

在很多java提供的类中,都重写equals来满足自己的需求,比如说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;
    }

从源码中看出比较的内容是:字符串的内容是否相等

eg:

public class equalstest {
    public static void main(String[] args) {    
        String aa = "abc";
        String bb ="abc";
        String cc ="def";
        
        System.out.println( aa.equals(bb) );  //返回的是ture
        System.out.println( cc.equals(bb) );  //返回的是false      
    }
}

 

三、因此当我们需要用equals进行比较的时候,我们也可以进行重写,比较规则由我们自己来订

在myeclipse中,也可以直接右键source,生成equals方法。但是和没生成一个效果(不知道是否是我理解的太片面),只是方便我们进行重写,不重写也是按照继承过来的equals的规则进行比较。

如图

 

posted @ 2019-02-12 16:44  hxh奔跑的春风  阅读(1331)  评论(0编辑  收藏  举报