《深入剖析自定义 ArrayList 类及其功能实现》

目录

一、ArrayList 类的整体架构及代码展示

二、成员变量及其作用

1. size

2. capacity

3. arr

4. factor

三、插入操作的实现与分析

1. 普通插入(add方法)

2. 指定位置插入(insert方法)

四、删除操作的实现与分析

1. 删除第一个符合条件的数据(delFirst方法)

2. 删除所有符合条件的数据(delAll方法)

五、排序操作的实现与分析

1. 排序算法选择(sort方法)

2. 冒泡排序实现细节(sort方法)


一、ArrayList 类的整体架构及代码展示

package 数组;public class ArrayList {int size = 0; // 记录有效数据的个数int capacity = 10; // 数组容量int[] arr = new int[capacity];double factor = 1.5; // 因数 1.5// 插入public void add(int element) {if (size == capacity) {// 数组满了,扩容capacity = (int) (capacity * factor); // 强制类型转换int[] brr = new int[capacity];for (int i = 0; i < arr.length; i++) {brr[i] = arr[i];}arr = brr;}// 插入数据arr[size] = element;size++;}// 指定位置插入public void insert(int value, int position) {// 判断位置是否合理if (position > size || position < 0) {System.out.println("插入位置不合理");return;}if (size == capacity) {// 数组满了,扩容capacity = (int) (capacity * factor); // 强制类型转换int[] brr = new int[capacity];for (int i = 0; i < arr.length; i++) {brr[i] = arr[i];}arr = brr;}// 数组有空间进行插入// 插入位置及其之后的数据,从后往前的顺序统一往后移动for (int i = size - 1; i >= position; i--) {arr[i + 1] = arr[i];}// 插入arr[position] = value;size++;}// 删除第一个符合条件的数据public boolean delFirst(int value) {// 查找元素for (int j = 0; j < size; j++) {if (arr[j] == value) {// 删除,j后面的数据都要向前移动一位for (int i = j + 1; i < size; i++) {arr[i - 1] = arr[i];}size--;return true;}}return false;}// 删除所有符合条件的数据// 从后往前删,可以删干净public boolean delAll(int value) {boolean hasDeleted = false;for (int k = size - 1; k >= 0; k--) {if (arr[k] = = value) {for (int m = k + 1; m < size; m++) {arr[m - 1] = arr[m];}size--;hasDeleted = true;}}return hasDeleted;}// 将数组排序 冒泡排序public void sort() {for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - i - 1; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}public String toString() {String res = "[";for (int i = 0; i < size; i++) {if (i == size - 1) {res += arr[i];} else {res += arr[i] + ", ";}}res += "]";return res;}
}

在上述代码中,我们定义了ArrayList类并将其放置在package 数组;这个包下。下面详细介绍一下类中的各个部分。

二、成员变量及其作用

1. size

size变量用于精确记录数组中有效数据的个数。这一变量在整个类的操作逻辑中起着至关重要的作用,它使得我们在进行各种数组操作时,能够清晰地知晓当前实际存储了多少有意义的数据,从而避免对未使用的数组空间进行不必要的处理。

2. capacity

capacity代表数组的初始容量,这里我们将其设定为10。它界定了数组在不进行扩容操作时能够容纳元素的数量上限。当数组中的有效数据数量达到这个上限时,就需要进行扩容处理,以满足继续添加数据的需求。

3. arr

arr是一个整型数组,它是我们实际存储数据的载体。其大小由capacity决定,在数组初始化时就被创建出来,后续所有的数据插入、删除以及排序等操作都是围绕这个数组展开的。

4. factor

factor被定义为一个因数,具体取值为1.5。它主要应用于数组扩容操作,当数组满了需要扩容时,通过将当前容量乘以这个因数来计算出新的容量大小,从而为数组开辟出更多的存储空间。

三、插入操作的实现与分析

1. 普通插入(add方法)

