Java顺序表(2)

news2025/4/8 21:42:01

🐵本篇文章将对ArrayList类进行讲解



一、ArrayList类介绍

上篇文章我们对顺序表的增删查改等方法进行了模拟实现,实际上Java提供了ArrayList类,而在这个类中就包含了顺序表的一系列方法,这样在用顺序表解决问题时就不用每次都去实现它的方法了

再ArrayList类中有下面几个字段:

上述字段会在下面的解释中进行讲解

二、ArrayList的构造方法

ArrayList的构造方法一共有三种

2.1 第一种构造方法

上述代码中,先定义了数组EMPTY_ELEMENTDATA,该数组为空,之后又定义了数组elementData,接下来红色框部分的就是构造方法,该方法有一个参数initialCapacity(即顺序表的初始容量),当initialCapacity > 0时,为elementData分配了长度为initialCapacity大小的空间,当initialCapacity = 0时,将elementData赋值为EMPTY_ELEMENTDATA,也就是此时elementData为空数组,即顺序表现在为空,若initialCapacity为负数,则抛出异常

总结:该构造方法就是给顺序表分配空间的

ArrayList<Integer> arrayList = new ArrayList<>(5); //此时顺序表的长度为5
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);

2.2 第二种构造方法

可以看到此时elementData为一个空数组,那么看下面的代码

ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);

构造方法并没有给顺序表分配空间,为什么此代码编译运行都没有问题?下面通过源码进行解释,首先不带参的构造方法确实没有给顺序表分配空间,那么没有报错的原因只可能是在add方法上

add方法中调用了ensureCapacityInternal方法:

在该方法中调用了ensureExplicitCapacity方法,其参数为calculateCapacity方法的返回值,该方法的参数分别为elementData数组和minCapacity先看calculateCapacity方法:

上述代码中的DEFAULT_CAPACITY是默认容量:10,minCapacity为1,所以这里将10作为该方法的返回值并作为ensureExplicitCapacity的参数,再去看ensureExplicitCapacity方法:

接下来看grow方法:

总结:

1.对于空的顺序表,第一个add方法会进行扩容,将顺序表的扩容为默认容量10

2.add方法的扩容是按照1.5倍扩容的

2.3 第三种构造方法

该构造方法的参数部分:

Collection<? extends E>为类型,c是变量

Collection是一个接口,ArrayList类实现了这个接口,所以这里的变量c可以是ArrayList类型,尖括号中?是通配符,继承了E类,意思就是尖括号中的泛型必须是E类型或E的子类型

三、ArrayList的一些方法

ArrayList类提供的方法大部分和上篇文章中模拟实现的方法一致,这里讲解一些没有模拟实现的方法:

1. boolean addAll(Collection<? extends E> c)

该方法为将一个顺序表的所有元素尾插到另一个顺序表:

public static void main(String[] args) {
    ArrayList<Integer> arrayList = new ArrayList<>();
    arrayList.add(1);
    arrayList.add(2);
    ArrayList<Integer> list = new ArrayList<>();
    list.add(3);
    list.addAll(arrayList);
    System.out.println(list); //结果为 [3, 1, 2]
}

2. E remove(int index)

删除index位置的元素:

    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.remove(0);
        System.out.println(arrayList); //结果为 [2]
    }

3. List<E> subList(int fromIndex, int toIndex)

左闭右开的区间截取顺序表中从fromIndextoIndex的元素,注意:这里的截取并不是指向一个新的对象,它依然指向原来的对象

    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);

        List<Integer> list = arrayList.subList(0, 2);//list依然指向原来的对象
        System.out.println(list); //结果为 [1, 2]

        list.set(0, 100);
        System.out.println(list); //[100, 2]
        System.out.println(arrayList); //[100, 1, 2]
    }

四、ArrayList的遍历

先创建一个顺序表:

ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);

4.1 for循环

for (int i = 0; i < arrayList.size(); i++) {
    System.out.print(arrayList.get(i) +" ");
}

4.2 for-each循环

