元素分析

数据结构----数组

白昼怎懂夜的黑 提交于 2019-12-04 19:06:20
数组:内存中开辟的连续的、有序的空间 动态数组时间复杂度 动态数组的扩容 reSize,涉及到数组的复制,时间复杂度为O(n) 添加操作:O(n)     addFirst() 不扩容,则单纯的将所有元素后移O(n) ,若扩容, reSize O(n) + 元素后移 O(n) =2O(n) -->O(n)     addLast() 不扩容,则为O(1),扩容 O(n) -->O(n)     add(Index,e) 不扩容,去index为size/2,则O(n/2)--> -->O(n)   最终动态数组的add时间复杂度为O(n) 移除操作O(n)     removeFirst() 不扩容,则单纯的将所有元素前移O(n) ,若扩容, reSize O(n) + 元素后移 O(n) =2O(n) -->O(n)     removeLast() 不扩容,则为O(1),扩容 O(n) -->O(n)     remove(Index,e) 不扩容,去index为size/2,则O(n/2)--> -->O(n) 修改操作:O(1) 查询     get(Index),根据索引查询,则为O(1) (已知索引) contains(e)/find(e) 则为O(n)      (未知索引) 以上操作均为最坏情况分析,但是不可能每次操作都涉及扩容,所以总以最坏情况分析并不是完全合理的。

【集合系列】- 深入浅出分析Collection中的List接口

…衆ロ難τιáo~ 提交于 2019-12-04 16:25:03
一、List简介 List 的数据结构就是一个序列,存储内容时直接在内存中开辟一块连续的空间,然后将空间地址与索引对应。 以下是List集合简易架构图 由图中的继承关系,可以知道,ArrayList、LinkedList、Vector、Stack都是List的四个实现类。 AbstractCollection 是一个抽象类,它唯一实现Collection接口的类。AbstractCollection主要实现了toArray()、toArray(T[] a)、remove()等方法。 AbstractList 也是一个抽象类,它继承于AbstractCollection。AbstractList实现List接口中除size()、get(int location)之外的函数,比如特定迭代器ListIterator。 AbstractSequentialList 是一个抽象类,它继承于AbstractList。AbstractSequentialList 实现了“链表中,根据index索引值操作链表的全部函数”。 ArrayList 是一个动态数组,它由数组实现。随机访问效率高,随机插入、随机删除效率低。 LinkedList 是一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作。LinkedList随机访问效率低,但随机插入、随机删除效率高。 Vector 也是一个动态数组

CopyOnWriteArrayList源码分析

天大地大妈咪最大 提交于 2019-11-29 14:27:00
前言:CopyOnWriteArrayList为ArrayList的线程安全版本,这里来分析下其内部是如何实现的。 注:本文jdk源码版本为jdk1.8.0_172 1.CopyOnWriteArrayList介绍 CopyOnWriteArrayList是ArrayList的线程安全版本,因此其底层数据结构也是 数组 ,但是在写操作的时候都会拷贝一份数据进行修改,修改完后替换掉老数据,从而保证只阻塞写操作,读操作不会阻塞,实现读写分离。 1 public class CopyOnWriteArrayList<E> 2 implements List<E>, RandomAccess, Cloneable, java.io.Serializable {} 2.具体源码分析 底层数据结构: 1 /** The lock protecting all mutators */ 2 // 使用可重入锁进行加锁,保证线程安全 3 final transient ReentrantLock lock = new ReentrantLock(); 4 5 /** The array, accessed only via getArray/setArray. */ 6 // 底层数据结构,注意这里用volatile修饰,确定了多线程情况下的可见性 7 private transient

ArrayList源码分析

