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

    我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类。Ojbect类中有两个方法equals、hashCode,这两个方法都是用来比较两个对象是否相等的。

    在未重写equals方法我们是继承了object的equals方法,那里的 equals是比较两个对象的内存地址,显然我们new了2个对象内存地址肯定不一样

    • 对于值对象,==比较的是两个对象的值
    • 对于引用对象,比较的是两个对象的地址

    默认的equals方法同==,一般来说我们的对象都是引用对象,要重写equals方法。

    现在有一个学生对象,有属性学号跟姓名,现在我新建了一个学生对象,又从数据里查出一个学生对象,这两个对象的学号跟姓名都一样,那这两个对象是不是相等呢?一般情况下,除非你有特殊需求要处理,这两个对象是相等的,可如果用==去比较,返回的结果是错误的。

    这时候我们就必须重写equlas方法了。如果学号是主键,在equals方法里,我们认为只要学号相同,就可以返回true。

    hashCode方法也是可以用来比较两个对象是否相等的。但是我们很少使用,应该说是很少直接使用。hashCode方法返回的是一个int值,可以看做是一个对象的唯一编码,如果两个对象的hashCode值相同,我们应该认为这两个对象是同一个对象。

    一般如果使用java中的Map对象进行存储时,他会自动调用hashCode方法来比较两个对象是否相等。

    所以如果我们对equals方法进行了重写,建议一定要对hashCode方法重写,以保证相同的对象返回相同的hash值,不同的对象返回不同的hash值。

     

    hashset,当有元素要存入HashSet中时,便会首先通过hashCode()方法得到该对象的一个哈希码,并利用该哈希码通过一些转换算法映射成数组的下标索引,

    接下来便会判断该下标处是否为null若为null则会创建一个列表,此时将待插入的对象直接插入,若列表已经存在则利用equals()方法将带插入对象与列表中的元素逐个比较,相等则忽略,不存在相等元素则直接插入。

    重写hashcode方法,也要同时重写equals()

  • 相关阅读:
    Delphi-idHttp-JSON用法
    在delphi中, reintroduce作用
    请求转发:MVC设计模式、细节、请求域属性的编程实例、请求重定向和请求转发的区别
    response常见应用、response细节、输出随机图片、定时刷新网页
    HttpServletRequest、request常用方法、request常见应用、请求转发、RequestDispatcher
    Action中取得request,session的四种方式
    List 三种遍历的方法
    java List遍历的方法
    Tag file directory /struts-tags does not start with "/WEB-INF/tags"
    【JavaScript吉光片羽】--- 滑动条
  • 原文地址:https://www.cnblogs.com/lnas01/p/5928886.html
Copyright © 2011-2022 走看看