for(Integer x : arrayList) { //:左边为顺序表中元素的类型+变量
    System.out.print(x +" ");
}

4.3 迭代器

1.Iterator接口中iterator()方法

Iterator<Integer> it = arrayList.iterator();
while(it.hasNext()) { 
    System.out.print(it.next() +" ");
    //判断是否有下一个元素,如果有则打印下一个元素,并将it指向下一个元素
}

2.ListIterator接口中listIterator()方法

ListIterator接口继承了Iterator接口,也可以作为迭代器遍历ArrayList

ListIterator<Integer> it1 = arrayList.listIterator();
while(it1.hasNext()) {
    System.out.print(it1.next() +" ");
}

3.利用迭代器从后往前打印

ListIterator<Integer> it2 = arrayList.listIterator(arrayList.size());
                                                    //这里要将顺序表的长度作为参数传过去
while(it2.hasPrevious()) {
    System.out.print(it2.previous() +" ");
    //判断是否有前一个元素,如果有则打印前一个元素,并将it指向前一个元素
}

🙉本篇文章到此结束,下篇文章会对链表相关知识进行讲解

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

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

相关文章

smartgit选择30天试用后需要输入可执行文件

突然有一天smartgit提示到期了&#xff0c;我按照以往那样删除license和preferences文件后&#xff0c;选择30天试用&#xff0c;弹出了需要选择git可执行文件。 我尝试选择了我的git.exe&#xff0c;发现根本不行&#xff0c;提示让我执行下git --version 执行过后提示我的.gi…

【Shell编程练习】编写 shell 脚本,打印 9*9 乘法表

系列文章目录 输出Hello World 通过位置变量创建 Linux 系统账户及密码 监控内存和磁盘容量&#xff0c;小于给定值时报警 猜大小 输入三个数并进行升序排序 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态 系列文章目录编写 shell 脚本,打…

Vue3响应式系统(二)

Vue3响应式系统(一)https://blog.csdn.net/qq_55806761/article/details/135587077 六、嵌套的effect与effect栈。 什么场景会用到effect嵌套呢&#xff1f;听我娓娓道来。 就用Vue.js来说吧&#xff0c;Vue.js的渲染函数就是在effect中执行的&#xff1a; /*Foo组件*/ const…

动态路由协议

一、动态路由协议 动态路由协议&#xff0c;用在多个 Router 之间定期的、自动的、互相交换 Routes&#xff08;路由信息&#xff0c;包含了网段信息、可达性信息、路径信息等&#xff09;&#xff0c;动态生成 Routing Table Entries&#xff0c;并最终达到全网的路由收敛&am…

Java项目:123SSM高校运动会信息管理系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 高校运动会信息管理系统基于SpringSpringMVCMybatis开发&#xff0c;主要用来管理高校运动会信息&#xff0c;系统分为管理员何运动员两种角色。系统主要功…

AI在广告中的应用——预测性定位和调整

营销人员的工作就是在恰当的时间将适合的产品呈现在消费者面前&#xff0c;从而增加他们购买的可能性。随着时间的推移&#xff0c;营销人员能够深入挖掘越来越精准的客户细分市场&#xff0c;他们不仅具备了实现上述目标的能力&#xff0c;而且这种能力还在呈指数级提升。在AI…

如何将github copilot当gpt4用

现在写代码已经离不开ai辅助了我用的是github copilot&#xff0c;一方面是因为它和vscode结合得比较好&#xff0c;另一方面就是copilot chat了。可以在不切换工具的情况下&#xff0c;问它问题&#xff0c;在copilot chat还在内测阶段的时候我就申请使用了&#xff08;现在已…

【现代密码学】笔记9-10.3-- 公钥(非对称加密)、混合加密理论《introduction to modern cryphtography》

【现代密码学】笔记9-10.3-- 公钥&#xff08;非对称加密&#xff09;、混合加密理论《introduction to modern cryphtography》 写在最前面8.1 公钥加密理论随机预言机模型&#xff08;Random Oracle Model&#xff0c;ROM&#xff09; 写在最前面 主要在 哈工大密码学课程 张…

