浅说equals和hashCode的使用

106 阅读1分钟

1.equals方法

equals方法来至于Object类,所以每个类都会有equals方法,然后Object类中的equals方法其实对比的是两个对象,使用的运算符==实现的,可以看出默认的equals对比的是两个对象的引用地址(这里说的是引用类型非基础类型),然后代码如下

    public boolean equals(Object obj) {
        return (this == obj);
    }
  • 问题一、我想使用equals方法实现我自定义的对比,比如我有一个User对象,但是我想实现的是只要name的值相等,我就任务两个对象是相等。这里只是举个例子很多时候是为了对比两个对象不同内存地址的属性值是否相等。我要做的就是重写equals方法。这样我就实现了重新equals方法。
    class User{
        private  String name ;
        User(String name ){
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public  boolean equals(Object obj){
            User user = (User)obj;
            return user.getName().equals(this.name);
        }
    }
    public class Test
    {
        public static void main(String[] args)
        {
            System.out.println(new User("aa").equals(new User("aa")));
        }
    }

问题一、在我们开发时有一个规则是这样的。

hashCode()方法存在的主要目的就是提高效率,但是如果你想把对象放到散列存储结构的集合中时,是必须要重写的。
其他的条件可以不进行重写hashCode方法,这里我们构建一下重写hashCode的代码

    class User{
        private  String name ;
        User(String name ){
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public  boolean equals(Object obj){
            User user = (User)obj;
            return user.getName().equals(this.name);
        }
        @Override
        public int hashCode() {
            return this.name.hashCode();
        }
    }
    public class Test
    {
        public static void main(String[] args)
        {
            System.out.println(new User("aa").hashCode() == new User("aa").hashCode());
        }
    }