当前位置:首页 > Java资讯 > 正文内容

Java ArrayList 源码深度剖析:揭秘数组扩容与遍历机制

admin2个月前 (06-23)Java资讯11

Java ArrayList 源码深度剖析:揭秘数组扩容与遍历机制

正文内容:

在Java编程语言中,ArrayList是使用非常广泛的一个集合类,它实现了List接口,底层使用数组来存储元素。ArrayList具有很好的性能和灵活性,是Java集合框架中的基础类之一。本文将从ArrayList的源码出发,深入剖析其实现原理,包括数组扩容和遍历机制等细节。

一、ArrayList概述

ArrayList在Java中属于泛型集合,可以存储任意类型的对象。它的构造方法有多个,可以根据实际需求创建不同容量的ArrayList。下面是ArrayList的基本属性:

1. 元素存储:使用Object类型的数组存储元素,默认初始容量为10。

2. 容量:ArrayList的实际容量,即数组长度。

3. 元素数量:ArrayList中存储的元素个数。

4. 扩容机制:当数组容量不足时,会进行扩容操作。

5. 遍历机制:支持迭代器遍历,也可以使用for循环进行遍历。

二、ArrayList源码解析

1. 构造方法

```java

public ArrayList() {

this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;

}

public ArrayList(int initialCapacity) {

if (initialCapacity > 0) {

this.elementData = new Object[initialCapacity];

} else if (initialCapacity == 0) {

this.elementData = EMPTY_ELEMENTDATA;

} else {

throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);

}

}

public ArrayList(int initialCapacity, int loadFactor) {

if (initialCapacity <= 0 || loadFactor <= 0 || loadFactor > 1) {

throw new IllegalArgumentException("Illegal arguments");

}

this.loadFactor = loadFactor;

this.elementData = new Object[initialCapacity];

}

```

ArrayList提供了三个构造方法,分别用于创建不同初始容量的ArrayList。

2. 扩容机制

当向ArrayList添加元素时,如果数组容量不足,会进行扩容操作。扩容操作的具体步骤如下:

```java

private void grow(int minCapacity) {

int oldCapacity = elementData.length;

int newCapacity = oldCapacity + (oldCapacity >> 1); // 加上原容量的1/2

if (newCapacity - minCapacity < 0)

newCapacity = minCapacity;

if (newCapacity - MAX_ARRAY_SIZE > 0)

newCapacity = hugeCapacity(minCapacity);

elementData = Arrays.copyOf(elementData, newCapacity);

}

private static int hugeCapacity(int minCapacity) {

if (minCapacity < 0) // overflow

throw new OutOfMemoryError();

return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;

}

```

首先,判断数组容量是否满足需求。如果不满足,将原容量乘以1.5,然后与minCapacity进行比较。如果仍不满足,则取minCapacity与MAX_ARRAY_SIZE中较小的值作为新容量。最后,使用Arrays.copyOf方法将原数组复制到新数组中。

3. 遍历机制

ArrayList支持两种遍历方式:迭代器遍历和for循环遍历。

迭代器遍历:

```java

Iterator iterator() {

return new Itr();

}

private class Itr implements Iterator {

int cursor; // 游标

int lastRet = -1; // 上次返回的元素索引

Itr() {}

public boolean hasNext() {

return cursor != size;

}

@SuppressWarnings("unchecked")

public E next() {

checkForComodification();

int i = cursor;

if (i >= size)

throw new NoSuchElementException();

Object[] elementData = ArrayList.this.elementData;

if (i >= elementData.length)

throw new ConcurrentModificationException();

cursor = i + 1;

return (E) elementData[lastRet = i];

}

public void remove() {

checkForComodification();

int lastRet = this.lastRet;

if (lastRet == -1)

throw new IllegalStateException();

try {

ArrayList.this.remove(lastRet);

cursor = lastRet;

lastRet = -1;

} catch (IndexOutOfBoundsException ex) {

throw new ConcurrentModificationException();

}

}

final void checkForComodification() {

if (modCount != expectedModCount)

throw new ConcurrentModificationException();

}

}

```

for循环遍历:

```java

for (int i = 0; i < size; i++) {

// ...

}

```

总结

通过对ArrayList源码的剖析,我们可以了解到ArrayList在内存存储、扩容和遍历方面的实现细节。了解这些细节有助于我们更好地利用ArrayList,提高程序性能。在实际开发过程中,合理运用ArrayList的特性,可以有效提高代码质量。

相关文章

Java开发中的索引优化:揭秘数据库性能提升的秘密武器

Java开发中的索引优化:揭秘数据库性能提升的秘密武器

在Java开发领域,数据库是应用系统不可或缺的一部分。而数据库的性能优化,是每一个Java开发者都需要面对的问题。其中,索引优化作为数据库性能提升的关键因素,常常被忽视。本文将深入剖析Java开发中...

Java新版本迁移:挑战与机遇并存,实战经验分享

Java新版本迁移:挑战与机遇并存,实战经验分享

随着技术的不断发展,Java语言也在不断更新迭代。每一次新版本的发布,都意味着新的特性和改进。然而,对于企业来说,迁移到新版本并非易事。本文将深入分析Java新版本迁移的挑战与机遇,并结合实战经验,...

GitHub开源:技术交流与创新加速的助推器

GitHub开源:技术交流与创新加速的助推器

近年来,随着互联网技术的飞速发展,开源文化在软件行业中扮演着越来越重要的角色。GitHub作为全球最大的开源社区之一,已经成为无数开发者和企业技术交流、创新的重要平台。本文将从个人开发者、企业应用和...

Java版本升级之路:从入门到精通的深度解析

Java版本升级之路:从入门到精通的深度解析

一、Java版本简介 Java作为一种历史悠久、应用广泛的编程语言,已经陪伴了无数开发者和企业走过多年的历程。从Java 1.0到Java 18,Java版本不断更新,带来了无数的技术创新和改进。那...

Java行业深度解析:流程引擎在项目开发中的应用与实践

Java行业深度解析:流程引擎在项目开发中的应用与实践

一、引言 随着互联网技术的飞速发展,企业对于业务流程的优化和自动化需求日益增长。在这个过程中,流程引擎作为一种强大的技术手段,逐渐成为了Java行业的热门话题。本文将从实际项目开发的角度,深入分析流...

《虚拟现实技术:重塑Java行业未来,打造沉浸式体验新篇章》

《虚拟现实技术:重塑Java行业未来,打造沉浸式体验新篇章》

随着科技的飞速发展,虚拟现实(Virtual Reality,简称VR)技术逐渐成为热门话题。作为Java行业的一员,我深知这一技术对于我们的行业意味着什么。本文将深入分析虚拟现实技术在Java行业...