ArrayList是Java众多集合类中的一个,实现List接口,List的父接口是Collection。ArrayList底层的数据结构是线性表中的顺序表,底层是一个长度可以动态增长的数组。数组有很多缺点,ArrayList弥补了数组的缺点。

源码:

1)transient Object[] elementData;,是一个数组的引用,用来指向底层数组;private int size;用来表示ArrayList中真实元素的个数,每次增加和删除元素size的值都要变化。

2)public class ArrayList<E> extends AbstractList<E> implements List<E>,RandomAccess,Cloneable,java.io.Serializable{} 这三个接口都没有方法。

3)数组默认长度:JDK 1.7中 new ArrayList()>>>this(10);JDK 1.8中 new ArrayList(),数组的长度是0。第一次添加元素时扩容。

4)当数组已经满时,默认每次扩容为原来的50%;使用了位运算

private void grow(int minCapacity) {
// overflow-conscious code
int 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);
}

如果扩容50%的空间不足以存放元素,就扩容为所添加元素的最小容量。

5)iterator();ArrayList中提供了一个内部类:Itr implements Iterator,实现了其中的hasNext()、next()等方法。

基本思路:有一个索引/指针,初始执行第一个元素,next()时指向下一个元素,hasNext()判断是否等于size。

优缺点:

数组的优缺点决定了ArrayList的优缺点,数组按索引查询最快,添加删除元素都要大量移动元素,效率很低。ArrayList不仅按索引查询速度快,而且实现了长度的动态变化;但是缺点也很明显,即删除和添加效率低。按内容查找要逐个比较,效率低下。

综上所述,在添加删除操作多的时候不建议使用ArrayList;遍历时,按照索引随机获取某一元素操作多的时候建议使用ArrayList。

Vector是早期版的ArrayList,线程安全,效率低,每次扩容100%。

LinkedList底层是双向链表,优缺点和数组正好相反。

ArrayList和LinkedList的底层代码实现思想的更多相关文章

  1. HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList的底层实现

    HashMap:底层是一个数组+链表实现 LinkedHashMap:底层是Hash表和链表的实现 ConcurrentHashMap:基于双数组和链表的Map接口的同步实现 ArrayList:底层 ...

  2. java集合(ArrayList,Vector,LinkedList,HashSet,TreeSet的功能详解)

    说起集合,我们会潜意识里想到另外一个与之相近的名词——数组,OK!两者确实有相似之处,但也正是这点才是我们应该注意的地方,下面简单列出了两者的区别(具体功能的不同学习这篇文章后就会明白了): 数组 长 ...

  3. ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转)

    主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...

  4. ArrayList和LinkedList的几种循环遍历方式及性能对比分析

    最新最准确内容建议直接访问原文:ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性 ...

  5. ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转载)

    原文地址: http://www.trinea.cn/android/arraylist-linkedlist-loop-performance/ 原文地址: http://www.trinea.cn ...

  6. ArrayList和LinkedList遍历方式及性能对比分析

    ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayLis ...

  7. 【转】ArrayList和LinkedList的几种循环遍历方式及性能对比分析

    原文网址:http://www.trinea.cn/android/arraylist-linkedlist-loop-performance/ 主要介绍ArrayList和LinkedList这两种 ...

  8. Java 集合 ArrayList和LinkedList的几种循环遍历方式及性能对比分析 [ 转载 ]

    Java 集合 ArrayList和LinkedList的几种循环遍历方式及性能对比分析 @author Trinea 原文链接:http://www.trinea.cn/android/arrayl ...

  9. 自己实现ArrayList与LinkedList类

    ArrayList与LinkedList的底层实现 ArrayList内部由数组实现,LinkedList内部由链表实现. 自己动手实现ArrayList与LinkedList中一些常用方法 Arra ...

随机推荐

  1. 3DES加解密类

    using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace GT.C ...

  2. 数据库之MySQL-基本知识(与Oracle简单对比)

    一.什么是数据库 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 我们也可以将数据存储在文件 ...

  3. List集合的三个实现类比较

    1. ArrayList 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 2. Vector 底层数据结构是数组,查询快,增删慢 线程安全,效率低 3. LinkedList 底层数据结构是链 ...

  4. maven项目创建2

    添加依赖索引 但是默认是没有索引的,要手动创建索引 依赖范围 debug  配置 运行常见问题 处理办法,JDK重新安装 网络添加依赖网站

  5. openwrt boot 启动出现的问题

    一.boot启动出现JFFS2挂载文件系统错误 问题排查: 1.固件问题. 2.刷机,写进去不完整. 3.flash有问题. 二.openwrt 进入web页面出错 解决方法: 1.SSH进去,先恢复 ...

  6. sublime text 3插件---File Header配置

    今天趁着有点闲工夫,准备好好配置一下sublime环境,毕竟天天见面. 首当其冲的就是FileHeader插件了,安装它之后就懒得配置过.(方便起见,以下简称FH) FH是一个为文件自动添加前缀字段的 ...

  7. jmxtrans + OpenTSDB + granafa 监控套件使用手册

    需求说明 编写背景 此手册的基础在于对<jmxtrans + influxdb + granafa 监控套件使用手册>的熟悉和使用.本手册仅介绍以下几项: OpenTSDB 的配置安装 对 ...

  8. windows 安装使用 Memcached

    Windows无官方版本:下载地址http://static.runoob.com/download/memcached-win64-1.4.4-14.zip 安装: 1.解压下载的压缩包2.命令行模 ...

  9. C++入门经典-例3.14-使用while循环计算从1到10的累加

    1:代码如下: // 3.14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> usin ...

  10. spring的AOP——采用注解完成AOP

    AOP的两种配置方式:XML配置和Aspectj注解方式. 一.项目的目录: 二.文件配置 我们采用的是JDK代理,所以首先将接口和实现类代码附上: public interface UserMana ...