List实现了Collection接口,产生三个子类:ArrayList,LinkedList,Vector

文章包含解释方面:
数据结构方面,
源码注释方面&迭代器快速失败机制

方面1—基于源码的数据结构

基于源码的数据结构,我们先给出如下比较结果:

ArrayList&Vector是基于数组的实现。
那么他们:

-基于数组下标的快速查找功能-数据插入费力,因为要移动一大段数据为新数据提供插入位-数组可能溢出(已经被开发者利用grow()扩容解决)必须是一片连续内存空间

注解:
我们看一下ArrayList的扩容源码(Vector省略(扩容一倍)):
判断是否扩容代码,在发生在每次添加数据时(每次使用size+数据长度和当前容量比较),但是源码里面规定了当数组容量小于10(DEFAULT_CAPACITY )时不会进行扩容
ArrayList:

    private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win:elementData = Arrays.copyOf(elementData, newCapacity);}

我们发现扩容很简单,但是也是耗费系统资源的,协调用法比较重要

int newCapacity = oldCapacity + (oldCapacity >> 1);
elementData = Arrays.copyOf(elementData, newCapacity);

这两句说,
当发生扩容时先对原有的数组长度进行右移一位,也就是扩容一半(减少扩容次数,增大用量 )

LinkedList基于双向链表的实现。
那么:

-读取数据效率低一些,因为是双向链表,每次查询都得从头|尾进行遍历节点-插入效率高些,不管前中后,插入都快,因为他不需要移动大量数据-当数据过多时,节点(Node对象)本身也是一种资源消耗,数组实现不会-是一个不连续内存空间

我们看出前者适合多查询,少插入的数据,后者适合多插入,少查询的数据

不过一般大家都是综合考虑。

方面2—基于各个源码的类的主要注释

基于各个源码的类的注释
给出LinkedList:

阅读发现,LinkedList是线程不安全的,它的迭代器是快速失败的
他允节点为null值,遍历都是从头或尾开始的

ArrayList:

阅读发现,ArrayList是线程不安全的,它的迭代器是快速失败的
它是大小可变的,复杂度为O(n)
Vector:

阅读发现,Vector是线程安全的(那消耗资源也会多),迭代器也是快速失败的。

**对于ArrayList,LinkedList的线程不安全,可在创建时利用Collections.synchronizedList进行"包装"
即:

List list=Collections.synchronizedList(new LinkedList());

关于迭代器的快速失败(异常访问操作,必须抛异常)

在此时,我们三个类一起看,发现他们的类,迭代器都是快速失败的,
什么是快速失败?
这是一种集合的错误处理机制(Map,Set也有),他会尽全力抛出ConcurrentModificationException异常(因为判断抛出的标准是值是否相等,而开发者并不保证值被人为修改),在你通过自身迭代器遍历时,对集合内容修改的时候,就会直接抛异常,退出迭代

其实原因很简单,源码里面有个modCount变量,他会在集合迭代时,每次增删时加一(其他非迭代修改没问题),迭代器会通过这个变量是否改变( modCount!=expectedmodCount)进行决定抛异常(在每次迭代下一个元素时next()会触发)
这是一种判断方式,这样会保护集合的正确性,也既是保证集合不能并发访问。

如果还是不对,可以百度:

java中的fail-fast(快速失败)机制

这样再一看List发现再也不是只知形不知意了。

ps:源码学习目前只能靠边看代码边写博客进行总结,没什么更多的有效方法,朋友们可以的话,留下你宝贵的学习 建议|方法,我一定虚心接受。

