如何自定义ArrayList:深入理解Java ArrayList的底层原理

ArrayList是Java集合框架中的一个重要类,它实现了一个可变大小的数组。尽管ArrayList的使用非常简单,但理解其底层实现对优化和调试代码有着重要意义。本文将通过编写一个自定义的ArrayList,帮助你深入理解ArrayList的底层原理。

什么是ArrayList?

ArrayList是Java集合框架中的一个类,它提供了动态数组的功能。与传统的数组不同,ArrayList可以在运行时动态调整其大小。ArrayList继承自AbstractList,并实现了List接口。

ArrayList的底层实现原理

底层数据结构

ArrayList底层是基于一个动态扩展的数组来实现的。当添加元素时,如果数组已满,ArrayList会创建一个新的、更大的数组,并将旧数组中的元素复制到新数组中。

自动扩展

ArrayList的扩展机制是其核心之一。默认情况下,当ArrayList的容量不足以容纳新元素时,它会将当前容量扩大1.5倍(即扩大50%)。这种扩展机制可以有效减少数组复制操作的次数,提高性能。

访问和修改

ArrayList通过索引访问和修改元素的时间复杂度为O(1),这是因为它底层是一个数组,可以直接通过索引定位元素。

自定义ArrayList的实现

以下是一个自定义ArrayList的示例代码,帮助你理解其底层原理。

自定义ArrayList类

import java.util.Arrays;public class CustomArrayList<E> {private static final int DEFAULT_CAPACITY = 10;private int size = 0;private Object[] elements;public CustomArrayList() {elements = new Object[DEFAULT_CAPACITY];}// 添加元素public void add(E e) {if (size == elements.length) {ensureCapacity();}elements[size++] = e;}// 获取元素@SuppressWarnings("unchecked")public E get(int index) {if (index >= size || index < 0) {throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);}return (E) elements[index];}// 确保容量private void ensureCapacity() {int newSize = elements.length * 3 / 2 + 1;elements = Arrays.copyOf(elements, newSize);}// 获取大小public int size() {return size;}// 删除元素public E remove(int index) {if (index >= size || index < 0) {throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);}@SuppressWarnings("unchecked")E oldValue = (E) elements[index];int numMoved = size - index - 1;if (numMoved > 0) {System.arraycopy(elements, index + 1, elements, index, numMoved);}elements[--size] = null; // clear to let GC do its workreturn oldValue;}
}

测试自定义ArrayList

public class CustomArrayListTest {public static void main(String[] args) {CustomArrayList<String> list = new CustomArrayList<>();list.add("Apple");list.add("Banana");list.add("Orange");System.out.println("Element at index 1: " + list.get(1));System.out.println("Size of list: " + list.size());list.remove(1);System.out.println("Element at index 1 after removal: " + list.get(1));System.out.println("Size of list after removal: " + list.size());}
}

详细讲解自定义ArrayList的各个部分

构造函数

构造函数初始化了一个默认容量为10的数组。

public CustomArrayList() {elements = new Object[DEFAULT_CAPACITY];
}

添加元素

添加元素时,首先检查数组是否已满,如果已满,则调用ensureCapacity()方法扩展数组。

public void add(E e) {if (size == elements.length) {ensureCapacity();}elements[size++] = e;
}

获取元素

通过索引获取元素,并进行边界检查。

@SuppressWarnings("unchecked")
public E get(int index) {if (index >= size || index < 0) {throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);}return (E) elements[index];
}

确保容量

扩展数组容量,新的容量为当前容量的1.5倍。

private void ensureCapacity() {int newSize = elements.length * 3 / 2 + 1;elements = Arrays.copyOf(elements, newSize);
}

删除元素

删除元素时,通过System.arraycopy方法将后续元素向前移动一位,并将最后一个元素置为null以便垃圾回收。

public E remove(int index) {if (index >= size || index < 0) {throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);}@SuppressWarnings("unchecked")E oldValue = (E) elements[index];int numMoved = size - index - 1;if (numMoved > 0) {System.arraycopy(elements, index + 1, elements, index, numMoved);}elements[--size] = null; // clear to let GC do its workreturn oldValue;
}

