前言

  Java集合框架的内容并不复杂,List、Map、Set中大概10个常见的集合类,建议多看几遍源码(Java7/8),然后回过头再来看看这些各路博客总结的知识点,会有一种豁然开朗的感觉。

本文的结构:

  • 一、Java的基础集合
  • 二、基本特征
  • 三、集合的几种实现
  • 四、集合常见的实现类
  • 五、集合常见实现类的源码解析
  • 六、Collection、Collections、Arrays的区别
  • 七、其他待补充

一、Java的基础集合

  Java的集合主要有Set、List、Queue、Map等。其中,Set、List、Queue继承于Collection,而Map的实现用于保存具有映射关系的数据(key-value),和Collection有一定的差别,它是另一个上层接口。继承结构如下:

Collection:

Map:

二、基本特征:

  • List:有序集合(读取数据和存放数据的顺序一致),元素可以重复,访问元素可以根据元素的索引来访问。
  • Set:无序集合(读取数据和存放数据的顺序不一致),类似于数学上的集合概念,根据元素本身来访问元素和进行重复性判断,因此元素不可以重复。
  • Map:保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。
  • Set和Map容器都有基于哈希存储和排序树(红黑树)的两种实现版本,基于哈希存储的版本理论存取时间复杂度为O(1)(没有哈希冲突),而基于排序树版本的实现在插入或删除元素时会按照元素或元素的键(key)构成排序树从而达到排序和去重的效果,各类操作的时间复杂度为O(logN)。

三、集合的几种实现:

  • 数组:数组占用连续内存空间,根据索引查找(即读取)或修改指定索引的元素,速度较快,但是指定索引处的增删慢。
  • 列表:一般通过数组实现,但可以自动扩展,通过将旧元素复制到新的内存空间上进行扩容。
  • 链表:改快读慢;充分利用了内存,存储空间是不连续的,首尾存储上下一个节点的信息,所以寻址麻烦,查找速度慢,但是找到元素后增删快。
  • 哈希表:链表哈希表综合了前两者的优点,一个哈希表,由数组和链表组成。

四、集合常见的实现类:

1、List的常见实现类

  1. ArrayList:数组实现,查询快,指定索引处增删慢(需要移动后续的元素);对插入的元素不进行判断,元素可为空,也可以重复,元素读取和存放同序;轻量级、线程不安全,可以用Collections配合ArrayList实现线程同步;
  2. LinkedList:链表实现,增删快(前提是要找到指定的结点),查询慢
  3. Vector:数组实现,查询快,增删慢,线程安全,重量级

2、Map的常见实现类

  1. HashMap:键值对,key不能重复(相同的key,其旧的value会被覆盖),但是value可以重复;整体实现是数组+链表;允许null的键或值;线程不安全,可配合Collections工具类使用实现线程安全,或者使用ConcurrentHashMap。
  2. Hashtable(弃用):线程安全的,其线程安全是通过Sychronize实现,不允许null的键或值;
  3. Properties::key和value都是String类型,用来读配置文件;
  4. TreeMap:对key排好序的Map;key要实现Comparable接口或TreeMap的构造器中传入Comparator;内部以red-black(红-黑)树数据结构实现,插入,删除和查找的时间复杂度都是O(log n);实现了SortedMap接口。
  5. LinkedHashMap:是HashMap的子类,对HashMap进行了扩展,其与HashMap的不同之处在于,它维护着一个运行于所有条目的双重链接列表。存储的数据是有序的。保存了记录(或访问)的插入顺序

注:ConcurrentHashMap:线程安全,是通过Lock的方式实现的,并且锁分离。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hasMap,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。

3、Set的常见实现类

  1. HashSet:存放重复的元素时,只会保留一个。一般需要重写hashCode()方法,采用恰当的方式分配散列码。内部实现是HashMap,元素为key,value是同个Object对象。
  2. TreeSet:SortedSet的实现类,实现排序,因此添加到TreeSet的元素必须是可排序的(元素自身可排序或者提供Comparator进行排序),它总是平衡的,保证了插入、删除、查询的性能为log(n)。内部实现是TreeMap。
  3. HashSet和TreeSet都实现了Cloneable接口
  4. HashSet的后台有一个HashMap;初始化后台容量;只不过生成一个HashSet的话,系统只提供key的访问;如果有两个Key重复,那么会覆盖之前的;equals返回true,hashCode返回相同的整数;哈希表;存储的数据是无序的。
  5. LinkedHashSet:与HashSet的不同之外在于,维护着一个运行于所有元素的双向链接。存储的数据是有序的。内部实现是LinkedHashMap

五、集合常见实现类的源码解析

List

  1. ArrayList实现原理:参考我的博客:Java7/8集合框架——LinkedList
  2. LinkedList实现原理:参考我的博客:Java7/8集合框架——LinkedList
  3. Vector实现原理:其实现和ArrayList类似,因方法中使用了synchronized进行同步,是线程安全的

Map

  1. HashMap和ConcurrentHashMap实现原理:参考别人的博客:Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析
  2. LinkedHashMap实现原理:扩展自HashMap,加了自己的一些扩展功能,以支持双向链表。待补充。。。。

Set

  1. HashSet实现原理:其底层使用HashMap,元素为key,而value是同一个Object,即private static final Object PRESENT = new Object();原理类似。
  2. LinkedHashSet实现原理:扩展自HashSet,但是其底层使用LinkedHashMap,元素为key,而value是同一个Object,即private static final Object PRESENT = new Object();原理和LinkedHashMap类似。
  3. TreeSet实现原理:底层是使用TreeMap。