别说谁变了你拦得住时间么 提交于 2019-11-29 14:12:20
前言:作为一个常用的List接口实现类,日常开发过程中使用率非常高,因此有必要对其原理进行分析。 注:本文jdk源码版本为jdk1.8.0_172 1.ArrayList介绍 ArrayList底层数据结构是 数组 (数组是一组连续的内存空间),默认容量为10,它具有动态扩容的能力,线程不安全,元素可以为null。 笔者在一次使用ArrayList的时候引起了一次线上OOM,分析传送门: 记一次ArrayList产生的线上OOM问题 1 java.lang.Object 2 ↳ java.util.AbstractCollection<E> 3 ↳ java.util.AbstractList<E> 4 ↳ java.util.ArrayList<E> 5 6 public class ArrayList<E> extends AbstractList<E> 7 implements List<E>, RandomAccess, Cloneable, java.io.Serializable {} 2.主要源码分析 add(e): 1 public boolean add(E e) { 2 // 确认容量 3 ensureCapacityInternal(size + 1); // Increments modCount!! 4 // 直接将元素添加在数组中 5

Java集合之ArrayList源码分析

混江龙づ霸主 提交于 2019-11-28 18:25:40
Java集合之ArrayList源码分析 个人开发环境 java环境:Jdk1.8.0_60 编译器:IntelliJ IDEA 2017.1.4 源码连接:待整理 原文链接: https://juejin.im/post/5cb161b3e51d456e7c0cdad4#heading-16 (个人附加了英文注释,以及为了更好阅读调整了一下,英文不好趁看源码机会冲冲电,理解不当望大佬们指出,仅供个人学习总结使用,如有侵权,联删!!!) UML图 源码解析 属性 /** * Default initial capacity. * 默认初始化容量为 10 */ private static final int DEFAULT_CAPACITY = 10; /** * Shared empty array instance used for empty instances. * 一个空数组,当用户指定该ArrayList为0时,返回该空数组 */ private static final Object[] EMPTY_ELEMENTDATA = {}; /** * Shared empty array instance used for default sized empty instances. * We distinguish this from EMPTY_ELEMENTDATA

LinkedList源码分析

左心房为你撑大大i 提交于 2019-11-27 03:45:31
public class LinkedList < E > extends AbstractSequentialList < E > implements List < E > , Deque < E > , Cloneable , java . io . Serializable { 由上源码可知: LinkedList 是一个继承于AbstractSequentialList的双向链表。 LinkedList 实现 List 接口,能对它进行队列操作。 LinkedList 实现 Deque 接口,(Deque就是双向队列的接口),即能将LinkedList当作双端队列使用。 LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。 LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。LinkedList 是非同步的。 1.构造函数 transient Node < E > first ; //指向第一个节点的指针。 transient Node < E > last ; //指向最后一个节点的指针。 public LinkedList ( ) { } /* * 按照集合的迭代器返回元素的顺序,构造包含指定集合的元素的列表 */ public LinkedList (

Java——LinkedList底层源码分析

三世轮回 提交于 2019-11-26 19:54:19
1.简介 LinkedList 是用链表结构存储数据的,很 适合数据的动态插入和删除 ,随机 访问和遍历速度比较慢 。另外,他还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以 当作堆栈、队列和双向队列使用 。 LinkedList 是实现了 List 接口 和 Deque 接口 的 双端链表 。 LinkedList底层的链表结构使它 支持高效的插入和删除操作 ,另外它实现了Deque接口,使得LinkedList类也具有队列的特性。 LinkedList 不是线程安全的 ,如果想使LinkedList变成线程安全的,可以调用静态类 Collections类 中的 synchronizedList 方法: List list=Collections.synchronizedList(new LinkedList(...)); 2.内部结构 3.构造方法 1)空构造方法 public LinkedList() { } 2)已有的集合创建链表构造方法 public LinkedList(Collection<? extends E> c) { this(); addAll(c); } 4.添加元素方法 1)add(E e) 方法:将元素添加到链表尾部 public boolean add(E e) { linkLast(e);//这里就只调用了这一个方法

Java——ArrayList底层源码分析

岁酱吖の 提交于 2019-11-26 17:45:20
1.简介 ArrayList 是最常用的 List 实现类,内部是通过 数组实现 的,它允许对元素进行 快速随机访问 。数组的缺点是每个元素之间不能有间隔, 当数组大小不满足时需要增加存储能力,就要将已经有数组的数据复制到新的存储空间中 。 当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它 适合随机查找和遍历,不适合插入和删除 。 线性表的顺序存储,插入删除元素的时间复杂度为O(n),求表长以及增加元素,取第 i 元素的时间复杂度为O(1)。 ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用 ensureCapacity 操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。 2.继承与实现 它继承于 AbstractList,实现了 List, RandomAccess, Cloneable, java.io.Serializable 这些接口。 ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。 ArrayList 实现了RandomAccess 接口, RandomAccess 是一个标志接口,表明实现这个这个接口的 List