add

  1. public boolean add(E e) {
  2. //先确保数组容量
  3. ensureCapacityInternal(size + 1);
  4. //直接将值放在size位置
  5. elementData[size++] = e;
  6. return true;
  7. }
  8. private void ensureCapacityInternal(int minCapacity) {
  9. //如果刚开始为空,并且 容量小于默认容量,则初始化 默认容量 (10)
  10. if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
  11. minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
  12. }
  13. //校验是否需要扩容
  14. ensureExplicitCapacity(minCapacity);
  15. }
  16. private void ensureExplicitCapacity(int minCapacity) {
  17. //一定要修改modCount
  18. modCount++;
  19. // 当容量大于当前元素条数,需要扩容
  20. if (minCapacity - elementData.length > 0)
  21. grow(minCapacity);
  22. }
  23. private void grow(int minCapacity) {
  24. // 旧容量
  25. int oldCapacity = elementData.length;
  26. //新容量 = 旧容量 + 旧容量 * 2;
  27. int newCapacity = oldCapacity + (oldCapacity >> 1);
  28. //如果新容量还是小于需要的容量大小,则采用传入的minCapacity
  29. if (newCapacity - minCapacity < 0)
  30. newCapacity = minCapacity;
  31. //如果minCapacity太大,还需要修正
  32. if (newCapacity - MAX_ARRAY_SIZE > 0)
  33. newCapacity = hugeCapacity(minCapacity);
  34. // minCapacity is usually close to size, so this is a win:
  35. //最后使用Arrays.copyOf 方法扩容
  36. elementData = Arrays.copyOf(elementData, newCapacity);
  37. }
  38. private static int hugeCapacity(int minCapacity) {
  39. if (minCapacity < 0) // overflow
  40. throw new OutOfMemoryError();
  41. //使用 Integer.MAX_VALUE
  42. return (minCapacity > MAX_ARRAY_SIZE) ?
  43. Integer.MAX_VALUE :
  44. MAX_ARRAY_SIZE;
  45. }

remove

  1. public E remove(int index) {
  2. rangeCheck(index);
  3. modCount++;
  4. //先获取该索引位置的值
  5. E oldValue = elementData(index);
  6. //找到需要复制的元素个数 a b c d e f (如果要删除 d,索引是3 6 - 3 -1 = 2)
  7. int numMoved = size - index - 1;
  8. //将后边的元素拷贝到被删除的索引的位置
  9. if (numMoved > 0)
  10. System.arraycopy(elementData, index+1, elementData, index,
  11. numMoved);
  12. //最后一位置为 null
  13. elementData[--size] = null; // clear to let GC do its work
  14. return oldValue;
  15. }

get

  1. E elementData(int index) {
  2. return (E) elementData[index];
  3. }

[源码分析]ArrayList的更多相关文章

  1. 【JDK】JDK源码分析-ArrayList

    概述 ArrayList 是 List 接口的一个实现类,也是 Java 中最常用的容器实现类之一,可以把它理解为「可变数组」. 我们知道,Java 中的数组初始化时需要指定长度,而且指定后不能改变. ...

  2. [源码分析]ArrayList和LinkedList如何实现的?我看你还有机会!

    文章已经收录在 Github.com/niumoo/JavaNotes ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教. 欢迎关注我的公众号,文章每周更新. 前言 说真的,在 Jav ...

  3. JDK源码分析 – ArrayList

    ArrayList类的申明 ArrayList是一个支持泛型的,底层通过数组实现的一个可以存任意类型的数据结构,源码中的定义如下: public class ArrayList<E> ex ...

  4. 源码分析--ArrayList(JDK1.8)

    ArrayList是开发常用的有序集合,底层为动态数组实现.可以插入null,并允许重复. 下面是源码中一些比较重要属性: 1.ArrayList默认大小10. /** * Default initi ...

  5. JDK源码分析-ArrayList

    ArrayList 储存结构 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; transient Objec ...

  6. ArrayList 和 LinkedList 源码分析

    List 表示的就是线性表,是具有相同特性的数据元素的有限序列.它主要有两种存储结构,顺序存储和链式存储,分别对应着 ArrayList 和 LinkedList 的实现,接下来以 jdk7 代码为例 ...

  7. Java - ArrayList源码分析

    java提高篇(二一)-----ArrayList 一.ArrayList概述 ArrayList是实现List接口的动态数组,所谓动态就是它的大小是可变的.实现了所有可选列表操作,并允许包括 nul ...

  8. ArrayList相关方法介绍及源码分析

    目录 ArrayList简介: ArrayList 相关方法介绍 代码表示 相关方法源码分析 ArrayList简介: java.util.ArrayList 是我们最常用的一个类,ArrayList ...

  9. ArrayList、LinkedList和Vector源码分析

    ArrayList.LinkedList和Vector源码分析 ArrayList ArrayList是一个底层使用数组来存储对象,但不是线程安全的集合类 ArrayList的类结构关系 public ...

随机推荐

  1. PL/SQL Developer 如何记住密码

    前言:使用时总结一下. 问题: 登录的时候不想每次都输入密码,能记住最好了. 解决方案: 1.点击配置->首选项 2.选择登录历史,勾上带口令存储,然后应用,确定即可.

  2. 【代码笔记】iOS-iOS的目录

    一.iOS中的沙盒机制 · iOS应用程序只能对自己创建的文件系统读取文件,这个独立.封闭.安全的空间,叫做沙盒.它一般存放着程序包文件(可执行文件).图片.音频.视频.plist文件.sqlite数 ...

  3. hallo world

  4. css固定广告栏

    <div style="position: fixed; left: 50%; top: 100px; margin-left: -621px;"> <div&g ...

  5. Android获取SD卡路径及SDCard内存的方法

    这篇文章主要介绍了Android获取SD卡路径及SDCard内存的方法,较为详细的分析了Android针对SD卡操作所涉及的类及其具体函数功能,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了A ...

  6. android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配

    1 Android手机目前常见的分辨率 1.1 手机常见分辨率: 4:3VGA     640*480 (Video Graphics Array)QVGA  320*240 (Quarter VGA ...

  7. 树莓派发射FM波——搭建私人小电台

    树莓派的应用十分广泛,有很多奇思妙想的应用非常有趣,在这里我们想实现一个小电台的功能,但是在这里需要说明,私人架设电台是违法行为,所以本案只作为自我娱乐所用,不能发射大功率的信号干扰正常的FM频段. ...

  8. pycharm 调试Django 奇葩问题:Process finished with exit code -1073741819

    想自己整个BLOG,发现python+Django好像还不错,尝试一下.在使用过程中,突然pycharm不能调试django工程.网上搜索也没解决,是google哦.好像记得启动pycharm时,看到 ...

  9. JVM知识(五):垃圾回收算法

    在介绍垃圾回收算法之前,我们需要先了解一个词“stop the world”,stop the world会在执行某一个垃圾回收算法的时候产生,JVM为了执行垃圾回收,会暂时java应用程序的执行,等 ...

  10. 3.如何在Maven项目中引入自己的jar包

    1.一般情况下jar包都可以使用pom.xml来配置管理,但也有一些时候,我们项目中使用了一个内部jar文件,但是这个文件我们又没有开放到maven库中. 我们会将文件放到我们项目中.(以下以java ...