Java面试准备四:equals()

来源:互联网 发布:淘宝无线视频怎么添加 编辑:程序博客网 时间:2024/05/18 01:58

该系列的Java面试复习内容全参考自近一个月的面试总结,在此谢谢博主的分享。
下面主要是我根据博主列出的Java基础部分需要了解的内容进行复习所做的笔记。这里只是为了记录,由于自身水平实在不怎么样,难免错误百出,有错的地方还望大家多多指出,谢谢。

1. equals()方法总结

参考equals()方法总结
超类Object中都由equals()这个方法,该方法主要用于比较两个对象是否相等。该方法的源码如下:

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

我们知道所有的对象都拥有标识(内存地址)和状态(数据),同时“==”比较两个对象的内存地址,所以说使用Object的equals()方法是比较两个对象的内存地址是否相等。但是我们很多时候比较两个对象是否相等并不是看它们引用的内存地址是否相等,实际上JDK中,String、Math等封装都对equals()方法进行了重写。String的equals方法是比较两个字符串的内容是否相等,而不仅仅是比较引用的内存地址是否相等。至于其他的封装类也都差不多。

在equals()中使用getClass进行类型判断
我们在覆写equals()方法时,一般都是推荐使用getClass来进行类型判断,不是使用instanceof。我们都清楚instanceof的作用是判断其左边对象是否为其有变类的实例,返回boolean类型的数据。可以用来判断继承中的子类的实例是否为父类的实现。注意后面这句话:可以用来判断继承中的子类的实例是否为父类的实现,正式这句话在作怪。我们先看如下实例:
父类:Person

public class Person {        protected String name;        public String getName() {            return name;        }        public void setName(String name) {            this.name = name;        }        public Person(String name){            this.name = name;        }        public boolean equals(Object object){            if(object instanceof Person){                Person p = (Person) object;                if(p.getName() == null || name == null){                    return false;                }                else{                    return name.equalsIgnoreCase(p.getName ());                }            }            return false;       }    }

子类:Employee

public class Employee extends Person{        private int id;        public int getId() {            return id;        }        public void setId(int id) {            this.id = id;        }        public Employee(String name,int id){            super(name);            this.id = id;        }        /**         * 重写equals()方法         */        public boolean equals(Object object){            if(object instanceof Employee){                Employee e = (Employee) object;                return super.equals(object) && e.getId() == id;            }            return false;        }    }

上面父Employee类Person和子类Employee都重写了equals()。测试程序如下:

 public class Test {        public static void main(String[] args) {            Employee e1 = new Employee("chenssy", 23);            Employee e2 = new Employee("chenssy", 24);            Person p1 = new Person("chenssy");            System.out.println(p1.equals(e1));            System.out.println(p1.equals(e2));            System.out.println(e1.equals(e2));        }    }

按理来说输出结果应该全部都是false,但事与愿违:结果是:true、true、false。
原因就是p1.equals(e1),是调用p1的equals方法,该方式使用instanceof关键字来检查e1是否为Person类,因为instanceof是判断其左边对象是否为其右边类的实例,也可以用来判断继承中的子类的实例是否为父类的实现。他们两者存在继承关系,肯定会返回true,而两者name又相同,所以结果肯定是true。
所以出现上面的情况是使用了关键字instanceof,这时非常容易出乱子的。故在覆写equals时推荐使用getClass进行类型判断,而不是使用instanceof。

0 0