Python多线程爬虫——数据分析项目实现详解

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 ChatGPT体验地址 文章目录 前言爬虫获取cookie网站爬取与启动CSDN爬虫爬虫启动将爬取内容存到文件中 多线程爬虫选择要爬取的用户 线程池 爬虫 爬虫是指一种自动化程序&#xff0c;能够模…

Java基础知识整理,驼峰规则、流程控制、自增自减

写在开头 本文接着上一篇文章续写哈。Java基础知识整理&#xff0c;注释、关键字、运算符 在这一篇文章中我们总结了包括注释、关键字、运算符的Java基础知识点&#xff0c;今天继续来聊一聊命名规则&#xff08;驼峰&#xff09;、流程控制、自增自减。 一、命名规则 上一…

pygame学习(三)——支持多种类型的事件

大家好&#xff01;我是码银&#x1f970; 欢迎关注&#x1f970;&#xff1a; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 实时事件循环 为了保证程序的持续刷新、保持打开的状态&#xff0c;我们会创建一个无限循环&#xff0c;通常使用的是while语句&#xff0c;w…

第二百六十九回

文章目录 概念介绍设置方法示例代码内容总结 我们在上一章回中介绍了Card Widget相关的内容&#xff0c;本章回中将介绍国际化设置.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的国际化设置是指在App设置相关操作&#xff0c;这样可以让不同国家的…

关于VScode的这个ssh的配置的经验

1.首先&#xff0c;我是因为重装了ubantu系统&#xff0c;不得不重新配置ssh 2.第一步&#xff0c;在本机的终端安装ssh插件&#xff1a; &#xff08;1&#xff09; &#xff08;2&#xff09;restart开启这个ssh端口 3.然后&#xff0c;就在vscode里面&#xff0c;安装哪个…

【Rust学习】安装Rust环境

本笔记为了记录学习Rust过程&#xff0c;内容如有错误请大佬指教 使用IDE&#xff1a;vs code 参考教程&#xff1a;菜鸟教程链接: 菜鸟教程链接: Rust学习 Rust入门安装Rust编译环境Rust 编译工具 构建Rust 工程目录 Rust入门 安装Rust编译环境 因为我已经安装过VSCode了&am…

【ArcGIS遇上Python】ArcGIS Python批量筛选多个shp中指定字段值的图斑(以土地利用数据为例)

文章目录 一、案例分析二、提取效果二、代码运行效果三、Python代码四、数据及代码下载一、案例分析 以土地利用数据为例,提取多个shp数据中的旱地。 二、提取效果 原始土地利用数据: 属性表: 提取的旱地:(以图层名称+地类名称命名)

mysql — 生产环境发布DDL之避坑操作onlineDDL

一、Mysql onLineDDL特性 1、Mysql 5.6 DDL MySQL 的 DDL(Data Definition Language) 包括增减字段、增减索引等操作。MySQL Online DDL 功能从 5.6 版本开始正式引入&#xff0c;发展到现在的 8.0 版本&#xff0c;那么在 MySQL 5.6 之前&#xff0c;MySQL 的 DDL 操作会按照…

Vue高级(二)

3.搭建vuex环境 创建文件&#xff1a;src/store/index.js //引入Vue核心库import Vue from vue//引入Vueximport Vuex from vuex//应用Vuex插件Vue.use(Vuex)//准备actions对象——响应组件中用户的动作const actions {}//准备mutations对象——修改state中的数据const mutat…

近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;C从基础到进阶 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于C的优质内容&#xff01;&#x1f3c6;&#x1f3c6; C核心编程&#x1f30f;1 内存分区模型&#x1f384…

mac查看maven版本报错:The JAVA_HOME environment variable is not defined correctly

终端输入mvn -version报错: The JAVA_HOME environment variable is not defined correctly, this environment variable is needed to run this program. Java环境变量的问题,打开bash_profile查看 open ~/.bash_profile export JAVA_8_HOME/Library/Java/JavaVirtualMachine…

HCIA——12题目-1章选择

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…