总结

通过自定义ArrayList,我们深入理解了ArrayList的底层实现原理,包括其动态扩展机制、元素访问与修改操作以及删除元素的处理方式。理解这些底层原理,有助于我们在使用ArrayList时更加高效和合理。

希望本文对你理解Java ArrayList的底层原理有所帮助。如果你喜欢这篇文章,请点赞并分享,关注我们的博客以获取更多关于Java编程和软件开发的精彩内容!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/29929.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正则表达式常用表示

视频教程&#xff1a;10分钟快速掌握正则表达式 正则表达式在线测试工具&#xff08;亲测好用&#xff09;&#xff1a;测试工具 正则表达式常用表示 限定符 a*&#xff1a;a出现0次或多次a&#xff1a;a出现1次或多次a?&#xff1a;a出现0次或1次a{6}&#xff1a;a出现6次a…

网络安全:探索云安全的最佳实践

文章目录 网络安全&#xff1a;探索云安全的最佳实践引言云安全简介云安全面临的挑战云安全的最佳实践数据加密身份和访问管理定期安全审计 结语 网络安全&#xff1a;探索云安全的最佳实践 引言 在我们之前的文章中&#xff0c;我们讨论了网络安全的多个方面&#xff0c;包括…

2021数学建模A题目–“FAST”主动反射面的形状调节

A 题——“FAST”主动反射面的形状调节 思路&#xff1a;该题主要是通过利用伸缩杆调整FAST反射面&#xff0c;给出合适的调整方案 程序获取 第一题问题思路与结果&#xff1a; 当待观测天体S位于基准球面正上方&#xff0c;结合考虑反射面板调节因素&#xff0c;确定理想抛物…

颜色分类 - LeetCode 热题 98

大家好&#xff01;我是曾续缘&#x1f498; 今天是《LeetCode 热题 100》系列 发车第 98 天 技巧第 3 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地对它们进行排序&#xff0…

等保2.0中,如何理解和实施安全管理中心的支持作用?

等保2.0&#xff0c;即《信息安全技术 网络安全等级保护基本要求》的第二版&#xff0c;是中国关于网络安全保护的一项重要标准。它强调了一个中心和三重防护的概念&#xff0c;其中的“一个中心”指的就是安全管理中心&#xff08;Security Management Center,简称SMC&#xf…

标题:高考后的抉择:专业优先还是学校优先?

标题&#xff1a;高考后的抉择&#xff1a;专业优先还是学校优先&#xff1f; 随着2024年高考的落幕&#xff0c;考生们面临着一个重要的抉择&#xff1a;在分数限制的条件下&#xff0c;是选择一个心仪的专业&#xff0c;还是选择一个知名度更高的学校&#xff1f;这个问题没…

代理四川公司疑难商标办理商标异议复审办理

申请商标注册或者办理其他商标事宜&#xff0c;可以自行办理&#xff0c;也可以委托依法设立的商标代理机构办理。外国人或者外国企业在中国申请商标注册和办理其他商标事宜的&#xff0c;应当委托依法设立的商标代理机构办理&#xff0c;按照被代理人的委托办理商标注册申请或…

【串口通信-USART】

串口通信 前言一、串行通信和并行通信二、波特率三、USRAT如何实现USART 四、通信的时候共地五、奇偶校验位总结 前言 大三上时候的笔记⇨32入门-串口通信-发送和接收数据&#x1f31f;更加偏向32部分的吧。 大三上左右的时候写过串口通信的笔记&#xff0c;那时候虽然青涩啥也…

广告~~~

大家还记不记得我在之前提到的姜乙&#xff0c;现在&#xff0c;我们的误会解除了&#xff0c;他也是很有实力的&#xff0c;我为他宣传一下&#xff0c;CSDN名&#xff1a;Cpp_King&#xff0c;就他Cpp_King-CSDN博客

物联网协议应用

