Day16:请说出暗号证明你的身份

始祖巨人中我们条列出了所有Java物件都会继承自Object类别的共同方法,这篇会提到其中的hashCode()与equals()这两个方法如何在HashSet中被拿来运用。

若我们想要把数值或物件装在一个东西之中,最常用的就是阵列(Array)了,不过除了阵列以外其实还有很多这种可以储存数值或物件的东西,在Java中统称为集合(Collection),集合底下有许多种的实作API供Java Programmer直接使用,这篇要来谈的是HashSet。

HashSet是可以直接创建实例使用的类别,实作了Set介面。

Set的特性就是只能存在不重复的数值或物件,所以如果有一个阵列[1, 1, 2, 3],把他丢到一个Set时,这个Set只会存在[1, 2, 3]。

而既然Set是一个介面,就表示Java底下还有其他实作的Set类别可以用,例如TreeSet。每种Set类别都有其独特的运作机制,视程序的情况来决定要使用哪种Set,而通常最常用的就是HashSet了。

HashSet不保证内容物的顺序性,只确保了这里面一定拥有不重复的数值或物件。那实际上是怎麽办到的呢?就是利用了Object类别中的hashCode()与equals()这两个方法。

在我们把东西加进HashSet後,HashSet会先做第一件事情:检查我当前HashSet的元素中,有没有和正要加进来的东西有同样的HashCode,如果没有的话,没问题,就是直接加入到了HashSet成功;若有相同的HashCode...

就会做第二件事情:呼叫拥有相同HashCode物件的equals()方法,看回传值是不是为false,false的话那一样会把它加进HashSet之中;true的话,很抱歉,HashSet就不会把它加进来。

若我们再说的细一点,HashSet之中有个叫做Hash Bucket的资料结构,它就像是一个Map,有key以及key对应的value,Hash Code就是Hash Bucket的key,而value的部分就像是一个LinkedList,先前提到若是HashCode相同但是equals()方法又会回传false,那就会在原本已存在元素的节点,next属性上加入下一个节点,并放入新加入的元素。(若你看不懂这段,可以看看这篇)

看到这边可能会对hash code与equals()的结果有些打结的状况,其实大部分情况hash code一致的情形,equals()也会回传true的,但在资料结构的规则中就会允许这样的情况发生,而有这样对应的处理。

以下帮大家做个小结:

  1. 若是物件要做比较,我们知道要在物件的类别中覆写(override) equals()方法;但也别忘了覆写hashCode()方法,因为若要用到HashSet时,就会需要用到hashCode()方法。
  2. 2个物件实例有相同的HashCode时,有可能equals方法比较後回传false
  3. 2个物件实例的equals比较後回传true,其Hash Code也要是一致

<<:  [Day 15] -『 GO语言学习笔记』- 核心型别(II)

>>:  day14: 模组化好的写法 -单一功能原则(2)

Day 6 - 颜色设定

和其它 CSS 框架一样,Tailwind 也内建颜色,但它不像 Bootstrap 就给那几组,...

EP 12 - [TDD] 设定环境变数

Youtube 频道:https://www.youtube.com/c/kaochenlong ...

Day 28-ASP.NET & SQL资料库制作留言板(上)

-前集提要- 当将form里面的资料post回server端,且处理这个form的资料的URL,都由...

Day29:今天来聊一下CEH中讲的Cryptography

随着Internet越来越多地使用在商业和个人通讯,保护敏感讯息(例如:信用卡和 个人识别码(PIN...

24.MYSQL NOT IN指令

有了IN就会有NOT IN,而写法跟用法一样的,就是不包含写的条件都会列出来 另外值得注意的是,IN...