「Java基础入门」hashset添加元素的过程

170 阅读2分钟

hashset:

  • 我们向hashset中添加元素a,首先调用a所在类的hashcode方法,计算元素a的哈希值,此哈希值接着通过某种算法计算出在hashset底层数组中的存放(索引位置),判断此位置上是否已经有元素;

  • 如果此位置上没有其他元素,则添加成功--情况1

    • 如果此位置上有其它元素b(或以链表形式存在的多个元素),则比较a和b的hash值:
      • 如果hash值不同,则元素a添加成功--情况2
      • 通过hash值相同,进而需要调用a所在类的equals方法:
        • equals返回true,a添加失败
        • equals返回false,a添加成功--情况3

对于添加成功的情况2和3而言:元素a与已经存在指定索引位置上数据以链表的方式存储。

jdk7:a指向原来数组中的元素

jdk8:数组中的元素指向a

简称:七上八下

hashset底层:数组+链表

linkedhashset:

作为hashset的子类,在添加元素的同时,每个数据还委会了两个引用,记录此数据的前一个数据和后一个数据,对于频繁遍历的操作,效率高于hashset。

treeset:

  • 向treeset中添加的数据,要求时相同类的对象

  • 两种排序方式:自然排序(实现comparable接口)和定制排序

  • 自然排序中,比较两个对象是否相同的标准为:compareto返回0,不再是equals。

一共介绍了三种集合类:HashSet、LinkedHashSet和TreeSet。其中,HashSet采用哈希表实现,使用hashcode和equals方法来判断元素是否重复,并能够快速访问元素;LinkedHashSet继承自HashSet,不仅具有HashSet的特性,而且在底层会维护一个链表,记录添加顺序,因此,适用于需要保留数据插入顺序的场景;而TreeSet则采用红黑树实现,需要将元素按照一定规则排序(默认为自然顺序),并要求元素必须实现Comparable接口或者提供Comparator对象来指定比较规则。

与此同时,该段文章还介绍了元素相等的标准:对于HashSet而言,如果两个元素hashCode相同且equals方法也返回true,则认为它们是相等的;而对于TreeSet而言,则要求两个元素必须实现Comparable接口,并且compareTo方法返回0时才被认为相等。