元素分析

手撕ArrayList底层,透彻分析源码

核能气质少年 提交于 2020-02-28 09:01:02
ArrayList概述 Hello大家好,今天就来介绍一下ArrayList,说到ArrayList,很多人都知道它的底层是使用数组实现的,线程不安全的,说到它的特点,都会说查找快,增删慢,因为面试题大家都是这么背过来的。今天就来说说它的底层源码吧。 ArrayList更准确的说是动态数组去实现的,这里使用动态两字,是为了能够充分体现它的特点。 再者就是ArrayList不是线程安全的,所以效率比较高,但是否这个是绝对的呢?答案是否定的 。 ArrayList底层源码 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ private static final long serialVersionUID = 8683452581122892189L; private static final int DEFAULT_CAPACITY = 10; private static final Object[] EMPTY_ELEMENTDATA = {}; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

ArrayList的源码分析

六眼飞鱼酱① 提交于 2020-02-27 11:38:50
前言 我思故我在 ArrayList的简介 1,ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用 ensureCapacityXXX 方法来操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。 2,它继承了 AbstractList ,实现了 List , RandomAccess , Cloneable , java.io.Serializable 这些接口。 3,插入删除元素的时间复杂度为 O(n) ,求表长以及增加元素,取第 i 元素的时间复杂度为 O(1) 4,继承AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。 5,实现 RandomAccess 接口 , RandomAccess 是一个标志接口,表明实现这个这个接口的 List 集合是支持 快速随机访问 的。在 ArrayList 中,我们即可以通过元素的序号快速获取元素对象,这就是快速随机访问。对于实现了 RandomAccess 接口 的集合在使用 Collections.binarySearch方法 ,的执行策略有所不同。 6,实现 Cloneable 接口 ,即覆盖了函数 clone(), 能被克隆 。 7,实现 java.io

手撕ArrayList底层,透彻分析源码

蓝咒 提交于 2020-02-26 22:31:47
ArrayList概述 Hello大家好,今天就来介绍一下ArrayList,说到ArrayList,很多人都知道它的底层是使用数组实现的,线程不安全的,说到它的特点,都会说查找快,增删慢,因为面试题大家都是这么背过来的。今天就来说说它的底层源码吧。 ArrayList更准确的说是动态数组去实现的,这里使用动态两字,是为了能够充分体现它的特点。 再者就是ArrayList不是线程安全的,所以效率比较高,但是否这个是绝对的呢?答案是否定的 。 ArrayList底层源码 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ private static final long serialVersionUID = 8683452581122892189L; private static final int DEFAULT_CAPACITY = 10; private static final Object[] EMPTY_ELEMENTDATA = {}; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

动态数组

