您的位置:首页 > 其它

List和Set区别?

2020-07-02 22:12 62 查看

List和Set区别?

List和Set都是常用的集合接口,可以通过这两个接口去实现集合类。List可以实现的集合类有:ArrayList、LinkedList和Vector。Set可以实现的集合类有:HashSet和TreeSet。
List和Set的区别主要是:
List集合类中的元素是可以重复,存在下标,元素是有顺序。
Set集合类中的元素是唯一的,不存在下标,元素是无序的。
List集合类:
1、ArrayList
ArrayList是通过数组实现的,所以查询块、增删慢。它是一种线程不安全、效率高的集合类。
2、LinkedList
LinkedList是通过链表实现的,所以查询慢、增删快。它是一种线程不安全、效率高的集合类
3、Vector
Vector是通过数组实现的,所以查询块、增删慢。它是一种线程安全、效率低的集合类。(现在已经不怎么使用了)
Set集合类
1、HashSet
HashSet通过哈希码来保存元素,所以可以防止元素重复。它是一种无序的,线程不安全,运行效率高,常用的集合类
2、TreeSet
TreeSet基于树状结构,可以实现排序功能,支持自然排序(即对于基本数据类型可以实现默认升序排列)。但是如果是特殊类型,比如对象、数组、集合,则需要通过比较器对象自定义排序规则。

HashSet的底层原理
HashSet的底层是通过HashMap来实现的,是基于数组+链表+红黑树实现(jak1.8 才开始出现红黑树)。把所有存入的数据都转换HashCode,如果HasCode不同,HashSet会认为是不同的元素,就会存在不同的哈希桶(相当于数组中是一个元素)中。
当每一次存值时,判断新的元素的HashCode是否跟HashSet集合中元素有没有HashCode相同的,如果不同则存入新的元素。如果存在HashCode相同,会再判断值是否相同。如果值还相同,HashSet会认为是重复的元素,会替换元素。如果值不同,会在哈希桶的下面拼一个链表来保存元素。
:链表长度超过8会转换红黑树,红黑树长度小于6时,会转换回链表。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: