hashCode()和equals()的重写。

HashSet元素添加过程

hashCode()和equals()的重写。**

*一、Set:存储无序的、不可重复的数据Hashset为例说明:
一、集合:存储无序的、不可重复的数据Hashset为例说明:*
1.无序性:不等于随机性.存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值!
2.不可重复性:保证添加的元素按照equals()判断时,不能返回true.:相同的元素只能添加一个。
二、添加元素的过程:以Hashset为例:
我们向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值此哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置(即为:索引位置),判断数组此位置上是否已经有元素:
如果此位置上没有其他元素,则元素α添加成功.->情况1
如果此位置上有其他元素b(或以链表形式存在的多个元素),则比较元素a与元素b的散列值):
如果散列值不相同,则元素α添加成功.->情况2
如果Hash值相同,进而需要调用元素α所在类的equas()方法:
equals()返回true,元素α添加失败

equals()返回false,则元素a添加成功。--->情况2



1.如果类中没有重写hashCode(),则在添加元素时会默认继承Object类里的
hashCdoe()方法

hashCode()和equals()的重写。_第1张图片

源码如图:
hashCode()和equals()的重写。_第2张图片
一个对象随机计算一个hashCode()值,随机指向一个地址。
hashCode()和equals()的重写。_第3张图片
代码运行的结果里面就会有两个new User(" Tom",12).
注意点:
在这里插入图片描述

如果Hash值相同,进而需要调用元素α所在类的equas()方法: equals() 返回true,元素α添加失败
1.直接return name.hashCode()+age;
如果和一样
24+20
20+24
则判断equals不相等在数组同一位置以链表的形式存储
开发中尽量不用,能少用指针就少用指针
1.如果用系统自定一重写的,会把name值扩大一下,降低重复率。

hashCode()和equals()的重写。_第4张图片
思考为什么默认时31呢?
hashCode()和equals()的重写。_第5张图片

你可能感兴趣的:(集合)