Java_ArrayList顺序表详解

目录

前言

顺序表

​编辑

顺序表和数组

ArrayList简介

说明

ArrayList使用​编辑

ArrayList常见操作

 ArrayList实现二维数组

ArrayList的遍历

 ArrayList的扩容机制

 总结


前言

一个高端的程序员,往往都是数据结构学的很好,判断一个程序的优劣也是看数据结构学的好与坏.

顺序表,数据结构中最简单的部分之一,让我们一起学习吧~~~

顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

顺序表和数组

顺序表的底层就是用数组来实现的.我们会有这样的疑问,顺序表和数组很像,而且它还是用数组实现的,那么顺序表存在的意义又是什么呢?

我们可以这样理解: 我们运用数组创造出了一个常用的数据结构,然后以后每次使用的时候,我们不必再用数组实现,而是直接调用它(就像库函数一样)

更简单的理解: 数组就像是单个电脑主机  而顺序表就像是外设齐全的电脑(键盘,鼠标,显示屏等等)

ArrayList简介

在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:

说明

只作为了解即可,平常我们会用就行

1. ArrayList是以泛型方式实现的,使用时必须要先实例化
2. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
3. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
4. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
5. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList
6. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表
 

ArrayList使用

public static void main(String[] args) {// ArrayList创建,推荐写法// 构造一个空的列表List<Integer> list1 = new ArrayList<>();// 构造一个具有10个容量的列表List<Integer> list2 = new ArrayList<>(10);list2.add(1);list2.add(2);list2.add(3);// list2.add("hello"); // 编译失败,List<Integer>已经限定了,list2中只能存储整形元素// list3构造好之后,与list中的元素一致ArrayList<Integer> list3 = new ArrayList<>(list2);// 避免省略类型,否则:任意类型的元素都可以存放,使用时将是一场灾难List list4 = new ArrayList();list4.add("111");list4.add(100);
}

ArrayList常见操作

 ArrayList实现二维数组

ArrayList<ArrayList<Integer>> test = new ArrayList<>();

ArrayList的遍历

ArrayList 可以使用三方方式遍历:for循环+下标、foreach、使用迭代器

public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用下标+for遍历for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i) + " ");} System.out.println();// 借助foreach遍历for (Integer integer : list) {System.out.print(integer + " ");} System.out.println();//list的迭代器Iterator<Integer> it = list.listIterator();while(it.hasNext()){System.out.print(it.next() + " ");} System.out.println();
}

 ArrayList的扩容机制

顺序表是用数组来实现的,那么我们会好奇:

如果不给容量参数的话,会不会报错?

答:不会,会有默认的容量

如果容量满了,我们再添加元素,程序会扩容还是会报错>

答:ArrayList是一个动态类型的顺序表,即在插入元素的过程中会自动扩容

下面ArrayList源码扩容的方法(只看有注释的部分即可,其他可以了解)

Object[] elementData; // 存放元素的空间
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; // 默认空间
private static final int DEFAULT_CAPACITY = 10; // 默认容量大小
public boolean add(E e) {ensureCapacityInternal(size + 1); // Increments modCount!!elementData[size++] = e;return true;
}
private void ensureCapacityInternal(int minCapacity) {ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private static int calculateCapacity(Object[] elementData, int minCapacity) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {return Math.max(DEFAULT_CAPACITY, minCapacity);} return minCapacity;
}
private void ensureExplicitCapacity(int minCapacity) {modCount++;// overflow-conscious codeif (minCapacity - elementData.length > 0)grow(minCapacity);
}
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private void grow(int minCapacity) {// 获取旧空间大小int oldCapacity = elementData.length;// 预计按照1.5倍方式扩容int newCapacity = oldCapacity + (oldCapacity >> 1);// 如果用户需要扩容大小 超过 原空间1.5倍,按照用户所需大小扩容if (newCapacity - minCapacity < 0)newCapacity = minCapacity;// 如果需要扩容大小超过MAX_ARRAY_SIZE,重新计算容量大小if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// 调用copyOf扩容elementData = Arrays.copyOf(elementData, newCapacity);
}
private static int hugeCapacity(int minCapacity) {// 如果minCapacity小于0,抛出OutOfMemoryError异常if (minCapacity < 0)throw new OutOfMemoryError();return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
}

 总结

