Set系列集合的简述及使用

{{uploading-image-772300.png(uploading...)}}

一.HashSet集合

添加的元素,是无序,不重复,无索引的。

研究两个问题(面试热点):

1)Set集合添加的元素是不重复的,是如何去重复的?

 1.对于有值特性的,Set集合可以直接判断进行去重复。
 2.对于引用数据类型的类对象,Set集合是按照如下流程进行是否重复的判断。
 Set集合会让两两对象,先调用自己的hashCode()方法得到彼此的哈希值(所谓的内存地址)
 然后比较两个对象的哈希值是否相同,如果不相同则直接认为两个对象不重复。
如果哈希值相同,会继续让两个对象进行equals比较内容是否相同,如果相同认为真的重复了
如果不相同认为不重复。

如果希望Set集合认为两个对象只要内容一样就重复了,必须重写对象的hashCode和equals方法。

2)Set集合元素无序的原因是什么?

Set系列集合添加元素无序的根本原因是因为底层采用了哈希表存储元素。
JDK 1.8之前:哈希表 = 数组 + 链表  + (哈希算法)
JDK 1.8之后:哈希表 = 数组 + 链表 + 红黑树  + (哈希算法)
当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。

二.LinkedHashSet集合

特点:

是HashSet的子类,元素是“有序” 不重复,无索引.
LinkedHashSet底层依然是使用哈希表存储元素的,
但是每个元素都额外带一个链来维护添加顺序!!
不光增删查快,还有序。缺点是多了一个存储顺序的链会占内存空间!!而且不允许重复,无索引。

三.TreeSet集合

特点:

TreeSet: 不重复,无索引,按照大小默认升序排序!!
TreeSet集合称为排序不重复集合,可以对元素进行默认的升序排序。
TreeSet集合自自排序的方式:
        1.有值特性的元素直接可以升序排序。(浮点型,整型)
        2.字符串类型的元素会按照首字符的编号排序。
        3.对于自定义的引用数据类型,TreeSet默认无法排序,执行的时候直接报错,因为人家不知道排序规则。

总结

如果希望元素可以重复,又有索引,查询要快用ArrayList集合。(用的最多)
如果希望元素可以重复,又有索引,增删要快要用LinkedList集合。(适合查询元素比较少的情况,经常要首尾操作元素的情况)
如果希望增删改查都很快,但是元素不重复以及无序无索引,那么用HashSet集合。
如果希望增删改查都很快且有序,但是元素不重复以及无索引,那么用LinkedHashSet集合。
上一篇:Go语言学习02-第一个程序与编译


下一篇:GDB调试之多线程