Cheug's Blog

当前位置:网站首页 / JAVA / 正文

Set集合接口

2019-04-06 / JAVA / 962 次围观 / 0 次吐槽 /

Set:接口

            1.一个不包含重复元素的 collection。

            2.最多包含一个 null 元素

            3.一般使用它实现类:HashSet,LinkedHashSet,TreeSet

            4.Set集合存和取的顺序不一样,【每一次取的顺序都可能不一样】


      对比List:接口

                1.List是可存储相同元素

                2.List存的取的元素顺序是一样


HashSet

            1.此类实现 Set 接口

            2.由哈希表(实际上是一个 HashMap 实例)支持。

            3.它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。

            4.此类允许使用 null 元素。 


      HashSet存储自定义对象保证元素唯一性

                        需要重写hashCode()和equals()方法

            hashCode与equals的原理

                        通过set集合的add方法添加元素时,内部会调用hashcode和equals方法

                        如果比较的hashcode的值是一样的话,会调用equals方法,equals方法返回true,就不存元素,返回false就存元素

                        如果比较的hashcode的值不一样,就直接存元素

            hashCode与equals的优化

                     1.如果名字不一样,就不需要调用equals方法,从而优化代码

                                      return this.name.hashCode()

                     2.hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)

                                     return this.name.hashCode() + this.age;


LinkedHashSet 

            LinkedHashSet是HashSet的子类

            LinkedHashSet 存和取的顺序是一样


TreeSet

            TreeSet是一种能排序的集合

            TreeSet的排序方式有2种

                    自然顺序(Comparable)

                                默认情况下,TreeSet存Integer时,由小到大排序

                                默认情况下,TreeSet存String时,字母的由小到大排序

                                Integer和String这两个类都内部实现了comparable接口

   

                                TreeSet保存自定义对象

                                        自定义对象必须实现comparable接口

                                        实现这个接口的目的是告诉TreeSet你的元素的排序规则

                                        实现了comparable接口的类,要实现compareTo方法

                                        compareTo方法:0-只存一个元素,第一个元素   -1:存的顺序倒序    1: 存的顺序正序

                                    排序的原理 是使用二叉权存数据

                                                        0:不存   负数:存在左边   正数:存在右边

                    比较器顺序(Comparator)

                                  public TreeSet(Comparator<? super E> comparator)

                                  使用场景:如果元素的类型是final类型,不被重写,这个时候选择Comparator排序方式

                    如果希望有相同的元素存在,在compareTo或者compare方法,返回1就行了。


            TreeSet排序原理总结

                            TreeSet的特点:

                                          TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列

                                          TreeSet排序方式有两种自然顺序和比较器顺序

                自然顺序(Comparable)

                         TreeSet类的add()方法中会把存入的对象提升为Comparable类型

                         调用对象的compareTo()方法和集合中的对象比较

                         根据compareTo()方法返回的结果进行存储

                比较器顺序(Comparator)

                         创建TreeSet的时候可以制定 一个Comparator

                         如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的规则比较

                         add()方法内部会自动调用Comparator接口中compare()方法排序

                         调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数

            

                两种比较方式的区别

                     1.TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)

                     2.TreeSet如果传入Comparator, 就优先按照Comparator


Powered By Cheug's Blog

Copyright Cheug Rights Reserved.