1. 检测是否真正需要扩容,如果是调用grow准备扩容
2. 预估需要库容的大小初步

                (1)预估按照1.5倍大小扩容

                (2)如果用户所需大小超过预估1.5倍大小,则按照用户所需大小扩容

                (3)真正扩容之前检测是否能扩容成功,防止太大导致扩容失败


3. 使用copyOf进行扩容

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

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

相关文章

原生video设置控制面板controls显示哪些控件

之前我们学习了如何使用原生video播放视频 今天来一个进阶版的——设置控制面板controls显示哪些控件 先看一下当我们使用原生video时&#xff0c;controls属性为true时&#xff0c;相关代码如下&#xff1a; 正常的控制面板默认显示的控件有&#xff1a;播放、时间线、音量调…

CloudStack中的VPC(Virtual Private Cloud)

CloudStack中的VPC&#xff08;Virtual Private Cloud&#xff0c;虚拟私有云&#xff09;是一种网络隔离和管理机制&#xff0c;允许用户在云环境中创建独立的虚拟网络环境。VPC提供了逻辑上隔离的网络空间&#xff0c;可用于创建虚拟机、子网、路由器和防火墙等网络资源&…

【ffmpeg】视频常用操作合集

1.转码264 ffmpeg -i [原视频.mp4] -vcodec h264 [输出视频.mp4]2.视频流yuv数据抽取帧 ffmpeg -f rawvideo -s:v [尺寸] -i "[视频源]" -f image2 -q 2 -r [帧数] [文件夹及文件名]尺寸 &#xff1a; 例如 &#xff1a;640x360 视频源&#xff1a;例如&#xff1a…

Android基础: 使用Java代码控制 Activity类页面相互之间进行跳转 Activity页面的的启动和结束

Android基础&#xff08;Activity&#xff09; Activity的启动和结束 我们主要看Java代码逻辑&#xff1a; 第一个页面的逻辑代码 public class StartActivity01 extends AppCompatActivity implements View.OnClickListener {Overrideprotected void onCreate(Bundle saved…

JS中的 回调函数(callback)

1.什么是回调函数&#xff08;callback&#xff09;呢&#xff1f; 把函数当作一个参数传到另外一个函数中&#xff0c;当需要用这个函数是&#xff0c;再回调运行()这个函数. 回调函数是一段可执行的代码段&#xff0c;它作为一个参数传递给其他的代码&#xff0c;其作用是在…

香港云服务器计算型和通用型的区别

在当今数字化时代&#xff0c;云服务器作为企业级应用的核心设备&#xff0c;其性能和类型对于企业的运营和数据处理至关重要。在常见的香港云服务器类型中&#xff0c;通用型和计算型是最为常见的两种。那么&#xff0c;这两种云服务器到底有什么区别呢? 设计目标和应用场景不…

HarmonyOS开发基础(一)

HarmonyOS开发基础&#xff08;一&#xff09; // &#xff1a;装饰器&#xff1a;用来装饰类结构、方法、变量 Entry // Entry&#xff1a;标记当前组件为入口组件 Component // Component&#xff1a;标记为自定义组件 // struct&#xff1a;自定义组件&#xff0c;可复用的…

【LeetCode】692. 前K个高频单词

692. 前K个高频单词 描述示例解题思路及事项思路一思路二 描述 给定一个单词列表 words 和一个整数 k &#xff0c;返回前 k 个出现次数最多的单词。 返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率&#xff0c; 按字典顺序 排序 示例 示例1 输…

电力校准平台

介绍 明确电力校准溯源平台的需求,包括设备管理、校准流程、数据存储、数据分析、安全保障、用户管理、系统管理和报告生成等方面的需求。通过清晰定义需求,为后续系统开发提供准确依据,确保系统的顺利实施和稳定运行。 设备管理 2.1 设备信息管理 平台应具备设备信息管理功…

Python实现FA萤火虫优化算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

