集合是Java基础中非常重要的一部分,Java提供了非常丰富的集合API,了解各个集合的特点,怎么样在各种各样的场景中使用正确的集合,非常重要,也是一个Java程序员最基本的素养。

整体了解

  • Java最基本,最常用的的集合主要有,Set,List,Map,Queue,Deque。
  • Collection是集合List,Set,Queue的最顶层接口。Collection继承自Iterable接口,以实现对元素的遍历。

各个类或接口之间的关系,如下类图:

List

List是有序的集合接口,继承自Collection,有三个实现类,ArrayList,LinkedList,Vector,分别有各自的特点。

ArrayList,底层通过数组实现,元素有下标,通过下标随机读取元素效率高,查询时间复杂度为O(1)。缺点是,插入或者删除元素时,需要移动元素,或者数组存储空间不够时,数组扩容,代价都比较高。综上ArrayList适合查找和遍历元素,不适合插入和删除元素。并且ArrayList是线程不安全的。

LinkedList,底层通过链表实现,元素没有下标,适合元素的动态插入和删除,只需要移动指针即可。但是查询元素和遍历元素比较慢。并且LinkedList是线程不安全的。

Vector,底层通过数组实现,线程安全,但是实现线程安全后,必然影响元素操作的性能。效率比ArrayList低。

Set

Set集合接口,无序,不重复;继承自Collection,有三个实现类,HashSet,LinkedHashSet,TreeSet,分别有各自的特点和适用的场景。

HashSet,集合元素无序,且不重复。通过HashMap实现,底层是一个数组,允许使用null,线程不安全。

LinkedHashSet,集合元素唯一且有序。继承自HashSet,通过Hash和链表实现。

TreeSet,集合元素唯一,不保证元素的添加顺序,但是可以根据规则排序,使用红黑树算法。排序时需要指定排序的规则。

Map

Map集合存储键值对。确切的说,Map不是集合,是两个集合的关系。Map相关的集合有HashMap,TreeMap,LinkedHashMap,HashTable,ConcurrentMap,ConcurrentHashMap。也分别有各自的特点和适用的场景。

HashMap,底层是一个数组,数组中是一个链表。通过hash保证key的唯一性。允许key为null,线程不安全。

LinkedHashMap,保存了键值对的插入顺序,遍历时比HashMap慢,key和value都可以为null,线程不安全。

TreeMap,底层通过红黑树实现,可以指定规则,对Map的key进行排序。

ConcurrentMap,并发访问map集合的接口。在Map的基础上,进行一定的扩展。

ConcurrentHashMap,线程安全,并且高效的HashMap。实现类似于分块,在HashMap的数组+链表数据结构的基础上,增加了一层数组数据结构,变成数组+数组+链表的数据结构。每次只对第一层的数组加锁,第一层的其他数组就不会被锁,这样来实现同步,并且提高效率。

HashTable,线程安全,继承自Dictionary,使用Hash实现。为了保证线程安全,所有的方法上增加了synchronized锁,所有的方法上加synchronized锁,那么导致锁HashTable本身的对象this,无论执行哪个方法,线程之间都要同步执行,效率不高。

Queue

类似于队列的数据结构,即元素先进先出的原则,实现有PriorityQueue。

PriorityQueue,有顺序的队列,可以通过指定排序规则,使队列中的元素按照顺序排序。排序在前的先出,排序在后的后出。

BlockingQueue,阻塞队列接口,线程安全,多用于生产者消费者、多线程的中间队列使用。使用ReentrantLock实现,

ArrayBlockingQueue,BlockingQueue的实现,基于数组的阻塞队列,有界队列,初始化时需要指定队列长度,不支持null元素,不能扩容。

LinkedBlockingQueue,BlockingQueue的链表实现。无界队列,如果不指定队列长度,队列长度默认是Integer.MAX_VALUE,视线中使用了两个锁,出队列和入队列互不影响,吞吐量高。

DelayQueue,是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。不支持null元素。

PriorityBlockingQueue,无界有序的阻塞队列,排序规则和之前介绍的PriorityQueue一致,只是增加了阻塞操作。同样的该队列不支持插入null元素,同时不支持插入非comparable的对象。

SynchronousQueue,阻塞队列,其中每个 put 必须等待一个 take,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有。 不能在同步队列上进行 peek,因为仅在试图要取得元素时,该元素才存在; 除非另一个线程试图移除某个元素,否则也不能(使用任何方法)添加元素;也不能迭代队列,因为其中没有元素可用于迭代。队列的头是尝试添加到队列中的首个已排队线程元素; 如果没有已排队线程,则不添加元素并且头为 null。