java-List集合的源码分析(数据结构方面,源码注释方面),迭代器快速失败机制相关推荐

  1. Java集合类框架源码分析 之 LinkedList源码解析 【4】

    上一篇介绍了ArrayList的源码分析[点击看文章],既然ArrayList都已经做了介绍,那么作为他同胞兄弟的LinkedList,当然必须也配拥有姓名! Talk is cheap,show m ...

  2. spring源码分析第一天------源码分析知识储备

    spring源码分析第一天------源码分析知识储备 Spring源码分析怎么学? 1.环境准备: 2.思路    看:是什么? 能干啥    想:为什么?     实践:怎么做?         ...

  3. k8s client-go源码分析 informer源码分析(3)-Reflector源码分析

    k8s client-go源码分析 informer源码分析(3)-Reflector源码分析 1.Reflector概述 Reflector从kube-apiserver中list&watc ...

  4. GDB 源码分析系列文章五:动态库延迟断点实现机制

    系列文章: GDB 源码分析系列文章一:ptrace 系统调用和事件循环(Event Loop) GDB 源码分析系列文章二:gdb 主流程 Event Loop 事件处理逻辑详解 GDB 源码分析系 ...

  5. java.util.ConcurrentModificationException: null异常(已解决,原因出自于Java集合的快速失败机制)

    问题来源 今天我在写项目时,对集合中的元素做了以下操作 报错信息如图 问题来源: 在Java中对集合进行遍历时,一旦对集合进行增删操作,在遍历时会引起java.util.ConcurrentModif ...

  6. java返回fail_Java集合中的fail-fast(快速失败)机制详解

    简介 我们知道Java中Collection接口下的很多集合都是线程不安全的, 比如 java.util.ArrayList不是线程安全的, 因此如果在使用迭代器的过程中有其他线程修改了list,那么 ...

  7. Cesium 50个实例集合,讲解、分析(内附源码)

    Cesium-Project 为方便快速测试 Cesium Demo使用,添加了一些演示demo并且提供了webpack打包的示例. 详情源码连接: Cesium 50个实例集合,讲解.分析源码下载 ...

  8. 【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )

    文章目录 一.ConnectivityController 连接控制器引入 二.ConnectivityController 构造方法解析 ( 注册接收者 ) 三.mConnectivityRecei ...

  9. Spring源码分析之AOP源码分析

    文章目录 前言 一.AOP回顾 二.源码分析 EnableAspectJAutoProxy注解 AnnotationAwareAspectJAutoProxyCreator 前言 Spring框架的两 ...

最新文章

  1. JS模式:jq中简单的模式--》采摘自js设计(tomxu_version)
  2. python ccbox_python--easygui
  3. 数据库中char与varchar类型的区别 1
  4. js 中英文字符串长度
  5. 古登堡是垂直搜索引擎吗_网站排名,提高内容输出频率,就一定要对排名好吗?-SEO...
  6. Oracle基础语句
  7. 红橙Darren视频笔记 状态栏设置颜色 获取高度 设置全屏
  8. 垃圾回收算法_Java 垃圾回收算法与几种垃圾回收器
  9. Hacker News 7 月编程语言招聘趋势榜:Python 稳居第一,Go 成功击败 Java
  10. 2021年软件供应链攻击数量激增300%+
  11. 转载的关于pthread_cond_wait的文章,写的比较详细
  12. linux 如何重建mbr,重建mbr要不要勾选
  13. 联想电脑黑屏但电源键亮着的解决办法
  14. GraphRNN: Generating Realistic Graphs with Deep Auto-Regressive Models
  15. 电容能抗多大的ESD?
  16. MATLAB画图---设置坐标轴为固定值(以4厘米为例)
  17. python本科毕设_关于本科毕设选题请教问题
  18. [激光原理与应用-23]:《激光原理与技术》-9- 激光产生技术-锁模技术
  19. 用Photoshop给照片换美丽天空
  20. Thinkphp 6 使用thinkTemplate 模板引擎

热门文章

  1. 三款免费实用的文件夹同步/备份软件推荐 (SyncToy/FreeFileSync/Compare Advance)
  2. 【Netty】TCP粘包和拆包
  3. 关于z-index的总结
  4. JavaScript原生对象属性和方法详解——String对象
  5. 如何让插件加载到Qt Designer
  6. //随机生成1位大写字母\小写字母\数字
  7. Java通过几种经典的算法来实现数组排序
  8. web安全_皮卡丘_xss
  9. [网络安全提高篇] 一〇六.SQL注入之手工注入和SQLMAP入门案例详解
  10. [网络安全自学篇] 六十五.Vulnhub靶机渗透之环境搭建及JIS-CTF入门和蚁剑提权示例(一)