zoukankan      html  css  js  c++  java
  • equals()与hashcode()的理解

    我们都知道比较两个对象是否相等,== 对于基础类型是比较值,对于封装类是比较对象的引用---即地址。Object 中equals()是比较对象的地址,String 中重写了equals()、hashcode(),equals比较的是String类的值,同理Integer、Double也都重写了equals,hashcode方法。

    Set中对象是不允许重复的,那么它是通过什么方法判断元素是否重复呢,equals,那么假如Set中有1000个元素,equals1万次,那效率也太低了,它是通过hashCode()方法,jdk中hashCode是native方法,与本地机器有关,与内存地址有关。如果对象相等,那么他的hashcode必然相等。

    引用网络

    4.谈到hashcode()equals()就不能不说到hashset,hashmap,hashtable中的使用,具体是怎样呢,请看如下分析: 
    Hashset是继承Set接口,Set接口又实现Collection接口,这是层次关系。那么hashset是根据什么原理来存取对象的呢? 
    hashset中不允许出现重复对象,元素的位置也是不确定的。在hashset中又是怎样判定元素是否重复的呢?这就是问题的关键所在,经过一下午的查询求证终于获得了一点启示,和大家分享一下,在java的集合中,判断两个对象是否相等的规则是: 
    1),判断两个对象的hashCode是否相等 
    如果不相等,认为两个对象也不相等,完毕 
    如果相等,转入2) 
    (这一点只是为了提高存储效率而要求的,其实理论上没有也可以,但如果没有,实际使用时效率会大大降低,所以我们这里将其做为必需的。后面会重点讲到这个问题。) 
    2),判断两个对象用equals运算是否相等 
    如果不相等,认为两个对象也不相等 
    如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键) 
    为什么是两条准则,难道用第一条不行吗?不行,因为前面已经说了,hashcode()相等时,equals()方法也可能不等,所以必须用第2条准则进行限制,才能保证加入的为非重复元素。 

  • 相关阅读:
    MyEclipse错误积累--持续更新
    Git错误积累-持续更新
    MySQL错误积累-持续更新
    评价一个人,就是要看他把时间都花在哪了
    收集的yum命令博文
    Github 常用命令
    python库收藏
    [转载]Scikit Learn: 在python中机器学习
    Windows下python安装Matplotlib、Numpy和Scipy模块
    [LeetCode] #45 Jump Game II
  • 原文地址:https://www.cnblogs.com/guoyuqiangf8/p/2748850.html
Copyright © 2011-2022 走看看