15.Servlet [一篇通]

文章目录 1.Servlet 是什么2.第一个 Servlet 程序2.1创建项目2.2引入依赖2.3创建目录2.4编写代码2.5打包程序2.6部署程序2.7验证程序 3.更方便的部署方式3.1安装 Smart Tomcat 插件3.2配置 Smart Tomcat 插件 4.访问出错怎么办?4.1出现 4044.2出现 4054.3出现 5004.4出现 &quo…

移动端APP测试方法

1 APP测试基本流程 1.1 测试周期 测试周期可按项目的开发周期来确定测试时间&#xff0c;一般测试时间为两三周&#xff08;即15个工作日&#xff09;&#xff0c;根据项目情况以及版本质量可适当缩短或延长测试时间。正式测试前先向主管确认项目排期。 1.2 测试资源 测试任…

冬天来了,波司登的高端化“春天”不远了?

最近&#xff0c;羽绒服频繁“贵”上热搜。 在众多热搜词条中&#xff0c;一条“国产羽绒服卖到7000元”的话题一度将波司登推上了舆论的风口浪尖。 对此&#xff0c;波司登在最新的业绩说明会上进行了回应&#xff0c;公司表示&#xff1a;“波司登旗下主品牌及子品牌将形成差…

mysql原理--InnoDB记录结构

1.InnoDB行格式 我们平时是以记录为单位来向表中插入数据的&#xff0c;这些记录在磁盘上的存放方式也被称为 行格式 或者 记录格式 。 设计 InnoDB 存储引擎的大叔们到现在为止设计了4种不同类型的 行格式 &#xff0c;分别是 Compact 、 Redundant 、Dynamic 和 Compressed 行…

Linux 5.15安全特性之ARM64 PAC

ARM64 PAC&#xff08;Pointer Authentication Code&#xff09;机制是ARM架构中引入的一种安全特性&#xff0c;旨在提供指针的完整性和安全性保护。它通过在指针中插入一段额外的代码进行签名&#xff0c;以验证指针的完整性&#xff0c;从而抵御缓冲区溢出和代码注入等攻击。…

抖音直播间购物小黄车的商品详情数据SKU接口轻松拿下

我们都知道&#xff0c;抖音直播购物车的商品链接只能是抖音小店的&#xff0c;如果没有开通抖音小店&#xff0c;还能添加小店链接吗&#xff1f; 也是可以的。 抖音直播小黄车的链接可以是自己的小店商品&#xff0c;也可以是别人的小店商品。 抖音直播上链接有两种方式&a…

在Redis中设置一个键值对并为其指定过期时间

在Redis中设置一个键值对并为其指定过期时间&#xff0c;可以使用 SET 命令结合 EXPIRE 命令来实现&#xff0c;或者直接使用 SETEX 命令。 以下是使用 SET 和 EXPIRE 命令的例子&#xff1a; SET mykey somevalue EXPIRE mykey 30上面的命令首先使用 SET 命令创建了一个名为…

大数据技术发展

▶1.大数据时代 美国互联网数据中心指出&#xff0c;互联网上的数据每年增长50%,每两年翻一番&#xff0c;目前世界上90%以上的数据是最近几年才产生的。此外&#xff0c;这些数据并非单纯是人们在互联网上发布的信息&#xff0c;85%的数据由传感器和计算机设备自动生成。全世…

centos7防火墙开启端口

1.查看防火墙状态 firewall-cmd --state如果返回的not running&#xff0c;那么需要先开启防火墙 2.开启关闭防火墙 systemctl start firewalld.service systemctl stop firewalld.service systemctl restart firewalld.service3.开放指定端口 firewall-cmd --zonepublic -…

MYSQL8用户权限配置详解

单位的系统性能问题需要把Mysql5升级到Mysql8&#xff0c;需要用到Mysql8的一些特性来提升系统的性能。 配置用户权限过程中发现一些问题&#xff0c;学习并记录一下。 目录 一、环境 二、MySQL8 用户权限 2.1 账号管理权限 2.1.1 连接数据库 2.1.2 账号权限配置 2.2 密码…