六、Collection、Collections、Arrays的区别

  1. Collection:集合类的上级接口,继承于他的接口主要有Set、List。Set里的元素是不能重复的,equals()方法来区分重复与否。
  2. Collections:是针对集合类的一个工具类,提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
  3. Arrays:此类包含用来操作数组(比如排序和搜索)的各种方法。

七、其他待补充

以下这几点的内容待研究和补充。。。。

1、集合迭代Iterator

2、Iterator的fail-fast和fail-safe

  1. 每次我们尝试获取下一个元素的时候,Iterator的fail-fast属性检查当前集合结构里的任何改动(使用内部属性modCount,修改计数器)。如果发现任何改动,它抛出ConcurrentModificationException。Collection中所有Iterator的实现都是按fail-fast来设计的(ConcurrentHashMap和CopyOnWriteArrayList这类并发集合类除外)。
  2. Iterator的fail-fast属性与当前的集合共同起作用,因此它不会受到集合中任何改动的影响。Java.util包中的所有集合类都被设计为fail-fast的,而java.util.concurrent中的集合类都为fail-safe的。Fail-fast迭代器抛出ConcurrentModificationException,而fail-safe迭代器从不抛出ConcurrentModificationException。
  3. 在Java Fail fast 迭代器中,迭代objects集合有时会出现并发修改异常,出现这种情况有2个原因:①如果一个线程正在迭代一个集合,而另一个线程同时试图修改这个集合;②遍历过程中,试图去修改集合。注:在遍历过程中调用remove()方法不会引起ConcurrentModificationException。
  4. fail-fast(快速失败):快速失败机制在遍历一个集合时,如果集合内容被修改,会抛出ConcurrentModificationException异常。
  5. fail-safe(安全失败):安全失败机制对集合的任何修改都会在一个复制的集合上进行,因此不会抛出异常。

转载于:https://www.cnblogs.com/wpbxin/p/9033468.html

Java7/8集合框架——基本知识点相关推荐

  1. 不必东奔西走,Java 集合框架看这一篇就够了

    Java 集合,也称作容器,主要是由两大接口 (Interface) 派生出来的:Collection 和 Map 顾名思义,容器就是用来存放数据的. 那么这两大接口的不同之处在于: Collecti ...

  2. vue中集合取第一个_快速学习Vue框架(知识点集合)

    学习Vue的小伙伴速度看过来,快速学习Vue框架知识点集合贴来啦.建议收藏,尤其基础并不是很扎实的同学,本篇集合贴就是你日后工作的参考手册. 基础知识: ·vue的生命周期:beforeCreate/ ...

  3. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合...

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

  4. Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO

    Java基础知识第二讲(Java编程规范/JVM/集合框架/异常体系/Java反射/语法知识/Java IO/码出高效) 分享在java学习及工作中,常使用的一些基础知识,本文从JVM出发,讲解了JV ...

  5. JAVA语言基础-面向对象(集合框架02List、泛型)

    2019独角兽企业重金招聘Python工程师标准>>> 16.01_集合框架(去除ArrayList中重复字符串元素方式)(掌握) A:案例演示 需求:ArrayList去除集合中字 ...

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

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

  7. 容器(一)剖析面试最常见问题之 Java 集合框架

    转载自https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/collection/Java%E9%9B%86%E5%90%88%E ...

  8. java list有序还是无序_牛批!2w字的Java集合框架面试题精华集(2020最新版),赶紧收藏。...

    一个多月前,作者和一些小伙伴决定做一系列的 Java 知识点常见重要问题的小册,方便用来夯实基础!小册的标准就一个,那就是:取精华,取重点.每一本小册,我们都会充分关注我们所总结的知识点是否达到这个标 ...

  9. Java 集合框架,看这篇真的够了!

    话不多说,直接上图: Java 集合,也称作容器,主要是由两大接口 (Interface) 派生出来的: Collection 和 Map 顾名思义,容器就是用来存放数据的. 那么这两大接口的不同之处 ...

  10. Java 集合框架看这一篇就够了

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:都说了多少遍,不要再学 JSP 了!个人原创100W+访问量博客:点击前往,查看更多 话不多说,直接上图: Ja ...

最新文章

  1. php-fpm进程数优化方法
  2. Android中调用另一个Activity并返回结果-以模拟选择头像功能为例
  3. nyoj - 概率计算 926
  4. Message 消息提示
  5. SAP CRM和C4C的客户主数据修改历史记录查询
  6. Exchange企业实战技巧(26)在Outlook中打开多个邮箱
  7. android屏幕适配流程,Android屏幕适配姿势
  8. matlab里dcgain,制系统的时域分析
  9. 不要过打折的生活,当你发现这些你有了,说明你开始成熟了
  10. Objective-c官方文档 怎么自定义类
  11. iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接)
  12. [20140702]奇怪的应用程序超时
  13. python 解压缩字符串_在C中压缩字符串,在python中解压缩
  14. python必背100源代码-python 100例 (持续更新)
  15. js如何准确获取当前页面url网址信息
  16. 独家专访VB100:趋势科技退出缘于新病毒检测失败
  17. phpdesigner(php开发工具) 注册码,php 开发工具 phpDesigner7 附注册机
  18. Ubuntu18.04无法上网
  19. 为什么说衰老先从血管开始?
  20. php 图片效果代码,php实用图片水印效果代码

热门文章

  1. 项目经理感悟之风险管理
  2. ROC曲线和AUC 原理与实现——Python实战
  3. Linux: Shell scripts
  4. win7 下安装python用的dlib库
  5. js 对一个字段去重_写一个N-API没那么难?
  6. Leetcode10. Regular Expression Matching
  7. 现代控制理论概念梳理(脑图)
  8. React antD-Pro 添加函数防抖
  9. Git 常见问题总结
  10. 《别输在不会表达上》— 综合素质提升书籍