从源码来理解ArrayList和LinkedList区别

从源码理解ArrayList和LinkedList区别

ArrayList

ArrayList默认容量为10,实质是一个数组用于存放元素,size表示ArrayList所包含的元素个数。

ArrayList的3个构造函数,第一个构造函数指定容量,第二个构造函数默认为一个空数组,第三个构造函数是从集合c转变为Arraylist的数组

add函数中,先确认数组容量够不够,一开始如果默认初始化(也就是调用第二个构造函数),添加元素时grow出来数组容量为10,构造了一个新的数组并且copy原来数组元素的值,然后element[0]赋值,第二次添加元素时因为elementData != EMPTY_ELEMENTDATA且

minCapacity - elementData.length <0所以直接element[1]赋值,并没有扩充容量,只有当满容量时才会扩容。

remove(int)函数,指移走序号为index的元素,numMoved指的是index后面元素个数,System.arraycopy后面的元素往前推一格,最后的元素置null,返回被删除的value

跟上面remove(int)的原理一样.

如果找得到,则返回序号,否则返回-1

LinkedList

LinkedList存放数据采用的是链表形式存放

first是指向首节点,last是指向尾结点

LinkedList有两个构造函数,第二个构造函数中将集合的元素传到链表上

都是采用链表插入数据的方法

都是采用链表删除元素的方法

链表查找元素的方法。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-07 00:13:50

从源码来理解ArrayList和LinkedList区别的相关文章

Java源码分析之ArrayList、LinkedList、Vector

ArrayList jdk 7情况下ArrayList list = new ArrayList();//底层创建了长度是10的Object[]数组elementDatalist.add(123);//elementData[0] = new Integer(123);...list.add(11);//如果此次的添加导致底层elementData数组容量不够,则扩容.默认情况下,扩容为原来的容量的1.5倍,同时需要将原有数组中的数据复制到新的数组中. 结论:建议开发中使用带参的构造器:Arra

Java集合源码分析(三)LinkedList

LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使用. LinkedList同样是非线程安全的,只在单线程下适合使用. LinkedList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了Cloneable接口,能被克隆. LinkedList源码 以下是linkedList源码(加入简单代码注释): /* * @(#)LinkedList.java 1.6

【Java集合源码剖析】ArrayList源码剖析

转载请注明出处:http://blog.csdn.net/ns_code/article/details/35568011 ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发包下的C

storm源码之理解Storm中Worker、Executor、Task关系【转】

[原]storm源码之理解Storm中Worker.Executor.Task关系 Storm在集群上运行一个Topology时,主要通过以下3个实体来完成Topology的执行工作:1. Worker(进程)2. Executor(线程)3. Task 下图简要描述了这3者之间的关系:                                                    1个worker进程执行的是1个topology的子集(注:不会出现1个worker为多个topology服

从源代码来理解ArrayList和LinkedList差别

从源代码理解ArrayList和LinkedList差别 ArrayList ArrayList默认容量为10,实质是一个数组用于存放元素,size表示ArrayList所包括的元素个数. ArrayList的3个构造函数,第一个构造函数指定容量.第二个构造函数默觉得一个空数组.第三个构造函数是从集合c转变为Arraylist的数组 add函数中,先确认数组容量够不够,一開始假设默认初始化(也就是调用第二个构造函数),加入元素时grow出来数组容量为10.构造了一个新的数组而且copy原来数组元

OpenJDK 源码阅读之 ArrayList

概要 类继承关系 java.lang.Object java.util.AbstractCollection<E> java.util.AbstractList<E> java.util.ArrayList<E> 定义 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serial

jdk源码解读之ArrayList

直接上源码: 构造函数:     /**      * Constructs an empty list with an initial capacity of ten.      */     public ArrayList() {     this(10);     } 其实arrayList的本质是一个数据,只不过这个数组的大小可以变化.我们先来看下arraylist的数组是怎么定义的     /**      * Constructs an empty list with the sp

JDK源码分析系列-ArrayList

1.ArrayList本质 数组 + 动态扩容实现的数据列表. private static final Object[] EMPTY_ELEMENTDATA = {}; // elementData初始为空数组 public ArrayList() { super(); this.elementData = EMPTY_ELEMENTDATA; } // 指定初始容量,不能为负数 // 如果能预估集合大小,建议初始化时指定容量,避免扩容,提升性能 public ArrayList(int in

ArrayList和LinkedList区别

ArrayList和LinkedList区别: 一句话概括:ArrayList 通过的是数组形式来存贮管理对象的,LinkedList是通过链表的方式. 共同点: LinkedeList和ArrayList都实现了List接口 ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用(references). 但是它们的工作原理却不一样. 它们之间最主要的区别在于ArrayList是可改变大小的数组,而LinkedList是双向链接串列(doubly LinkedList)