Java顺序表(2)

🐵本篇文章将对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指向前一个元素
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++干货铺】红黑树 (Red Black Tree)

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 前言 红黑树的概念 红黑树的性质 红黑树结点的定义 红黑树的插入操作 插入新的结点 检查规则进行改色 情况一 情况二 情况三 插入完整代码 红黑树的验…

SpringMVC参数接收见解4

# 4.参数接收Springmvc中&#xff0c;接收页面提交的数据是通过方法形参来接收&#xff1a; 处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参 springmvc接收的参数都是String类型&#xff0c;所以spirngmvc提供了很多converter&#xff08;转换…

【数据结构】归并排序的两种实现方式与计数排序

前言&#xff1a;在前面我们讲了各种常见的排序&#xff0c;今天我们就来对排序部分收个尾&#xff0c;再来对归并排序通过递归和非递归的方法进行实现&#xff0c;与对计数排序进行简单的学习。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏…

Android Matrix绘制PaintDrawable设置BitmapShader,手指触点为圆心scale放大原图,Kotlin

Android Matrix绘制PaintDrawable设置BitmapShader&#xff0c;手指触点为圆心scale放大原图&#xff0c;Kotlin 在 Android基于Matrix绘制PaintDrawable设置BitmapShader&#xff0c;以手指触点为中心显示原图的圆切图&#xff0c;Kotlin&#xff08;4&#xff09;-CSDN博客 的…

2001-2022年上市公司企业财务绩效、公司价值、并购绩效数据(ROA、ROE、TOBINQ变化)

2001-2022年上市公司企业财务绩效、公司价值、并购绩效数据&#xff08;ROA、ROE、TOBINQ变化&#xff09; 1、时间&#xff1a;2001-2022年 2、指标&#xff1a;证券代码、统计截止日期、证券简称、行业代码、行业名称、年份、、总资产净利润率B、净资产收益率(ROE)B、托宾Q…

【方法】如何压缩zip格式文件?

zip是一种常见的压缩文件格式&#xff0c;能够高效打包文件便于存储和传输&#xff0c;那zip格式的压缩文件要如何压缩呢&#xff1f; 压缩zip文件需要用到解压缩软件&#xff0c;比如常见的WinRAR、7-Zip软件都可以压缩zip格式。下面一起来看看具体如何操作。 一、使用WinRAR…

日期处理第一篇--优雅好用的Java日期工具类Joda-Time

日常开发中&#xff0c;处理时间和日期是很常见的需求。基础的java内置工具类只有Date和Calendar&#xff0c;但是这些工具类的api使用并不是很方便和强大&#xff0c;于是就诞生了Joda-Time这个专门处理日期时间的库。 简介 Joda-Time提供了Java日期处理的优雅的替代品&…

IntelliJ IDEA 拉取gitlab项目

一、准备好Gitlab服务器及项目 http://192.168.31.104/root/com.saas.swaggerdemogit 二、打开 IntelliJ IDEA安装插件 打开GitLab上的项目&#xff0c;输入项目地址 http://192.168.31.104/root/com.saas.swaggerdemogit 弹出输入登录用户名密码&#xff0c;完成。 操作Comm…

【昕宝爸爸小模块】图文源码详解什么是线程池、线程池的底层到底是如何实现的

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

发送HTTP POST请求并处理响应

发送HTTP POST请求并处理响应是Web开发中的常见任务。在Go语言中&#xff0c;可以使用net/http包来发送HTTP POST请求并处理响应。 以下是一个示例代码&#xff0c;演示了如何发送HTTP POST请求并处理响应&#xff1a; go复制代码 package main import ( "b…

代码随想录算法训练营day10|232.用栈实现队列、225.用队列实现栈

理论基础 232.用栈实现队列 225. 用队列实现栈 理论基础 了解一下 栈与队列的内部实现机智&#xff0c;文中是以C为例讲解的。 文章讲解&#xff1a;代码随想录 232.用栈实现队列 大家可以先看视频&#xff0c;了解一下模拟的过程&#xff0c;然后写代码会轻松很多。 题目链…

Maven 依赖传递和冲突、继承和聚合

一、依赖传递和冲突 1.1 Maven 依赖传递特性 1.1.1 概念 假如有三个 Maven 项目 A、B 和 C&#xff0c;其中项目 A 依赖 B&#xff0c;项目 B 依赖 C。那么我们可以说 A 依赖 C。也就是说&#xff0c;依赖的关系为&#xff1a;A—>B—>C&#xff0c; 那么我们执行项目 …

性能优化-一文宏观理解OpenCL

本文主要对OpenCL做一个整体的介绍、包括环境搭建、第一个OpenCL程序、架构、优化策略&#xff0c;希望对读者有所收获。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础…

利用 ChatGPT 高效搜索:举一反三的思考方式,高效查找解决方案

文章目录 基础思路举一反三Go 语言 Web 框架延伸思考思考结论 本文只是我的一些尝试&#xff0c;基于 ChatGPT 实现系统化快速搜索某编程语言的特定领域相关包或者基于其他语言类推荐落地方案的尝试。 这篇文章中描述的方式不一定是好方式&#xff0c;但应该会有一定的启示作用…

Autosar --- CRC8 SAE J1850 CRC计算

前言 CRC计算一般用于通信中&#xff0c;用来保证一组数据的完整性。 发送方发送一组数据dataACRC检验码CRCa&#xff08;CRC校验码由数据算出&#xff09;&#xff1b; 接收方接收到数据dataACRC校验码CRCa&#xff0c;接收方通过与发送方约定好的计算公式&#xff0c;计算出一…

*p++和(*p)++一样吗

大家好&#xff0c;今天给大家介绍*p和&#xff08;*p)的区别&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 *p 和 (*p) 在 C/C 语言中具有不同的含义。 *p&#xff1a;这个表…

Java研学-Maven基础

一 概述 Maven是一个跨平台的项目管理工具&#xff0c;主要用于基于 Java 平台的项目&#xff08;Maven 底层为Java&#xff09;构建、依赖包管理和项目信息管理&#xff0c;只需要运行一条简单的命令&#xff0c;就能高效的完成构建动作   Maven 能提供一种项目的依赖配置&a…

精细微调技术在大型预训练模型优化中的应用

目录 前言1 Delta微调简介2 参数微调的有效性2.1 通用知识的激发2.2 高效的优化手段3 Delta微调的类别3.1 增量式微调3.2 指定式微调3.3 重参数化方法 4 统一不同微调方法4.1 整合多种微调方法4.2 动态调整微调策略4.3 超参数搜索和优化 结语 前言 随着大型预训练模型在自然语…

超优秀的三维模型优化平台(轻量化、格式转换、可视化等)

老子云概述 老子云3D可视化快速开发平台&#xff0c;集云压缩、云烘焙、云存储云展示于一体&#xff0c;使3D模型资源自动输出至移动端PC端、Web端&#xff0c;能在多设备、全平台进行展示和交互&#xff0c;是全球领先、自主可控的自动化3D云引擎。 平台架构 平台特性 基于 …

C#,人工智能,机器人,路径规划,A*(AStar Algorithm)算法、源代码及计算数据可视化

Peter Hart Nils Nilsson Bertram Raphael 参考&#xff1a; C#&#xff0c;人工智能&#xff08;AI&#xff09;机器人路径规划&#xff08;Path Planning&#xff09;的ARA*&#xff08;Anytime Replanning A* Algorithm&#xff09;算法与源程序https://blog.csdn.net/…