守給你的承諾、 提交于 2020-02-26 12:55:06
知识点 实现属于自己的动态数组类 分析时间复杂度: 增: O(n) 删: O(n) 改: 已知索引O(1);未知索引O(n) 查: 已知索引O(1);未知索引O(n) 主要操作 一些变量定义: data: 数组 size:当前数组中的元素个数 添加操作 描述: 在指定索引 index 位置添加元素。 思路: 先检查索引是否越界,没有越界的情况下继续往下执行,否则抛异常。 当 size >= data.length 时,进行扩容操作,大小扩容为(data.length * 2)。 当前面两步都没问题的情况下,进行添加操作,先将 index 位置后的元素整体向后移动,移动完毕后再将要添加的元素添加到 index 位置。 最后 size 不要忘记加 1。 public void add(int index, E e) { if (index < 0 || index > size) { throw new IllegalArgumentException("Add failed. Require index >= 0 and index <= size."); } // 数组容量不够的话就进行扩容 if (size >= data.length) { resize(2 * data.length); } for (int i = size - 1; i >= index; i--) {

LinkedList源码分析

爷,独闯天下 提交于 2020-02-03 19:35:20
文章目录 LinkedList源码分析 类结构 AbstractSequentialList类介绍 双端队列Deque 类介绍 内部结构 源码介绍 成员变量 构造函数 添加元素 add(E) add(int , E ) add(int,Collection) 删除元素 remove() remove(int) remove(Object) get/set元素 序列化 遍历 总结 湖北加油,武汉加油 LinkedList源码分析 类结构 与ArrayList不同的是,LinkedList继承AbstractSequentialList,实现了Deque(双端队列)。 AbstractSequentialList类介绍 This class provides a skeletal implementation of the List interface to minimize the effort required to implement this interface backed by a "sequential access" data store ( such as a linked list ) . For random access data ( such as an array ) , AbstractList should be used in preference

Java8 ArrayList源码分析

孤街浪徒 提交于 2020-01-01 14:57:46
java.util.ArrayList 是最常用的工具类之一, 它是一个线程不安全的动态数组. 本文将对JDK 1.8.0中ArrayList实现源码进行简要分析. ArrayList 底层采用 Object[] 来存储, 每次添加元素前都会检查数组是否有足够空间容纳新的元素. 若数组空间不足则会进行扩容操作, 即创建一个容量更大的数组 并将已有的元素复制到新数组中. 默认情况下新数组的容量是当前容量的1.5倍. ArrayList使用 Arrays.copyOf 和 System.arraycopy 调用原生(native)方法进行数组复制, 以提高效率. addAll , removeAll 等方法中通常使用 c.toArray 方法来获取容器中所有元素. ArrayList提供了 iterator() 和 listIterator() 两种迭代器, 前者只能向后移动, 而后者可以双向移动. iterator() 只能删除上一个访问的元素, 而 listIterator() 还可以在游标位置添加元素. 两种迭代器都采用fail-fast机制, 即使用 modCount 记录结构性改变(添加删除元素等)的次数, 迭代器在移动前会检查 modCount 是否发生改变. 若 modCount 改变, 则抛出异常中止迭代. 该方法是为了防止其它线程修改容器造成迭代结果不一致.

软件构架实践(第2版)学习笔记

我的梦境 提交于 2019-12-28 03:26:40
一、软件架构、架构模式、参考模型、参考架构 1 、对于软件架构定义有很多种,通用的定义是:某个软件或计算机系统的软件架构是该系统的一个或多个结构,他们由软件元素,这些元素的外部可见属性以及这些元素之间的关系组成。 这里所说的某个元素的“外部可见属性”是指其他元素对该元素所做的假设,如它所提供的服务、性能特征、错误处理、共享资源的使用,等等。 其他的定义包括:架构是一种高层设计。架构是系统的总体结构。架构是一个软件或系统的组件、组件之间的相互关系以及管理其设计和演变的原理和方针的结构。架构是组件和连接器。 2 、架构模式是对元素和关系类型以及一组对其使用方式的限制的描述。 3 、参考模型是一种考虑数据流的功能划分。 4 、参考架构是映射到软件元素(它们相互协作,共同实现在参考模型中定义的功能)及元素之间数据流上的参考模型。 5 、软件架构、架构模式、参考模型、参考架构之间的关系: 6 、软件架构的重要性 (1) 、架构是涉众进行交流的手段。 (2) 、架构是早期设计决策的体现。 (3) 、架构是可传递、可重用的模型。 7 、架构定义中指出系统由多种结构构成的,下面列出一些常见的结构。 软件结构 关系 适用环境 分解 是一个子模块;与之共享秘密 资源分配、项目结构化和规划;信息隐藏、封装;配置控制 使用 要求正确出现 设计子集;设计扩展 分层 要求正确的出现、使用服务、提供抽象

软件构架实践(第2版)学习笔记

你说的曾经没有我的故事 提交于 2019-12-28 03:26:25
一、软件架构、架构模式、参考模型、参考架构 1、对于软件架构定义有很多种,通用的定义是:某个软件或计算机系统的软件架构是该系统的一个或多个结构,他们由软件元素,这些元素的外部可见属性以及这些元素之间的关系组成。 这里所说的某个元素的“外部可见属性”是指其他元素对该元素所做的假设,如它所提供的服务、性能特征、错误处理、共享资源的使用,等等。 其他的定义包括:架构是一种高层设计。架构是系统的总体结构。架构是一个软件或系统的组件、组件之间的相互关系以及管理其设计和演变的原理和方针的结构。架构是组件和连接器。 2、架构模式是对元素和关系类型以及一组对其使用方式的限制的描述。 3、参考模型是一种考虑数据流的功能划分。 4、参考架构是映射到软件元素(它们相互协作,共同实现在参考模型中定义的功能)及元素之间数据流上的参考模型。 5、软件架构、架构模式、参考模型、参考架构之间的关系: 6、软件架构的重要性 (1)、架构是涉众进行交流的手段。 (2)、架构是早期设计决策的体现。 (3)、架构是可传递、可重用的模型。 7、架构定义中指出系统由多种结构构成的,下面列出一些常见的结构。 软件结构 关系 适用环境 分解 是一个子模块;与之共享秘密 资源分配、项目结构化和规划;信息隐藏、封装;配置控制 使用 要求正确出现 设计子集;设计扩展 分层 要求正确的出现、使用服务、提供抽象 增量式开发;在“虚拟机

StreamAPI源码分析之二(Collectors工厂类内部设计分析篇)

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-27 01:49:33
前言 前一小结对Collector接口进行了总结介绍,并没有对其实现进行展开,接下来对Collectors进行展开,Collections本身提供了关于Collectors的常见汇聚实现,Collectors其实就是一个工厂。collector由四个函数指定,这些函数一起工作,将条目 累积到可变结果容器中,并可以选择对结果执行 最终转换,将会在Collectors看到Collector的实习内幕。本节主要分析层次设计,不对细节方法进行深入分析,Collectors工厂类将以两小节进行分析,当我们看清楚Collectors工厂类内部设计的时候,可能对于源码的理解会更好。 1、Collectors介绍 Collector的实现,实现各种有用的reduction汇聚操作,例如将元素累积到集合中,根据各种条件汇总元素等。 以下是使用预定义收集器执行*常见可变缩减任务的示例: // 将姓名累加到列表中 * List < String > list = people.stream ( ) * .map ( Person::getName ) * .collect ( Collectors.toList ( )) ; * * // 把名字累加成树集 * Set < String > set1 = people.stream ( ) * .map ( Person::getName ) *

ArrayList源码分析(jdk 1.8)

点点圈 提交于 2019-12-19 01:43:26
写在前面 ArrayList相信大家做开发的同学都不陌生,在开发过程中这应该是最常用的数据结构了吧。但是现在是“源码时代”,会用还不够,要知道他的实现原理,本文主要基于jdk1.8对ArrayList源码进行分析。 一、从主要字段开始 值得注意的是,ArrayList内部会有一个modCount字段,但是这个字段是在父类AbstractList中的,代表着修改次数,后面会讲 /** * 默认容量 */ private static final int DEFAULT_CAPACITY = 10; /** * 空元素集,构造函数传入空集合的时候使用 */ private static final Object[] EMPTY_ELEMENTDATA = {}; /** * 空元素集,默认无参构造函数中使用 */ private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; /** ArrayList真正保存元素的数组,在第一次插入元素的时候扩容 * */ transient Object[] elementData; // non-private to simplify nested class access /** * 当前数组元素个数 * * @serial */ private int size;