Collection接口与 Collections、Comparator和Comparable区别

缺乏、安全感 2024-04-18 10:23 202阅读 0赞

1. Collection接口,哪些类实现了Collection接口;

Collection下有三大接口:List(列表)Set(集合)Queue(队列)

1)List接口

项目 线程安全? 实现 扩容 定点添加/删除 尾添加/删除 查询 修改
ArrayList 否 数组 50% O(n) O(1) O(1) O(1)
Vector 是 数组 100% O(n) O(1) O(1) O(1)
LinkedList 否 双链表 — O(n) O(1) O(n) O(n)

可见ArrayList越往后插入越快,因为要变动的元素越少;
LinkedList从两头到中间速度变慢,取决于链表的查询机制,总的来说,随机添加LinkedList比较有优势些,只是末尾添加ArrayList较好;

2)Set接口

Set一般基于Map来实现:HashSet、LinkedHashSet、TreeSet的特性,根本上是HashMap、LinkedHashMap、TreeMap的特性;

(1)HashSet

HashSet内部有一个HashMap map成员变量,增删实际上是使用map的方法

按照哈希的顺序:hashCode(),equals(Object obj)
底层实现:HashMap

(2)LinkedHashSet

LinkedHashSet是HashSet的子类,源码少得可怜,基本上都是调用父类(HashSet)的构造方法
基于一个由链表实现的哈希表,保留了元素插入顺序
底层实现:LinkedHashMap

(3)TreeSet—-有序集合

实现NavigableSet:使用元素的compareTo对元素进行排序,也可使用Comparator自定义比较器
TreeSet多拜了一个师傅:NavigableSet—>SortedSet 使用方法也多几个
底层实现:TreeMap

项目 线程安全? 实现 add remove contains
HashSet 否 HashMap O(1) O(1) O(1)
LinkedHashSet 否 LinkedHashMap O(1) O(1) O(1)
TreeSet 否 TreeMap O(log(n)) O(log(n)) O(log(n))
————————————————

原文链接:https://blog.csdn.net/qq\_30447263/article/details/83034711

3)Queue

子类常见的有PriorityQueue(优先队列)和上文提到的LinkedList。

PriorityQueue优先队列,是基于数组实现的二叉堆来实现的特殊队列,具有完全二叉树的性质。
每次从优先队列中取出来的元素要么是最大值或最小值(最大堆/最小堆)

2. Collections用过什么;

Collections提供以下方法对List进行排序操作

1)Shuffle(element):洗牌方法,将当前集合内的数据进行随机排序。
2)Reverse(element):逆序排序,对当前集合的元素按照相反的顺序进行排序
3)Sort(element):对当前集合进行升序排序,实现Comparable接口的类,只能使用一种排序方案,这种方案叫作“自然比较”方案。

4)void sort(List list, Comparator c);定制排序,由Comparator控制排序逻辑

5)void swap(List list, int i , int j),交换两个索引位置的元素

6)void rotate(List list, int distance),旋转。当distance为正数时,将list后distance个元素整体移到前面。当distance为负数时,将 list的前distance个元素整体移到后面。

3. Comparator和Comparable;

1)Comparable 是排序接口。

若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。

此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。

2)Comparator 是比较器接口。

我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。

也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。

发表评论

表情:
评论列表 (有 0 条评论,202人围观)

还没有评论,来说两句吧...

相关阅读