JDK源码阅读

ArrayList的具体实现

ArrayList是List接口的具体实现,是在实际生产环境中用的非常多的一种工具类

数据结构

  1. 顾名思义,从ArrayList的名字中我们就可以看出,ArrayList是基于数组的一种实现.
private transient Object[] elementData; //对象存储
private int size; //实际含有对象的大小  size <= elementData.length

主要代码实现

构造函数

    // 构造函数比较简单, 初始化对象数组就可以了
    public ArrayList(int initialCapacity) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
    }

add

    //将对象添加到数组的末尾即可
    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  //对List进行扩容
        elementData[size++] = e;
        return true;
    }
    //在index位置添加新的数据, >=index的则全部后移一位
    public void add(int index, E element) {
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  // 扩容
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index); // 后移
        elementData[index] = element;
        size++;
    }

    //扩容实现
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1); // 计算扩容后的数组大小 JDK > 1.7的算法, 与1.7以前的算法不同
        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);
    }

set

    //替换index的原有数据
    public E set(int index, E element) {
        rangeCheck(index);

        E oldValue = elementData(index);
        elementData[index] = element;
        return oldValue;
    }

get

    //直接取值, 数组结构的最大优势
    E elementData(int index) {
        return (E) elementData[index];
    }

remove

    //根据index remove
    public E remove(int index) {
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }
    //根据Object  remove
    public boolean remove(Object o) {
        if (o == null) {
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) {
                    fastRemove(index);
                    return true;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    fastRemove(index);
                    return true;
                }
        }
        return false;
    }

其余函数基本与这几个类似

迭代器, TODO:暂时还没看太明白,改天继续分析

时间: 2024-11-03 21:46:01

JDK源码阅读的相关文章

JDK 源码 阅读 - 2 - 设计模式 - 创建型模式

A.创建型模式 抽象工厂(Abstract Factory) javax.xml.parsers.DocumentBuilderFactory DocumentBuilderFactory通过FactoryFinder实例化具体的Factory. 使用例子: DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilder

jdk源码阅读笔记之java集合框架(二)(ArrayList)

关于ArrayList的分析,会从且仅从其添加(add)与删除(remove)方法入手. ArrayList类定义: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Monaco } span.s1 { color: #931a68 } public class ArrayList<E> extends AbstractList<E> implements List<E> ArrayList基本属性: /** *

jdk源码阅读-HashMap

前置阅读: jdk源码阅读-Map : http://www.cnblogs.com/ccode/p/4645683.html 在前置阅读的文章里,已经提到HashMap是基于Hash表实现的,所以在讲解HashMap之前 ,有必要提前了解下Hash的原理. 参考<算法导论><算法>

JDK源码阅读(一):Object源码分析

最近经过某大佬的建议准备阅读一下JDK的源码来提升一下自己 所以开始写JDK源码分析的文章 阅读JDK版本为1.8 目录 Object结构图 构造器 equals 方法 getClass 方法 hashCode 方法 toString 方法 finalize 方法 registerNatives 方法 1. Object结构图 2. 类构造器 ??类构造器是创建Java对象的方法之一.一般我们都使用new关键字来进行实例,还可以在构造器中进行相应的初始化操作. ??在一个Java类中必须存在一个

JDK源码阅读(三):ArraryList源码解析

今天来看一下ArrayList的源码 目录 介绍 继承结构 属性 构造方法 add方法 remove方法 修改方法 获取元素 size()方法 isEmpty方法 clear方法 循环数组 1.介绍 一般来讲文章开始应该先介绍一下说下简介.这里就不介绍了 如果你不知道ArrayList是什么的话就没必要在看了.大致讲一下一些常用的方法 2.继承结构 ArrayList源码定义: ArrayList继承结构如下: Serializable 序列化接口 Cloneable 前面我们在看Object源

jdk 源码阅读有感(一)String

闲暇之余阅读 jdk 源码. (一)核心属性 /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 String的核心结构,char型数组与 int 型 hash值. (二)构造器 构造器方面,由于上述两个值是不可更改的,所以直接 对 String

jdk源码阅读笔记之java集合框架(一)(基础篇)

结合<jdk源码>与<thinking in java>,对java集合框架做一些简要分析(本着实用主义,精简主义,遂只会挑出个人认为是高潮的部分). 先上一张java集合框架的简图: 会从以下几个方面来进行分析: java 数组; ArrayList,LinkedList与Vector; HashMap; HashSet 关于数组array: 数组的解释是:存储固定大小的同类型元素.由于是"固定大小",所以对于未知数目的元素存储就显得力不从心,遂有了集合.

JDK源码阅读环境搭建

内容来源 B站Up主: CodeSheep 视频: https://www.bilibili.com/video/BV1V7411U78L 感谢大佬分享学习心得 Thanks?(?ω?)?~~~ 1. 新建项目 新建JavaSourceLearn项目 新建source包存放源码 新建test包存放测试案例 2. 获取JDK源码 打开Project Structure 选择JDK版本查看安装目录 将src.zip解压到项目source包中 提示: 添加源码到项目之后首次运行需要较长时间进行编译,建

jdk源码阅读-环境配置

我们使用的系统是Ubuntu的系统,代码查看的工具用的是eclipse. 使用以下方法来搭建一个良好的代码阅读环境: 通常在windows下安装好的jdk在其src文件下即可找到对应的jdk类库的源代码.但是在Ubuntu/Linux就不同了.在我查看后发现src文件夹为空. 则可以依照以下方式,下载好openjdk的源代码 http://www.cnblogs.com/super-d2/p/3990354.html 下载好源代码后,我们在windows下可以使用记事本或者ubuntu下的ged

JDK 源码阅读 —— Java 内存模型

零. 为什么需要 Java 内存模型 为了让程序员忽略掉各种硬件和操作系统的内存访问差异, 也既无需关心不同架构上内存模型的差异, Java 在代码和硬件内存模型间又提供了一个 Java 内存模型. 一. 并发模型的分类 在并发编程中,需要处理两个关键问题:线程之间如何通信(线程之间以何种机制来交换信息, 有两种方式:共享内存和消息传递)及线程之间如何同步. 在共享内存的并发模型里(如 Java),线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态(主存)来隐式(对程序员透明)进行通