目录 前言一、WIFI简介二、NTP协议2.1 NTP简介2.2 NTP实现 三、HTTP协议3.1 HTTP协议简介3.2 HTTP服务器 四、MQTT协议4.1 MQTT协议简介4.1.1 MQTT通信模型4.1.2 MQTT协议实现原理4.1.3 MQTT 控制报文 4.2 移植MQTT协议 前言 本文主要介绍一下物联网协议如NTP协议、HTTP协议和M…

Go Gin框架

一、Gin介绍 Gin是一个用Go编写的HTTPweb框架。它是一个类似于martini但拥有更好性能的API框架, 优于httprouter&#xff0c;速度提高了近 40 倍。点击此处访问Gin官方中文文档。 二、安装 1、安装Gin go get -u github.com/gin-gonic/gin 2、代码中引入 import "githu…

数字OT训练系统常见问题解析

随着科技的飞速发展&#xff0c;数字化技术已经深入到医疗康复领域&#xff0c;数字OT&#xff08;Occupational Therapy&#xff0c;职业疗法&#xff09;训练系统作为一种创新性的康复工具&#xff0c;为康复患者提供了更加精准、个性化的治疗方案。然而&#xff0c;在使用过…

整数转换00

题目链接 整数转换 题目描述 注意点 A&#xff0c;B范围在[-2147483648, 2147483647]之间 解答思路 比较A、B每一个数位是否相同&#xff0c;如果不同则res 1比较每一位的方法是&#xff1a;将数字右移i位&#xff0c;再将其与1进行’&操作&#xff0c;就可以得到数字…

《逆贫大叔》:一部穿越时光的温情史诗

《逆贫大叔》&#xff1a;一部穿越时光的温情史诗 在历史的长河中&#xff0c;有些故事能够穿越时光的尘埃&#xff0c;直击人心。《逆贫大叔》就是这样一部作品&#xff0c;它不仅是一部电视剧&#xff0c;更是一段历史的缩影&#xff0c;一次心灵的触动。 背景设定&#xff1…

HTML静态网页成品作业(HTML+CSS)——企业摄影网介绍网页(3个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有3个页面。 二、作品演示 三、代…

VOCO原理

A Simple-yet-Effective Volume Contrastive Learning Framework for 3D Medical Image Analysis 一个简单而有效的三维医学图像分析体积对比学习框架 是通过自监督学习搭建的学习框架 自监督学习是无监督学习下的一个分支&#xff1b; 它通过从未标注的数据中生成伪标签来进…

金融科技在资产管理领域的创新实践

一、引言 随着科技的飞速发展&#xff0c;金融科技&#xff08;FinTech&#xff09;逐渐渗透到金融行业的各个领域&#xff0c;资产管理作为金融行业的核心之一&#xff0c;也迎来了金融科技带来的深刻变革。金融科技不仅改变了资产管理的传统模式&#xff0c;也极大地提高了资…

iOS ------ 对象的本质

一&#xff0c;OC对象本质&#xff0c;用clang编译main.m OC对象结构都是通过基础的C/C结构体实现的&#xff0c;我们通过创建OC文件及对象&#xff0c;将OC对象转化为C文件来探寻OC对象的本质。 代码&#xff1a; interface HTPerson : NSObject property(nonatomic,strong)…

MySQL全解(基础)-(MySQL的安装与配置,数据库基础操作(CRUD,聚合,约束,联合查询),索引,事务)

MySQL安装与配置 1.数据库介绍 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以下几个缺点&#xff1a; 文件的安全性问题 文件不利于数据查询和管理 文件不利于存储海量数据 文件在程序中控制不方便数据库存储介质&#xff1a; 磁盘 内存 为了…

Python酷库之旅-比翼双飞情侣库(15)

目录 一、xlrd库的由来 二、xlrd库优缺点 1、优点 1-1、支持多种Excel文件格式 1-2、高效性 1-3、开源性 1-4、简单易用 1-5、良好的兼容性 2、缺点 2-1、对.xlsx格式支持有限 2-2、功能相对单一 2-3、更新和维护频率低 2-4、依赖外部资源 三、xlrd库的版本说明 …