zoukankan      html  css  js  c++  java
  • hashcode和equals方法小记

    • 在正确的逻辑下,两个对象的hashcode一样,不代表两个对象equals;两个对象equals,则hashcode一定一样
    • 在HashSet集合中,是不允许有重复的元素的,那么,set怎么才知道元素是不重复的?HashSet中会维护一张hash表,在对象存入时,会根据对象的hashcode定位到hash表中的位置,如果位置上是空的,那么该对将象直接存入hash表,如果在位置上不是空的,则进行equals比较(因为hashcode一样并不代表对象equals),equals返回true,则不存入,否则,放入hash表同个位置的链中。
    • hashcode方法默认是获取对象地址值。
    • 为什么jdk极力推荐重写了equals方法后再重写hashcode方法?

    如果你不这么做的话程序可能和你预想要的结果会有点不一样。试想有个Student对象,有id和name两个字段,你重写其equals方法,让它根据id和name来判断两个对象是否equals,你现在要将两个相同id和name的student存入HashSet,HashSet如上所述是不允许相同元素存在的,HashSet判断到两个对象的hashcode是不相等的,直接存入了hash表中。你本来想看到的是两个对象一样,只存入一个,但是目前的结果,显然不是你想看到的。

    public class Student{
      
      private String id;
      private String name;
      //--getter setter---
    }

    所以这就是java推荐你重写equals方法后还要重写hashcode方法,这样在使用诸如HashSet和HashMap等集合时才能达到预期结果。

  • 相关阅读:
    第三十章 混合线程同步构造
    第二十九章 基元线程同步构造
    第二十八章 I/O限制的异步操作
    第二十七章 计算限制的异步操作
    第二十六章 线程基础
    第二十五章 与WinRT组件互操作
    css实现排序箭头
    js中的toFixed神坑
    react使用中碰到的小问题
    看到一个js中sleep的例子,挺好玩的
  • 原文地址:https://www.cnblogs.com/2333/p/6607293.html
Copyright © 2011-2022 走看看