JAVA集合类之ArrayList源码分析

ArrayList继承自AbstractList抽象类,实现了List接口。

 public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

ArrayList类中存储数据用的是Object类型的数组

private transient Object[] elementData;

此处的elementData使用了transient关键字进行了修饰。被transient关键字修饰的变量在对象序列化时是不操作的。那ArrayList对象在序列化时,elementData数组是否真的就不处理呢?我们来看writeObject函数:

s.defaultWriteObject();
// Write out array length
s.writeInt(elementData.length);
// Write out all elements in the proper order.
for (int i=0; i<size; i++)
            s.writeObject(elementData[i]);

其实elementData是人为的进行序列化了。

实例化ArrayList对象时,默认数组的大小为10.

public ArrayList() {
 this(10);
}

ArrayList元素数组在扩大时,扩大的算法是:(目前大小)*3/2+1

int newCapacity = (oldCapacity * 3)/2 + 1;

add(E e) 函数:

ensureCapacity(size + 1);  // Increments modCount!!
elementData[size++] = e;

先扩容数组,然后在数组尾部追加新元素。

add(int index, E element)函数:

ensureCapacity(size+1);  // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
    size - index);
elementData[index] = element;
 size++;

同样也是先扩容数组,接着调用System.arraycopy将数组元素进行调整,然后在指定位置index处,插入新元素。

由此可以得出,向ArrayList中添加元素时,尽量使用add函数,这样效率高。

读取元素直接根据下标从elementData中获取

RangeCheck(index);
return (E) elementData[index];

总结:

ArrayList一个基于数组的线性表,同时它不是线程安全的。读取元素效率高,写入元素效率偏低。

因此ArrayList不适用于频繁做插入和删除操作。

时间: 2024-10-15 21:54:06

JAVA集合类之ArrayList源码分析的相关文章

Java集合之ArrayList源码分析

1.简介 List在数据结构中表现为是线性表的方式,其元素以线性方式存储,集合中允许存放重复的对象,List接口主要的实现类有ArrayList和LinkedList.Java中分别提供了这两种结构的实现,这一篇文章是要熟悉下ArrayList的源码实现.使用示例如下: package com.test.collections; import java.util.ArrayList; public class ArrayListTest { /** * @param args */ public

Java集合(3)--ArrayList源码分析

默认初始容量为10,底层用的是对象数组实现的. public void ensureCapacity(int minCapacity).确保数组最小容量,用于添加元素的时候. 它的父类AbstractList只有一个抽象方法abstract public E get(int index); modCount:记录list结构被改变的次数,其实是改变大小时会自增,主要是add和remove,set并不会使modCount自增. 会影响modCount的操作:add,remove.ensureCap

Java - ArrayList源码分析

java提高篇(二一)-----ArrayList 一.ArrayList概述 ArrayList是实现List接口的动态数组,所谓动态就是它的大小是可变的.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小. 每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小.默认初始容量为10.随着ArrayList中元素的增加,它的容量也会不断的自动增长.在每次添加新的元素时,Array

Java集合系列之ArrayList源码分析

一.ArrayList简介 ArrayList是可以动态增长和缩减的索引序列,它是基于数组实现的List类. 该类封装了一个动态再分配的Object[]数组,每一个类对象都有一个capacity属性,表示它们所封装的Object[]数组的长度,当向ArrayList中添加元素时,该属性值会自动增加.如果想ArrayList中添加大量元素,可使用ensureCapacity方法一次性增加capacity,可以减少增加重分配的次数提高性能. ArrayList的用法和Vector向类似,但是Vect

Java笔记---ArrayList源码分析

一.前言 一直就想看看java的源码,学习一下大牛的编程.这次下狠心花了几个晚上的时间,终于仔细分析了下 ArrayList 的源码(PS:谁说的一个晚上可以看完的?太瞎扯了).现在记录一下所得. 二.ArrayList 源码分析 2.1 如何分析? 想要分析下源码是件好事,但是如何去进行分析呢?以我的例子来说,我进行源码分析的过程如下几步: 找到类:利用 Eclipse 找到所需要分析的类(此处就是 ArrayList) 新建类:新建一个类,命名为 ArrayList,将源码拷贝到该类.因为我

集合类学习之Arraylist 源码分析

1.概述 ArrayList是List接口的可变数组的实现.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小. 每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小.它总是至少等于列表的大小(如果不指定capacity,默认是10).    /**      * Constructs an empty list with an initial capacity of ten.

Java ArrayList源码分析(有助于理解数据结构)

arraylist源码分析 1.数组介绍 数组是数据结构中很基本的结构,很多编程语言都内置数组,类似于数据结构中的线性表 在java中当创建数组时会在内存中划分出一块连续的内存,然后当有数据进入的时候会将数据按顺序的存储在这块连续的内存中.当需要读取数组中的数据时,需要提供数组中的索引,然后数组根据索引将内 存中的数据取出来,返回给读取程序.在Java中并不是所有的数据都能存储到数组中,只有相同类型的数据才可以一起存储到数组中.    因为数组在存储数据时是按顺序存储的,存储数据的内存也是连续的

Java集合类库 ArrayList 源码解析

集合类库是Java的一个重大突破,方便了我们对大数据的操作.其中 Arrays 和 Collections 工具类可以帮助我们快速操作集合类库.下面对Java集合类库的源码分析是基于jdk1.7的.今天我们来看看ArrayList的底层实现原理. ArrayList的继承结构图 继承自 AbstractList 抽象类,在上层是 AbstractCollection 抽象类,直接去 AbstractCollection 类去看看. AbstractCollection 类主要实现了 Collec

死磕 java集合之CopyOnWriteArraySet源码分析——内含巧妙设计

问题 (1)CopyOnWriteArraySet是用Map实现的吗? (2)CopyOnWriteArraySet是有序的吗? (3)CopyOnWriteArraySet是并发安全的吗? (4)CopyOnWriteArraySet以何种方式保证元素不重复? (5)如何比较两个Set中的元素是否完全一致? 简介 CopyOnWriteArraySet底层是使用CopyOnWriteArrayList存储元素的,所以它并不是使用Map来存储元素的. 但是,我们知道CopyOnWriteArra