集合框框框地架

这一次来介绍一下常用的集合:

首先是两种集合的《家庭系谱图》:

image-20240524223628645

在这里插入图片描述

接下来介绍一下集合的种类:

Collection

Set

  1. SetTreeSet:基于红⿊树实现,⽀持有序性操作,例如:根据⼀个范围查找元素的操作。但是查找效率不如HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。

  2. HashSet:基于哈希表实现,⽀持快速查找,但不⽀持有序性操作。并且失去了元素的插⼊顺序信息,也就是说使⽤ Iterator 遍历 HashSet 得到的结果是不确定的。

  3. LinkedHashSet:具有 HashSet 的查找效率,且内部使⽤双向链表维护元素的插⼊顺序。

List

  1. ArrayList:基于动态数组实现,⽀持随机访问。

  2. Vector:和 ArrayList 类似,但它是线程安全的。

  3. LinkedList:基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插⼊和删除元素。不仅如此,LinkedList 还可以⽤作栈、队列和双向队列。

Queue

  1. LinkedList:可以⽤它来实现双向队列。

  2. PriorityQueue:基于堆结构实现,可以⽤它来实现优先队列。

Map

  1. TreeMap:基于红⿊树实现。

  2. HashMap:基于哈希表实现。

  3. HashTable:和 HashMap 类似,但它是线程安全的,这意味着同⼀时刻多个线程可以同时写入并且不会导致数据不⼀致。它是遗留类,不应该去使⽤它。现在可以使⽤ ConcurrentHashMap 来⽀持线程安全,并且 ConcurrentHashMap 的效率会更⾼,因为 ConcurrentHashMap 引⼊了分段锁。

  4. LinkedHashMap:使⽤双向链表来维护元素的顺序,顺序为插⼊顺序或者最近最少使⽤(LRU)顺序。

三种常用的集合有什么区别呢?

  1. List

    有序集合:List中的元素有序,即元素按照添加的顺序排列。 允许重复:List可以包含重复的元素。
    实现类:常见的实现类有ArrayList、LinkedList和Vector等。 常用操作:支持通过索引来访问元素,例如get(int index)。 用途:适用于需要元素有序或需要经常通过索引访问元素的场景。

  2. Set

    无序集合:Set中的元素无序,元素的顺序可能会在每次插入或删除操作后发生变化。
    不允许重复:Set不允许包含重复的元素,每个元素都是唯一的。
    实现类:常见的实现类有HashSet、TreeSet和LinkedHashSet等。
    常用操作:主要提供添加、删除和检查元素是否存在的操作。 用途:适用于需要确保元素唯一性的场景,例如去重、集合操作等。

  3. Map

    键值对集合:Map存储键值对(key-value pairs),每个键映射到一个值。 键的唯一性:Map中的键是唯一的,但值可以重复。
    实现类:常见的实现类有HashMap、TreeMap和LinkedHashMap等。
    常用操作:通过键来访问、添加或删除对应的值,例如get(Object key)、put(K key, V value)。
    用途:适用于需要根据键来快速查找、更新或删除值的场景,例如数据库索引、缓存等。

总结:List适用于需要元素有序或索引访问的场景;Set适用于需要元素唯一且无序的场景;Map适用于需要通过键来存储和访问值的场景。

下来是常用的集合中ArrayList 和LinkedList的一些辨别

ArrayList 和LinkedList的区别?

ArrayList:底层是基于数组实现的,查找快,增删较慢;

LinkedList:底层是基于链表实现的。确切的说是循环双向链表(JDK1.6 之前是双向循环链表、JDK1.7 之后取消了循环),查找慢、增删快。LinkedList 链表由⼀系列表项连接⽽成,⼀个表项包含 3 个部分:元素内容、前驱表和后驱表。链表内部有⼀个 header 表项,既是链表的开始也是链表的结尾。header 的后继表项是链表中的第⼀个元素,header 的前驱表项是链表中的最后⼀个元素。

ArrayList 的增删未必就是⽐ LinkedList 要慢:

  1. 如果增删都是在末尾来操作【每次调⽤的都是 remove() 和 add()】,此时 ArrayList 就不需要移动和复制数组来进⾏操作了。如果数据量有百万级的时,速度是会⽐ LinkedList 要快的。

就不需要移动和复制数组来进⾏操作了。如果数据量有百万级的时,速度是会⽐ LinkedList 要快的。

  1. 如果删除操作的位置是在中间。由于 LinkedList 的消耗主要是在遍历上,ArrayList 的消耗主要是在移动和复制上(底层调⽤的是 arrayCopy() ⽅法,是 native ⽅法)。LinkedList 的遍历速度是要慢于
    ArrayList 的复制移动速度的如果数据量有百万级的时,还是 ArrayList 要快。
  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值