add方法实现了向数组末尾添加一个新元素的功能。当我们调用add方法并传入一个元素时,它首先会检查数组是否已满,也就是判断size是否等于capacity。一旦发现数组已满,就会触发扩容机制。扩容过程如下:

  • 首先,通过capacity = (int) (capacity * factor);计算出新的容量,这里需要进行强制类型转换,因为capacity * factor的结果可能是一个小数,而数组容量必须是整数。
  • 接着,创建一个新的更大的数组brr,其大小为新计算出的容量。
  • 然后,通过循环将原数组arr中的数据依次复制到新数组brr中,即for (int i = 0; i < arr.length; i++) { brr[i] = arr[i]; }
  • 最后,将arr指向新数组,完成扩容操作。

在完成扩容后,就可以将新元素插入到数组末尾,通过arr[size] = element;实现,然后将size的值增加1,以反映数组中有效数据的增加。

2. 指定位置插入(insert方法)

insert方法允许我们在指定位置插入一个元素。在调用这个方法时,需要传入要插入的元素值value和插入位置position。首先会对插入位置进行合理性检查,如果position大于size或者小于0,就会输出提示信息并直接返回,因为这样的插入位置是不合理的。

若数组已满,同样会触发扩容操作,其扩容逻辑与add方法中的扩容逻辑一致。当确定数组有空间进行插入并且插入位置合理后,会将插入位置及其之后的数据从后往前依次往后移动一位,为新元素腾出空间。具体实现是通过循环for (int i = size - 1; i >= position; i--) { arr[i + 1] = arr[i]; }完成的。

完成数据移动后,就可以将新元素插入到指定位置,通过arr[position] = value;实现,最后将size的值增加1

四、删除操作的实现与分析

1. 删除第一个符合条件的数据(delFirst方法)

delFirst方法的作用是删除数组中第一个与传入值value相等的元素。它通过遍历数组,从第一个元素开始(索引为0)到第size个元素(不包括),查找是否存在与value相等的元素。一旦找到匹配的元素,就会将该元素后面的数据都向前移动一位,即将索引为i + 1i为找到匹配元素的索引)的元素赋值给索引为i的位置,具体通过循环for (int i = j + 1; i < size; i++) { arr[i - 1] = arr[i]; }实现。然后size的值减1,表示数组中有效数据减少了一个。如果遍历完整个数组都没有找到匹配的元素,就会返回false

2. 删除所有符合条件的数据(delAll方法)

delAll方法用于删除数组中所有与某个值相等的元素。它从数组的末尾开始,即从索引为size - 1的元素开始,向前遍历到第一个元素(索引为0)。每当找到一个与value相等的元素,就会将该元素后面的数据向前移动一位,然后size的值减1。在这个过程中,会通过一个布尔变量hasDeleted来记录是否至少删除了一个元素,最后返回这个布尔变量的值,以告知调用者是否有元素被删除。具体实现时,通过循环for (int k = size - 1; k >= 0; k--) { if (arr[k] == value) { for (int m = k + 1; k < size; m++) { arr[m - 1] = k < size && arr[m]; } size--; hasDeleted = true; } }完成操作。

五、排序操作的实现与分析

1. 排序算法选择(sort方法)

为了让数组中的数据能够按照一定的顺序排列,我们在sort方法中采用了经典的冒泡排序算法。冒泡排序的基本思想是通过多次比较相邻的元素,如果它们的顺序不符合排序要求(在我们这里是升序,即前面的元素大于后面的元素时),就交换它们的位置。

2. 冒泡排序实现细节(sort方法)

