【Java基础】Java8集合[ArrayList 之 属性](底层原理+源码分析)

简介: 学习Java8集合[ArrayList 之 属性](底层原理+源码分析)。

前言


Java集合类可以用于存储多个对象,还可以保存具有映射关系(Key-Value)的关联数组。


可以说Java集合就像是一个容器,可以动态地把多个对象引入到容器当中。


而在这篇文章中,我们将讲解集合中ArrayList实现类的属性:

集合主要分为Collection接口 与 Map接口两类,而ArrayList就是Collection接口的子接口:List接口的一个实现类…


一、ArrayList概述


我们可以看一下,ArrayList实现类源码中的第一段注释:


Resizable-array implementation of the List interface. Implements all

optional list operations, and permits all elements, including null. In

addition to implementing the List interface, this class provides

methods to manipulate the size of the array that is used internally to

store the list. (This class is roughly equivalent to Vector, except

that it is unsynchronized.)


注释大义:

ArrayList 是一个动态的数组,实现了所有的可选操作(也就是实现了List接口以及相关的所有方法),它允许所有元素插入,其中包括null。

除了实现了List接口,该类还提供了一些方法用于操作内部存储数组的大小。(这个类大致相当于Vector,不同的是ArrayList线程不同步,而Vector是线程同步的)


源码已经告诉我们,ArrayList集合的底层,就是动态的数组,可以存储包括null在内的所有元素…


二、ArrayList属性


1.序列号 serialVersionUID


serialVersionUID代表序列版本号,用来表明类的不同版本间的兼容性。


属性源码:

private static final long serialVersionUID = 8683452581122892189L;


2.默认容量 DEFAULT_CAPACITY


ArrayList集合的默认容量为10…


属性源码:

/**
     * Default initial capacity.
     */
    private static final int DEFAULT_CAPACITY = 10;


3.空数组常量 EMPTY_ELEMENTDATA


属性源码:

/**
     * Shared empty array instance used for empty instances.
     */
    private static final Object[] EMPTY_ELEMENTDATA = {};

4.默认空数组常量


用于默认大小的空实例。将默认空数组常量DEFAULTCAPACITY_EMPTY_ELEMENTDATA与空数组常量EMPTY_ELEMENTDATA区分开来,我们就可以知道数组是在扩容到什么时候,第一个元素被添加进来的。


空数组列表elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA


属性源码:

/**
     * Shared empty array instance used for default sized empty instances. We
     * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
     * first element is added.
     */
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

5.存储数组 elementData


通过对下列源码的理解,我们可以知道的是:ArrayList集合的底层实现,使用的是一个Object类型的数组…


这个属性应该是ArrayList实现类中最重要的属性了,该实现类的方法,基本是建立在存储数据的elementData数组上的。


属性源码:

/**
     * The array buffer into which the elements of the ArrayList are stored.
     * The capacity of the ArrayList is the length of this array buffer. Any
     * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
     * will be expanded to DEFAULT_CAPACITY when the first element is added.
     */
    transient Object[] elementData; // non-private to simplify nested class access


6.数组长度 size


属性源码:

/**
     * The size of the ArrayList (the number of elements it contains).
     *
     * @serial
     */
    private int size;


7.容量上限 MAX_ARRAY_SIZE


MAX_ARRAY_SIZE代表的是数组的最大上限,数组的长度必须<=MAX_ARRAY_SIZE


属性源码:

/**
     * The maximum size of array to allocate.
     * Some VMs reserve some header words in an array.
     * Attempts to allocate larger arrays may result in
     * OutOfMemoryError: Requested array size exceeds VM limit
     */
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;


目录
相关文章
|
11月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
261 7
|
12月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
462 100
|
12月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
439 101
|
12月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
342 4
|
存储 Java
【Java 虚拟机原理】线程栈 | 栈帧 | 局部变量表 | 反汇编字节码文件 | Java 虚拟机指令手册 | 程序计数器
【Java 虚拟机原理】线程栈 | 栈帧 | 局部变量表 | 反汇编字节码文件 | Java 虚拟机指令手册 | 程序计数器
309 0
【Java 虚拟机原理】线程栈 | 栈帧 | 局部变量表 | 反汇编字节码文件 | Java 虚拟机指令手册 | 程序计数器
|
11月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
510 1
|
11月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
452 1
|
12月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
481 0
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
662 16