hashCode是jdk根据对象的地址算出来的一个int数字,即对象的哈希码值,表明了该对象在内存中的存储位置。数据结构
hashCode()方法是顶级类Object类的提供的一个方法,全部的类均可以进行对hashCode方法重写。性能
在比较一个类是否相同时每每会重写equals方法,值得注意的是,重写equals方法的同时必须也要重写hashCode方法,屡次调用一个对象的hashCode方法必须返回同一个数字,这也是必须遵照的规范,否则会形成潜在的危害。优化
当两个对象equals相同,hashCode规定也必须相同,但反过来就不必定,两个对象对应一个hashCode,但equals却并不相等。这就是传说中的hash冲突。spa
HashMap是以hashCode取模数组形式存放值的,那两个对象hashCode同样会不会形成前一个对象的值覆盖呢?答案是不会,由于它采用了另一种链表数据结构来解决hash冲突的状况,即便两个对象的hashCode同样,它们会放到当前数组索引位置的链表中。设计
HashSet经过HashMap来实现的,用来存储不重复数据的,怎么判断里面的对象是否重复呢?判断对象是否重复便是判断对象里面的属性是否都同样,这时必须是重写了equals方法去比较对象的里面全部的值,而不是比较引用地址,比较引用地址它们永远都不相等,除非是同一个对象。经过equals比较的过程性能是很是不佳的,因此有了hashCode这个设计,简单两个数字的比较性equals无法比的,因此能够先经过比较对象的hashCode是否同样肯定是否是同一个对象,若是hashCode不同这时确定就不是同一个对象,反之若是hashCode同样并且equals或者==也同样这确定就是同一个对象。因此先比较数字的hashCode再比较equals或者==,这样效率会明显提高。3d
假如重写equals而不重写hashCode方法,多个对象属性值同样的它们的hashCode确定是不同的,这时做为key在put到map中的时候,就会有多个这样的key,而达不到对象做为key的场景,一样也达不到HashSet去重的效果。对象
HashSet经过封装HashMap实现,用来存储不重复数据的,怎么判断里面的对象是否重复呢?blog
就是重写HashSet<E>的对象E的equals方法。若是E的equals方法返回true,那么就是相同的对象;若是返回false就是不一样的对象。可是经过equals就是太慢了,有啥优化的办法吗?有,先比较E的hashCode,若是hashCode不一样,那么就是不一样的E,由于绝大多数状况下都是不一样的E,因此先比较E的hashCode绝对能提升效率的。索引
这里会出现一个新问题,若是在HashSet的E中重写了equals方法可是没重写hashCode方法的话。Equals实际上相同的对象hashCode可能并不相同,这样的话以前想到的优化方案【先比较E的hashCode】就失效了。因此必须再想办法堵住这个bug,就是必须同时重写hashCode方法,使E的逻辑知足:若是equals方法返回true时,hashCode返回的结果也是相同的。
hashCode是jdk根据对象的地址算出来的一个int数字,即对象的哈希码值,表明了该对象在内存中的存储位置。
是何意义?就是说若是Object不一样,那么理论上hashCode的值就是不一样的。
这样的话若是不重写E的hashCode方法的话,HashSet比较E是否相同的优化【先比较E的hashCode】就失去意义了——不重写E的hashCode方法(equals相同的对象)在优化比较时就有可能被滤过去了,HashSet反而存储了实际上相同的对象,这就乱套了。