集合框架(setTreeSet)

    xiaoxiao2021-04-15  264

    HashSet哈希表存储、重复元素存储底层探究

    特点:元素是无序无下标(存入和取出的顺序不一定一致)但是在jdk1.7和jdk1.8的时候做了一些小范围的修改,在某个比较小的范围中,它也会自动的排好序也是jdk1.7和jdk1.8一个新特性的一个小的调优,但是范围比较大了就不能自动排序(),元素不可以重复。

    hashset本身也具有去重复的功能,它所调用的增加方法会自动的进行对比,如果没有该重复的就会将其增加。如果其中有重复的对象,就会是同一个哈希值,放在同一空间。如下图:

    论证结论: HashSet的数据结构是哈希表, 哈希表里面有许多的地址,其在调用add增加方法的时候 调用了hashcode(hashcode 会返回一个int 而其返回值代表容器中的具体位置坐标) 其后 调用了equals的方法 因为Set去重复依赖于hashCode、equals方法 如下图:

    代码优化:因为其进行比较的次数过多,造成代码运行的低效,因此我们可以进行加强其健壮性,将hashCode方法进行重写,减少equals对比的次数如下图: 注意:对于判断元素是否存在,以及删除等操作,依赖的方法同样是hashCode、equals方法。

    HashSet是如何保证元素唯一性的呢?

    是通过元素的两个方法:hashCode与equals方法来完成; 如果hashCode值相同,才会判断equals是否为true; 如果hashCode值不同,那么不会调用equals。

    集合框架TreeSet(自然排序、数据结构二叉树(红黑树)、比较器排序)

    TreeSet自然排序:使添加的元素自身具备排序规则,这种排序规则又被称为自然排序。排序时,当主要条件相同时,一定要判断次要条件 TreeSet可以对set集合中元素进行排序

    String实现了Comparable接口,所以可以直接进行排序 引用数据类型想要排序,必须实现Comparable接口 其他引用数据类型没有实现Comparable接口, 那么会出现java.lang.ClassCastException: com.javaxl.Peroon cannot be cast to java.lang.Comparable 实现引用数据类型实现此接口就没问题了

    比较器排序

    TreeSet排序的第二种方式 当元素自身不具备比较性时,或者具备的比较性不是所需要的; 注意:这时需要让集合自身具备比较性 在集合初始化时,就有了比较方式; 定义一个类,实现comparator接口,实现compare方法 当两种排序都存在时,比较器排序优先级更高 因此比较器用的多一些,在实际开发中,很多时候,引用数据类型是否具有比较性,或者比较规则,可能不由开发人员自己决定, 那么如果想要对应的引用数据类型按照自己的排序方式进行排列,那么就需要实现comparator接口,实现compare方法

    数据结构二叉树:进行排序,提升性能 例如 将23作为基础点,如果想要进行排序,那么treeSet是如何将以下数进行存放,23就看成一个树的主干,一个一个的将数字与23进行对比,如果比23这个主干大就将其放在右边,如果小就放在左边,然而从而形成一个树形,其后再从左往右数,这样就将其数字排好了序 。


    最新回复(0)