集合框架Set

    xiaoxiao2021-04-16  285

    集合框架Set()

    今天,我们来讲一讲集合框架Set, 首先,set集合不一样(与list比较):没有下标,所以也是无序的。 (但jdk1.7 或jdk1.8底层做了修改,造成了有排序,1 2 3 4 5,不是本次探讨重点)意会即可 eg:存1 2 3 4 5 可能会打印成3 4 5 2 1 元素是无序(存入和取出的顺序不一定一致),元素不可以重复; Set集合的功能与Collection集合的功能是一致的(就方法调用而言); Set是接口,咱们把他当做老大哥,它有两个得力小弟 ,HashSet和TreeSet

    HashSet

    HashSet:哈希表存储 底层数据结构是哈希表 当我们在HashSet中存入重复元素时,(例如:同姓名,同年龄视为同一人即重复元素) 当我们执行代码时,会发现重复元素并没有消失,而是同时出现在一起了,这里面就涉及到了我们今天要讲到的equals方法(这里没被调用) 在我们写了equals方法后 如下 确实重复元素没有了,但我们会发现这样既麻烦又耗资源,我们再次思考一下 那么HashSet是如何保证元素唯一性的呢?

    是通过元素的两个方法:hashCode与equals方法来完成;

    先把他们限制条件(HashCode值是否相等)放在同一教室, 然后再去判断是否equals,快得多,节约资源( 如果hashCode值相同,才会判断equals是否为true; 如果hashCode值不同,那么不会调用equals。)

    原来HashSet调用了两个方法 HashCode和 equals 而HashSet集合存储是先调用hashCode方法,这里我们将hashCode方法重写一下看看

    其中int 返回值代表容器中的具体位置的坐标

    public int hashCode() { return this.getName().hashCode()+this.age; }

    注意:对于判断元素是否存在,以及删除等操作,依赖的方法同样是hashCode、equals方法。 List与Set判断重复对象的区别? List只依赖于equals方法 Set依赖于hashCode、equals方法 接下来,我们讲一讲TreeSet

    集合框架TreeSet

    TreeSet中我们主要讲三点 自然排序、数据结构二叉树、比较器排序 数据结构二叉树:又称红黑树,是一种排序方式,会按照从小到大的顺序来排列,且速度快,对整体效率高 自然排序: 使用TreeSet要用接口去实现继承 Comparable接口的用途 使得添加的元素自身具备排序规则,这种排序规则又被称为自然排序 怎么排序? implements Comparable public int compareTo(Person o) { // TODO Auto-generated method stub return this.getAge() - o.getAge(); } 正数代表后面的0比当前(this)大 0代表相等 给对象赋予自然排序规则的时候必须按照以下规则来 先判断主要条件(年龄) 在判断次要条件(姓氏) public int compareTo(Person o) { // TODO Auto-generated method stub int num = this.getAge() - o.getAge(); if(num ==0) { return this.getName().compareTo(o.getName()); } return num; } 然而,需求原因 前面的排序规则值适用于近一周的福利模块(按年龄再按姓氏) 系统中有另一个模块,需要对用户表中排序规则进行更改(先按姓氏, 再按年龄) 注意:TreeSet排序的第一种方式,让元素自身具有比较性;

    元素需要实现Comparable接口,覆盖compareTo方法; 这种方式也被称为元素的自然顺序,或者叫做默认顺序。

    TreeSet比较器排序 TreeSet排序的第二种方式 当元素自身不具备比较性时,或者具备的比较性不是所需要的; 注意:这时需要让集合自身具备比较性

    在集合初始化时,就有了比较方式; 定义一个类,实现comparator接口,实现compare方法

    比较器comparator接口 作用:使得容器具有比较性 排序性能提高

    当两种排序都存在时,比较器排序优先级更高 因此比较器用的多一些,在实际开发中,很多时候,引用数据类型是否具有比较性,或者比较规则,可能不由开发人员自己决定, 那么开发人员想要对应的引用数据类型按照自己的排序方式进行排列,那么就需要实现comparator接口,实现compare方法

    最新回复(0)