sort方法中,我们使用了两层嵌套的循环。外层循环控制排序的轮数,总共需要进行size - 1轮排序,因为经过size - 1轮后,数组中的最小元素自然就会处于数组的开头位置。内层循环用于在每一轮排序中比较相邻的元素,从第一个元素开始(索引为 0)到第size - i - 1个元素(i为当前排序轮数)。当发现相邻元素满足arr[j] > arr[j + 1]的条件时(即前面的元素大于后面的元素),就通过一个临时变量temp来交换它们的位置,使得较大的元素逐渐 “可泡” 到数组的末尾,经过多轮循环后,数组就会被排序成升序状态。具体实现如下:

  • 外层循环:for (int i = 0; i < size - 1; i++) { }
  • 内层循环:for (int j = 0; j < size - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } }

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 文件系统权限

文件的一般权限 文件详细信息 使用命令 ll 或 ls -l 查看 文件权限构成 权限针对三类对象定义 owner &#xff1a;所有者&#xff0c;缩写 u group &#xff1a;所属组&#xff0c;缩写 g other &#xff1a;其他人&#xff0c;缩写 o 访问者三种权限 组成模式分析 …

C++上机实验|多态性编程练习

1.实验目的 (1)理解多态性的概念。 (2)掌握如何用虚函数实现动态联编 (3)掌握如何利用虚基类。 2.实验内容 设计一个飞机类 plane,由它派生出歼击机类fighter和轰炸机类 bomber,歼击机类fighter 和轰炸机类bomber 又共同派生出歼轰机(多用途战斗机)。利用虚函数和虚基类描述…

学习threejs,使用对象组合

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Object3D 三维物体 二…

遇到的问题

刚遇到的问题&#xff1a; 一直以为这个图片数据结构是以下这种&#xff1a; {"descrlong1": [{"CL04": "人力违纪"},{"CL05": "其他"}], }其实数据结构是&#xff1a; {"descrlong1": [{"key": &quo…

发现8个高风险漏洞 NVIDIA GeForce用户必须更新GPU驱动程序

所有NVIDIA GeForce图形处理器都面临着高风险&#xff0c;因为该公司在其图形处理器驱动程序中发现了几个漏洞&#xff0c;这些漏洞可能会让黑客利用你的系统。公司敦促用户更新到最新的GeForce显示屏和VGPU驱动程序&#xff0c;以确保他们的系统不受任何漏洞的影响。 NVIDIA在…

Redis 中 Bitmap 原理和应用

Bitmap Redis中的Bitmap&#xff08;位图&#xff09;是一种较为特殊数据类型&#xff0c;它以最小单位bit来存储数据&#xff0c;我们知道一个字节由 8个 bit 组成&#xff0c;和传统数据结构用字节存储相比&#xff0c;这使得它在处理大量二值状态&#xff08;true、false 或…

微信小程序开发,诗词鉴赏app

文章目录 1. 项目功能思维导图2. 项目涉及到的技术点3. 开发环境4. 项目运行效果5. 部分功能实现6. 关于本人其它项目的介绍 1. 项目功能思维导图 2. 项目涉及到的技术点 使用MySQL数据库实现数据存储使用setInterval实现启动页3s倒计时使用storage实现数据持久化存储&#xf…

什么是阿里云上的主机安全服务?

在数字化时代&#xff0c;数据安全和网络安全成为了企业最关心的问题之一。随着越来越多的企业将业务迁移至云端&#xff0c;如何确保云环境的安全性&#xff0c;成为了企业必须面对的重要挑战。阿里云安全中心&#xff08;SAS&#xff09;作为一款全面的云安全解决方案&#x…

在K8s平台部署个人博客

在K8s平台部署个人博客 实验步骤查看wordpress前端的service配置word press 实验步骤 kubectl create secret generic mysql-pass --from-literalpasswordYOUR_PASSWORD把mysql.tar.gz和wordpress.tar.gz上传到K8s工作节点&#xff0c;手动解压即可&#xff1a; 通过网盘分享的…

【原创】java+ssm+mysql收纳培训网系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

Java | Leetcode Java题解之第523题连续的子数组和

