zoukankan      html  css  js  c++  java
  • 【Java】hashcode()和equals()

    大家知道,在集合中判断集合中的两个元素是否相同,依赖的是hashcode()和equals()两个方法。

    > 一个简单的实验

    public class Teacher {
        
        private Integer id = null;
    
        public Teacher(Integer id) {
            super();
            this.id = id;
        }
    
        @Override
        public String toString() {
            StringBuilder builder = new StringBuilder();
            builder.append("Teacher [id=").append(id).append("]");
            return builder.toString();
        }
        
        /*
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((id == null) ? 0 : id.hashCode());
            return result;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Teacher other = (Teacher) obj;
            if (id == null) {
                if (other.id != null)
                    return false;
            } else if (!id.equals(other.id))
                return false;
            return true;
        }
        */
        
    }
    View Code
    import java.util.ArrayList;
    import java.util.Collection;
    
    
    public class Call {
    
        public static void main(String[] args) {
            Collection<Teacher> c = new HashSet<Teacher>();
            for (int i = 0; i < 5; i++) {
                c.add(new Teacher(i));
            }
            
            System.out.println("Collection -> " + c);
            
            Teacher t1 = new Teacher(1);
            System.out.println("Teacher -> " + t1);
            
            System.out.println(c.contains(t1));
        }
    
    }
    View Code

    执行后,你可以看到:

    Collection -> [Teacher [id=0], Teacher [id=1], Teacher [id=2], Teacher [id=3], Teacher [id=4]]
    Teacher -> Teacher [id=1]
    false
    View Code

    很明显,集合认为id为1的对象是不存在集合中的。
    因为,集合依靠hashcode()和equals()判断元素是否相等,而Object的hashcode()返回对象的地址计算散列码,Object的equals()是比较对象的地址。所以,在两个对象(虽然对象的内容相同)的情况下,集合认为他们是不同的。

    这时候,需要覆盖这两个方法(你可以把上述代码这两个方法的注释解开),然后看执行结果。

    当然,对于一些集合对其元素进行线性对比的,则只重写equals()也是也行的,比如ArrayList。(当然,为了程序的可维护性,最好还是hashcode()和equals()都重写,你怎知道以后是否有人修改成别的集合实现类型呢?)

  • 相关阅读:
    SQL复制表
    文件流 修改二进制文件
    C#代码开启或关闭window service
    程序员之间的相处
    .NET实现图片下载(后台)
    当要存入数据的数据为null时 必须转换成DBNull.Value
    Maven第三篇【Maven术语、pom.xml介绍】
    Maven第二篇【Idea下使用Maven】
    Maven第一篇【介绍、安装、结构目录】
    SSM整合开发
  • 原文地址:https://www.cnblogs.com/nick-huang/p/5192619.html
Copyright © 2011-2022 走看看