Deque

Deque是Queue的子接口,Queue是一种队列形式,而Deque则是双向队列,它支持从两个端点方向检索和插入元素,因此Deque既可以支持LIFO形式也可以支持LIFO形式.Deque接口是一种比Stack和Vector更为丰富的抽象数据形式,因为它同时实现了以上两者。实现有ArrayDeque和LinkedList。

Java集合List,Set,Map,Queue,Deque相关推荐

  1. java集合课程,I学霸官方免费课程三十三:Java集合框架之Map集合

    I学霸官方免费教程三十三:Java集合框架之Map集合 Map接口 Map集合采用键值对(key-value)的方式存储数据,其中键不可以重复.值可以重复. 常用类有HashMap.TreeMap和P ...

  2. java 集合之Interface Map<K,V> HashMap实现类

    java 集合之Interface Map<K,V> 类型参数:K- 此映射所维护的键的类型:V- 映射值的类型 将键映射到值的对象. 一个映射不能包含重复的键: 每个键最多可以映射到一个 ...

  3. java 先进先出的map_「 深入浅出 」java集合Collection和Map

    本系列文章主要对java集合的框架进行一个深入浅出的介绍,使大家对java集合有个深入的理解. 本篇文章主要具体介绍了Collection接口,Map接口以及Collection接口的三个子接口Set ...

  4. Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

  5. java集合框架07——Map架构与源代码分析

    前几节我们对Collection以及Collection中的List部分进行了分析,Collection中还有个Set,因为Set是基于Map实现的,所以这里我们先分析Map,后面章节再继续学习Set ...

  6. (Java集合框架)Map集合

    Map集合 概述 现实生活中,常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对象关系的对象 ...

  7. Java集合篇:Map总结

    相关阅读: Java基础篇:hashCode的作用 Java集合篇:HashMap原理详解(JDK1.7及之前的版本) Java集合篇:HashMap原理详解(JDK1.8) Java集合篇:Hash ...

  8. Java集合查找Map,Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

  9. java集合(List,Set,Map)详细总结

    一,集合的由来: 数组是长度是固定的,当添加的元素超过数组的长度时需要对数组重新定义,太麻烦了,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而 ...

  10. list和map用法java,java 集合list和map的用法

    import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Li ...

最新文章

  1. queue java 判断重复值_java集合类深入分析之Queue篇(Q,DQ)
  2. 在vue中获取微信支付code及code被占用问题的解决?
  3. 为什么你喜欢的女生不喜欢你
  4. OpenCV深度传感器depth sensors的实例(附完整代码)
  5. 怎么让抠图融入背景_李现壁纸+头像+背景图+情侣头像抠图特辑来了
  6. 2D 转换之 scale
  7. Jquery 动画
  8. 经典卷积神经网络---VGG16详解
  9. Android腾讯微博开放平台入门(五)综合测试
  10. 那些你所不知道的文献下载网址经验总结
  11. 只能上QQ,不能打开网页的解决办法
  12. Android UI设计 下拉菜单Spinner用法 动态添加删除Spinner菜单项
  13. 如何用电脑画平面坐标图_如何画平面直角坐标系
  14. 解压文件时文件名出现菱形问号������解决方案
  15. 2021年危险化学品生产单位安全生产管理人员考试试卷及危险化学品生产单位安全生产管理人员实操考试视频
  16. MySQL向表中添加一个列
  17. Python如何爬取不确定页数的网页
  18. NMOS管与PMOS管的区别与总结
  19. JAVA学习-JDK8环境的安装与卸载
  20. My97时间插件使用、My97设置日期控件日期格式

热门文章

  1. 华硕a501lb5200加内存和固盘并装上win7系统并设置固盘为第一启动
  2. python如何监听toast提示信息_python 怎样获取toast?
  3. python编程胡牌将是什么意思_OpenCV+Python识别车牌和字符分割的实现
  4. python简单的购物程序代码-Python实现购物程序思路及代码
  5. mcd opc读取数据 西门子数控nx_西门子TIA+PLCSIM+MCD,构建自动化仿真系统
  6. html5图片比例控制,按比例调整图像大小以适应HTML5画布
  7. java pnpoly算法_C语言实现的PNPoly算法代码例子
  8. java fastjson vector转为json_java对象与Json字符串之间的转化(fastjson)
  9. 个人简介页面如何设计?集设网优秀案例给你灵感
  10. 不会手绘有福了!场景的插画素材帮你搞定!