1.set系列集合
Set接口中的方法基本上与Collection的API一致,所以直接使用collection的方法即可
1.特点
- 无序:存取顺序不一致
- 不重复:可以去除重复(当set系列集合使用add方法添加数据时,不能重复,若重复,方法返回一个false,此重复数据不存入)
- 无索引:没有带索引的方法,所以不能用普通for循环遍历,也不能通过索引来获取元素。
- 实现类
- HashSet:无序、不重复、无索引
- LinkedHashSet:有序、不重复、无索引
- TreeSet:可排序、不重复、无索引
2.HashSet
- HashSet集合底层采取哈希表存储数据
- 哈希表由数组+链表+红黑树组成(jdk8之前没有红黑树)
2.1 哈希值
对象的整数表现形式
- 根据HashCode方法算出来的int类型的整数
- 该方法定义在Object类中,所有对象都可以调用,默认使用地址值进行计算
- 一般情况下,会重写HashCode方法,利用对象里的属性值计算哈希值
特点
- 如果没有重写hashCode方法,不同对象计算出的哈希值是不同的
- 相反,若重写了方法,只要属性值相同,不同对象计算出来的哈希值是一样的
LinkedHashSet
与Hash Set相比,linkedhashset的取出存入顺序是一致的
原理::底层数据依然是哈希表,只不过每个元素多了一个双链表就机制记录存储的顺序
总结:去重默认选择HashSet,如果要求去重且要求存取有序,才使用用LInkedHashSet
2.2 TreeSet
- 不重复、无索引、可排序(按照元素的默认规则–从小到大 排序)
- TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都较好
- 对于字符、字符串类型,按照字符在ASCII码表中的数字升序进行排序
- 字符串比较:逐个比较
2.2.1TreeSet的两种比较方式
- 默认排序/自然排序:Javabean类是实现Comparable接口指定比较规则
- 需要重写compareto方法,规定排序规则
返回值(依据红黑树的存取规则)
负数:认为要添加的元素是小的,存左边
正数:认为要添加的元素是大的,存右边
0 :认为要添加的元素已经存在,舍弃
- 不需要重写hashCode和equals方法,因为前两者是跟哈希表有关的,TreeSet集合底层是红黑树
2.比较器排序:创建TreeSet对象的时候,传递比较器Comparator指定规则
在创建集合时。直接在小括号内 new 一个 comparator
总结
- 如果想要集合中的元素可重复
- 用ArrayList集合,基于数组的(用的最多)
- 如果想要集合中的元素可重复,且当前的增删操作明显多于查询’
- 用LinkedList集合,基于链表的
- 如果想要对集合中的元素去重
- 用HashSet集合,基于哈希表的(用的最多)
- 如果想要对集合中的元素去重,并且保证存储循序
- 用LinkedHashSet集合,基于哈希表和双链表,效率低于HashSet
- 如果想对集合中的元素进行排序
- 用TreeSet集合,基于红黑树。后续也可以用List集合实现排序