java26(集合框架--03 set)

Collection:

        |--    List:元素是有序的,元素可以重复。因为该集合体系有索引

                |--    ArrayList:底层的数据结构使用的是数组结构 特点:查询快,增删改慢,线程不同步

                |--    LinkedList:底层的数据结构使用的是链表数据结构 特点:查询慢,增删改快

                |--    Vector:底层的数据结构使用的是数组结构 特点:线程同步,被ArrayList替代了

        |--    Set:元素是无序的,元素不可以重复

                |--    HashSet:底层的数据结构使用的是哈希表

                |--    TreeSet:底层的数据结构使用的是二叉树,可以对set集合中的元素排序(排序的两种方式)

hashcode:

        我们观察下列代码的运行结果

13091615-9742a5ce28ad1b90.png

        结果为Demo@512ddf17  其中512ddf17就是hashcode

        hashcode就是通过hash函数得来的(通俗来说,就是通过某一种算法得到的)代表元素在hash表中对应的位置

为什么会有hashcode?

        当我们向set集合中插入对象时,如何判别该集合中是否存在该对象?

        不考虑性能的情况下,我们调用equals方法来逐个进行比较当然可以。但是如果集合中已经存在大量数据的话,效率必然是一个问题。此时hashcode方法的作用就体现出来了。当集合要添加新的对象时,先引入这个对象的hashcode方法获取hashcode值。如果不存在相同的hashcode值就直接存入。如果存在再调用equals,这样实际调用equals方法的次数就大大降低了(假如hash表中有1、2、3、4、5、6、7、8个位置,存第一个数,hashcode为1,该数就放在hash表中1的位置,存到80个数字,hash表中8个位置会有很多数字了,1中可能有10个数字,存81个数字时,他先查hashcode值对应的位置,假设为1,那么就有10个数字和他的hashcode相同,他只需要跟这10个数字相比较(equals))

13091615-a995533a4a48ac73.png
13091615-03e0224dbe0c08f3.png

HashSet :

    论证HashSet集合判断元素是否重复是先比较Hashcode,再调用equals:

        如下图所示,注释掉hashcode方法和equals方法,因为对象的地址值不同,相同名字和年龄对象是可以插入到hashset中。但是当我们重写了hashCode方法和equals方法后。相同名字和年龄的对象就被过滤掉了

13091615-d095e47f659f9be9.png

TreeSet:

    排序第一种方式:让元素自身具备比较性,实现Comparable接口,覆盖compareTo方法。

        运行代码,提示如下错误信息。(TreeSet会对元素进行排序,我们需要实现Comparable接口让对象具有比较性)

13091615-81f90a3edb834498.png
13091615-167ffff314edbda1.png

        这里我们重写compareTo方法(如果compareTo方法),compare方法返回0则代表两个元素完全一样。因此我们不单单要判断主要条件还需要判断次要条件。

13091615-763ed84bbe8a3ec0.png

TreeSet中的二叉树:

        TreeSet的底层数据结构使用的是二叉树,那么二叉树是如何对集合进行排序的呢?

        采用二叉树的中序遍历(详情可参考明哥之前的二叉树笔记)

13091615-70dac96a50796463.png


    排序第二种方式:定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

        比较器:定义一个类,实现Comparator接口,覆盖compare方法

        将比较器传入TreeSet集合的构造函数中。两种排序都在的时候,以比较器为主

13091615-8d6586f1932a7d84.png
13091615-d5a0743f3ec9b4c3.png

猜你喜欢

转载自blog.csdn.net/weixin_33694620/article/details/87054205