1、首先来看一下ArrayList类中的字段

可以看出,ArrayList维护了一个Object数组,默认容量是10,size记录数组的长度;

2、ArrayList提供了三个构造器:ArrayList(int initialCapacity),ArrayList(),ArrayList(Collection<? extends E> c)

带int参数的构造是指定ArrayList的大小,无参的构造函数,Object[]初始化为一个空数组,重点来讨论接受一个Colection参数的构造器,先看看源码

传入的Collection对象得到一个数组,赋值给elementData,然后再判断是否是Object[]类型,如果不是,则在copyOf方法里面生成一个Object[]数组,

返回并且赋值给elementData;Arrays.copyOf方法有多个重载方法,但是底层都是统一的调用System类中的arraycopy方法,这是一个系统的方法;

3、get(int index)、set(int index, E element)、remove(int index)方法

涉及到下标的操作,调用这三个方法,都会检查下标index是否合法,如果index>size,直接会抛出异常;

这两个方法都会调用一个公用的方法elementData(index),是根据下标index获取数组中的元素;

4、add(E e)、add(int index, E element)方法

在调用这两个方法的时候,都会调用ensureCapacityInternal(size + 1),来进行数组的扩容操作;

数组扩容分为两路:

  1、如果是调用无参的构造函数创建的ArrayList对象,那么是第一次扩容,第一次扩容的数组大小为 final int DEFAULT_CAPACITY = 10;

  2、如果ArrayList对象中数组已经存在,并且size+1超过了数组的长度,那么也需要进行数组的扩容;

  这时因为elementData数组中已经有值,扩容时,数组长度增加为扩容之前的1.5倍,把原来数组的数据复制到新的数组中去;

  这里就存在一个问题,如果频繁的去执行add操作,那么就会进行频繁的数组复制;

  如果数组有100万个元素,那么就是有大量的是、内存复制操作,对于GC的压力会比较大,同时这个操作的效率也会非常低;

  所以,必要的时候,可以指定数组的大小,使用ArrayList(int initialCapacity)构造方法去构造ArrayList对象,一定程度上能提高效率;

5、remove(Object o)这个方法可以看一下

这个方法是从ArrayList中删除一个元素,因为ArrayList里面可以存在null元素,所以在删除时,需要分开处理;

如果o为空,执行一个条件块,如果不为空执行另外一个条件块;

他们调用共用的删除方法:fastRemove(int index),这个方法在删除时,也是进行数组的复制;

ArrayList类源码浅析(一)的更多相关文章

  1. ArrayList类源码浅析(二)

    1.removeAll(Collection<?> c)和retainAll(Collection<?> c)方法 第一个是从list中删除指定的匹配的集合元素,第二个方法是用 ...

  2. ArrayList类源码浅析(三)

    1.看一个示例 运行上述代码,抛出一个异常: 这是一个典型的并发修改异常,如果把上述代码中的125行注释,把126行打开,运行就能通过了: 原因: 1)因为在迭代的时候,使用的是Itr类的对象,在调用 ...

  3. Long类源码浅析

    1.Long类和Integer相类似,都是基本类型的包装类,类中的方法大部分都是类似的: 关于Integer类的浅析可以参看:Integer类源码浅析 2.这里主要介绍一下LongCache类,该缓存 ...

  4. [原创]Android系统中常用JAVA类源码浅析之HashMap

    由于是浅析,所以我只分析常用的接口,注意是Android系统中的JAVA类,可能和JDK的源码有区别. 首先从构造函数开始, /** * Min capacity (other than zero) ...

  5. ArrayList类源码解析——ArrayList动态数组的实现细节(基于JDK8)

    一.基本概念 ArrayList是一个可以添加对象元素,并进行元素的修改查询删除等操作的容器类.ArrayList底层是由数组实现的,所以和数组一样可以根据索引对容器对象所包含的元素进行快速随机的查询 ...

  6. java.lang.Byte 类源码浅析

    Byte 类字节,属于Number. public final class Byte extends Number implements Comparable<Byte> { /** * ...

  7. LinkedList类源码浅析(一)

    1.先来看一看LinkedList类的字段和构造方法 size记录链表的长度,first永远指向链表的第一个元素,last永远指向链表的最后一个元素 提供两个构造方法,一个无参的构造方法,一个接受一个 ...

  8. Integer类源码浅析

    1.首先Integer提供了两类工具类,包括把一个int类型转成二进等, 其实执行转换算法只有一个方法: public static String toString(int i, int radix) ...

  9. LinkedList类源码浅析(二)

    1.上一节介绍了LinkedList的几个基本的方法,其他方法类似,就不一一介绍: 现在再来看一个删除的方法:remove(Object o) remove方法接受一个Object参数,这里需要对参数 ...

随机推荐

  1. 对比XGBoost与深度学习

    观点1:XGBoost要比深度学习更重要.2016年Kaggle大赛29个获奖方案中,17个用了XGBoost.因为它好用,在很多情况下都更为可靠.灵活,而且准确:在绝大多数的回归和分类问题上,XGB ...

  2. 模板 - 强连通分量 - Kosaraju

    Kosaraju算法 O(n+m) vector<int> s; void dfs1(int u) { vis[u] = true; for (int v : g[u]) if (!vis ...

  3. 阿里服务器+Centos7.4+Tomcat+JDK部署

    适用对象 本文档介绍如何使用一台基本配置的云服务器 ECS 实例部署 Java web 项目.适用于刚开始使用阿里云进行建站的个人用户. 配置要求 这里列出的软件版本仅代表写作本文档使用的版本.操作时 ...

  4. iOS 10 下 Plus 启动APP 导致Icon 铺满全屏问题

    1.解决方法,添加LacuchScreen 启动图需要手动适配 http://stackoverflow.com/questions/39571694/ipad-application-shows-a ...

  5. Linux--磁盘管理--04

    1.磁盘的工作原理: 磁道.磁头.扇区.柱面 2.磁盘分类: 机械盘: 串行:SCSI.iSCSI.SATA 并行:ATA 固态盘:HDD 3.文件系统: Windows :fat32  ntfs  ...

  6. apache 部署

    <VirtualHost *:80> ServerAdmin webmaster@dummy-host.localhost DocumentRoot "D:/EmpireServ ...

  7. python爬取百度图片

    import requests import re from urllib import parse import os from threading import Thread def downlo ...

  8. 机器学习聚类算法之DBSCAN

    一.概念 DBSCAN是一种基于密度的聚类算法,DBSCAN需要两个参数,一个是以P为中心的邻域半径:另一个是以P为中心的邻域内的最低门限点的数量,即密度. 优点: 1.不需要提前设定分类簇数量,分类 ...

  9. Linux 安装 nginx 安装PCRE库

    PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库.这些在执行正规表达式模式匹配时用与Perl 5同样的语法和语义是 ...

  10. 清北学堂提高组突破营游记day6

    还有一天就结束了..QWQ 好快啊. 昨天没讲完的博弈论DP: 一个标准的博弈论dp,一般问的是是否先手赢. 博弈论最关键的问题:dp过程. 对于一个问题,一定有很多状态,每个状态可以转移到其他的一些 ...