二哥啊

导航

 

Set接口:存储无序、不可重复的数据

  HashSet 作为Set接口的主要实现类 线程不安全 可以存储null值

    LinkedHashSet 作为HashSet子类,遍历其内部数据时,可以按照添加的顺序遍历

  TreeSet:可以按照添加对象的指定属性进行排序

 

一、Set接口中没有额外定义新的方法

以HashSet为例

1.无序性:不等于随机性。存储的数据在底层数组并非按照数组索引的顺序添加,而是根据数据的哈希值

2.不可重复性:保证添加的元素按照equals()判断时,不能返回true。即相同的元素只能添加一个

 

二、添加元素的过程:以HashSet为例 底层数组+链表的结果

  添加元素a,首先调用a所在类的hashCode()方法,计算a的哈希值,此哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置,判断

  此数组此位置上是否已经有元素

    如果此位置没有其他元素,则元素a添加成功

    如果此位置上有其他元素(或以链表形式存在多个元素),则比较元素a与元素b的hash值

      如果hash值不同,则a添加成功

      如果hash值相同,则需要调用元素a所在类的equals()方法

          equals()返回true,则a添加失败

          equals()返回false,则添加成功

重写hashCode()  选择系数 31    

要求:向Set中添加数据,其所在的类一定要重写hashCode()和equals()

向TreeSet中添加的数据,要求是相同类的对象。

两种排序:自然排序(实现Comparable接口)和定制排序(Comparator)

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

 

posted on 2019-11-29 16:59  二哥啊  阅读(103)  评论(0)    收藏  举报