题目&#xff1a; 题解&#xff1a; class Solution {public boolean checkSubarraySum(int[] nums, int k) {int m nums.length;if (m < 2) {return false;}Map<Integer, Integer> map new HashMap<Integer, Integer>();map.put(0, -1);int remainder 0;fo…

【时间之外】IT人求职和创业应知【27】

目录 新闻一物理智能公司完成4亿美元融资 新闻二A股IPO和再融资受理、审核回暖 新闻三AI流量变现财富峰会举办 认知和思考决定了你的赚钱能力。以下是今天可能引起你思考的热点新闻&#xff1a; 今日关键字&#xff1a;没吃过猪肉&#xff0c;还没见过猪跑吗&#xff1f; 新…

【前端开发入门】JavaScript快速入门--函数技巧

目录 引言一、函数基本注意事项1. 函数定义2. 默认参数3. 函数返回值及闭包3.1 举个函数返回值的简单例子3.2 当我需要利用函数内部变量做一些运算时&#xff0c;就需要使用js的闭包 二、函数注释1. 单行注释2. 多行注释3. 进阶玩法 三、总结 引言 本系列教程旨在帮助一些零基础…

权威认证!蓝卓获评IDC数字工厂领导者

日前&#xff0c;全球领先的IT市场研究和咨询公司IDC公布了《IDC MarketScape: 中国数字工厂整体解决方案厂商评估&#xff0c;2024》。其中&#xff0c;蓝卓成功入选IDC中国数字工厂整体解决方案厂商&#xff0c;位列领导者象限。 数字工厂整体解决方案领导者 《IDC MarketSc…

$tab的所有用法以及vue关闭页面的方法汇总

1、最简单粗暴的就是直接window.close(); 2.可以设置一个窗口的显示隐藏变量&#xff0c;比如点击新增按钮时&#xff0c;新增页面窗口就进行显示&#xff0c;点击关闭就把这个值置为flase 在最外层绑定open 初始值设为false 点击新增和修改按钮时&#xff0c;把状态置为true即…

全同态加密基于多项式环计算的图解

全同态加密方案提供了一种惊人的能力 —— 能够在不知道数据具体内容的情况下对数据进行计算。这使得你可以在保持潜在敏感源数据私密的同时&#xff0c;得出问题的答案。 这篇文章的整体结构包括多项式环相关的数学介绍&#xff0c;基于多项式环的加密和解密是如何工作的&…

10天进阶webpack---(2)webpack模块兼容性处理

回顾CMJ和ESM的区别 CMJ的本质可以使用一个函数概括 // require函数的伪代码 function require(path){if(该模块有缓存吗){return 缓存结果;}function _run(exports, require, module, __filename, __dirname){// 模块代码会放到这里}var module {exports: {}}_run.call(mod…

【STM32】NVIC / EXTI / AFIO 介绍

文章目录 中断系统NVIC简介NVIC基本结构NVIC优先级分组EXTI外部中断EXIT基本结构AFIO复用IO口EXTI内部框图 AFIO / EXTI / NVIC 相关函数AFIO相关函数EXTI相关函数NVIC相关函数 旋转编码器简介对射式红外传感器计次接线图CountSensor&#xff08;传感器&#xff09;驱动程序封装…

【Linux内核大揭秘】程序地址空间

文章目录 什么是程序地址空间地址空间的组成虚拟内存技术 如何理解程序地址空间页表页表的细节关于堆区 在Linux中如何查看各个分段的信息总结 什么是程序地址空间 程序地址空间是一个程序在执行期间可以访问的内存范围。它由操作系统为每个进程分配&#xff0c;以确保进程之间…

nginx代理出现的请求头中获取不到acc_token问题

1.问题 程序开发完成之后&#xff0c;发现页面登录之后&#xff0c;获取不到用户信息。发现时没有获取到token信息。本地程序开发完成&#xff0c;后端服务成功署到服务器。通过云服务器开放对应的端口&#xff0c;使用本地的前端服务&#xff0c;直接连接服务器后端服务&…