JAVA泛型和顺序表ArrayList
目录
泛型
泛型的定义:
泛型的实例化:
泛型的使用:
顺序表ArrayList
顺序表ArrayList的两种实例化方法:
ArrayList常用的方法:
1. add 方法
2. size ( ) 方法
3. get 方法
4. set 方法
5. 顺序表的三种遍历元素的方法。
for循环:
for each :
迭代器:
6. add ()在指定位置添加元素
7.删除元素:
根据下标删除元素:
根据元素内容删除元素:
注意:
8. contains 方法
9. indexOf 方法
10. subList 方法
11. clear()方法
泛型
泛型也就是适用于许多其他的类型。
泛型可以提高代码的复用性。
在我们之前学习的方法的重载后,发现其也不是那么的方便,因为要把方法的接收的参数重新设置,而且要是重载的方法多了,代码会变的“丑”,java所以引入了泛型来解决这一情况。所以为什么说泛型可以提高代码的复用性。
那么,泛型怎么定义,怎么实例化,怎么使用?
泛型的定义:
这里我们就创建了一个泛型类。
注意:
1.要在类名后加上 " < > " ,而其里面名字 " T " 是代表到时候实例化传过来的数据类型。
2.在new 一个数组对象时,因为在new 这个对象的时候,可能会涉及到调用该类的构造方法,T 是什么类型还不知道,构造方法实现不了。所以,要先通过 Object 类型来开辟空间,再通过强制类型转换成 T[ ] 数组类型。
泛型的实例化:
这样,我们就实例化了一个泛型。
注意:
在实例化中,"< >" 里面的书写。
1.如果是基本数据类型,要使用到其对应的包装类。
2.如果是引用类型,可以直接写,比如 String ,int [ ] ,double [ ] 。
包装类是 Java 为每个基本数据类型提供的对应的引用类型。基本数据类型不是对象,不具备对象的特性,如不能调用方法等。而包装类使得基本数据类型可以像对象一样被操作,基本数据类型也能够参与其中。
基本数据类型对应的包装类如图:
泛型的使用:
上面的 set 方法设置和 get 提取数据打印时没问题的,但是下面的 arr.set(1,10) 这一行代码就有问题了,这里需要的是 String 类型的数据,而这里传入了一个整数类型,触发了类型检查,所以,使用泛型能更好的让我们发现错误。
顺序表ArrayList
顺序表 与 数组 其实很相似,但顺序表 实现了 List 接口 ,List是一个接口,它定义了一系列操作顺序表的方法,例如添加元素、删除元素、获取元素、查询元素位置等。 ArrayList
是List
接口的一个具体实现类。它实现了List
接口中定义的所有方法。能更好的对数据进行处理,总的来说 顺序表 比 数组 好用。
顺序表ArrayList的两种实例化方法:
要注意,使用顺序表ArrayList要导入对应的包。
第一种实例化我们都会,但第二种实例化,使用了 List 的引用来进行接收 ArrayList 对象的示例,这也是“向上转型”。
我们前面知道:
把子类实例转成父类引用 称为“向上转型”。
把父类实例转成子类引用称为“向下转型”。
使用上面的第二种实例化,后续针对 List 进行各种方法的调用,就会触发多态,调用到子类ArrayList的方法。
另外,再看下面的:
这里的实例化的同时,指定初始化容量是元素个数,并且,顺序表是可以动态扩容的(后面也会讲到),只要机器的内存足够用,就能一直持续扩容,保证元素都能被容纳进去。(顺序表的一个核心功能)。
ArrayList常用的方法:
1. add 方法
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");System.out.println(arr1);
打印结果:
这是一个尾插的方法,先调用的add方法在前面存放,后调用的add方法继续在后面逐个插入数据。
add方法就涉及到动态扩容了。因为开始创建顺序表的时候并没有指定容量。在使用add方法后就会动态扩容了。
2. size ( ) 方法
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");System.out.println(arr1.size());
运行结果:
size ( ) 方法是获取顺序表的元素个数。
3. get 方法
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");System.out.println(arr1.get(0));System.out.println(arr1.get(1));System.out.println(arr1.get(2));System.out.println(arr1.get(3));
打印结果:
get 方法 可以获取 顺序表 当中对应下标的元素。
注意:
使用 get 方法 获取的下标不能越界。
4. set 方法
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");// System.out.println(arr1.get(0));
// System.out.println(arr1.get(1));
// System.out.println(arr1.get(2));
// System.out.println(arr1.get(3));arr1.set(1,"kkk");System.out.println(arr1);
打印结果:
set 方法是将顺序表对应下标的元素进行改变。
注意:
set 方法 设置元素的下标不能越界。
5. 顺序表的三种遍历元素的方法。
for循环:
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");for (int i = 0; i < arr1.size(); i++) {System.out.println(arr1.get(i));}
for each :
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");for(String s : arr1 ) {System.out.println(s);}
迭代器:
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");Iterator<String> sss = arr1.iterator();while(sss.hasNext()) {System.out.println(sss.next());}
这个类似于之前学习的 Scanner 输入的例子。
获取一个迭代器(Iterator
),并将这个迭代器赋值给名为sss
的变量。通过这个迭代器,可以方便地遍历 arr1
集合中的元素。
6. add ()在指定位置添加元素
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");arr1.add(2,"man");System.out.println(arr1);
打印结果:
这里插入元素是 插入后的 元素的位置下标。
在上述里例子中,如果插入的下标是 4 ,那么就相当于尾插了。
7.删除元素:
根据下标删除元素:
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");arr1.remove(2);System.out.println(arr1);
打印结果:
这里是删除了 2 下标的元素 “ccc” 。
根据元素内容删除元素:
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");arr1.add("ccc");arr1.add("eee");arr1.remove("ccc");System.out.println(arr1);
打印结果:
可以看到, remove 根据内容删除元素方法 用于从列表中删除指定元素的第一个匹配项,如果要删除所有的 “ccc”,可以通过循环检查每个元素,然后在匹配时删除来实现删除所有指定元素。(这里不做演示)
注意:
List<Integer> arr2 = new ArrayList<>();arr2.add(1);arr2.add(2);arr2.add(3);arr2.add(4);arr2.remove(2);System.out.println(arr2);
打印结果:
这里根据的是下标来删除元素的,如果想要删除元素2 应该怎么做?
可以这样:
List<Integer> arr2 = new ArrayList<>();arr2.add(1);arr2.add(2);arr2.add(3);arr2.add(4);Integer a = 2;arr2.remove(a);System.out.println(arr2);
打印结果:
这里借助了不同类型的 两种数据 触发了不同的重载方法,实现了两种删除方式。
基本数据类型int
的值(这里的1
、2
、3
、4
)会自动转换为Integer
对象并添加到列表中。自动装箱机制使得代码编写更加方便,程序员不需要显式地将int
转换为Integer
。
8. contains 方法
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");arr1.add("ccc");arr1.add("eee");System.out.println( arr1.contains("eee"));
运行结果:
这个方法用来判断顺序表中当前元素存不存在。
存在返回 true,否则返回 false 。
9. indexOf 方法
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");arr1.add("ccc");arr1.add("eee");//返回元素第一次出现的下标位置System.out.println(arr1.indexOf("ccc"));// //返回元素最后一次出现的下标位置System.out.println(arr1.lastIndexOf("ccc"));
打印结果:
如果元素不存在,则返回 -1
10. subList 方法
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");arr1.add("eee");//获取子列表 arr2List<String> arr2 = arr1.subList(1,3);//打印子列表 arr2System.out.println(arr2);//修改子列表arr2arr2.set(0,"111");//打印arr1System.out.println(arr1);
打印结果:
可以看到。
对子列表操作,不是创建“副本”列表,而是直接取原始列表一部分进行构造的,修改子列表,就会影响到原始的列表。
11. clear()方法
List<String> arr1 = new ArrayList<>();arr1.add("aaa");arr1.add("bbb");arr1.add("ccc");arr1.add("ddd");arr1.add("eee");//清空前System.out.println(arr1);arr1.clear();//清空后System.out.println(arr1);
打印如果:
clear 可以清空顺序表当中的元素。
相关文章:

JAVA泛型和顺序表ArrayList
目录 泛型 泛型的定义: 泛型的实例化: 泛型的使用: 顺序表ArrayList 顺序表ArrayList的两种实例化方法: ArrayList常用的方法: 1. add 方法 2. size ( ) 方法 3. get 方法 4. set 方法 5. 顺序表的三种遍历元素的方法…...

Qt桌面应用开发 第六天(鼠标事件 定时器事件 定时器类 事件分发器 事件过滤器)
目录 1.1鼠标进入和离开enterEvent\leaveEvent 1.2鼠标按下释放和移动mousePressEvent\mouseReleaseEvent\mouseMoveEvent 1.3定时器事件timerEvent 1.4定时器类QTimer 1.5事件分发器event 1.6事件过滤器eventFilter 1.1鼠标进入和离开enterEvent\leaveEvent 事件&#x…...
Javascript高级—深入JS模板字符串的高级用法
深入JS模板字符串的高级用法:解锁动态内容生成的无限可能 在JavaScript编程中,模板字符串(Template Literals)自ES6(ECMAScript 2015)引入以来,就以其简洁、直观的特性迅速成为开发者们生成动态…...
14. 【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--章节总结
本章重点介绍了如何在一个简单的系统中实现基本的权限管理功能。通过构建一个简单的权限控制模型,章节阐述了如何为用户分配权限,并在应用程序中进行访问控制。 一、关键要点: 1. 用户管理(登录/注册/Token) 本章节聚…...

vulhub之fastjson
fastjson 1.2.24 反序列化 RCE 漏洞(CVE-2017-18349) 漏洞简介 什么是json json全称是JavaScript object notation。即JavaScript对象标记法,使用键值对进行信息的存储。举个简单的例子如下: {"name":"BossFrank", "age":23, "isDevel…...

2024年亚太地区数学建模大赛D题-探索量子加速人工智能的前沿领域
量子计算在解决复杂问题和处理大规模数据集方面具有巨大的潜力,远远超过了经典计算机的能力。当与人工智能(AI)集成时,量子计算可以带来革命性的突破。它的并行处理能力能够在更短的时间内解决更复杂的问题,这对优化和…...

卷积神经网络各层介绍
目录 1 卷积层 2 BN层 3 激活层 3.1 ReLU(Rectified Linear Unit) 3.2 sigmoid 3.3 tanh(双曲正切) 3.4 Softmax 4 池化层 5 全连接层 6 模型例子 1 卷积层 卷积是使用一个卷积核(滤波器)对矩阵进…...

Python应用指南:高德拥堵延时指数
随着城市化进程的加快,交通拥堵问题日益严重,成为影响城市居民生活质量的重要因素之一。为了科学评估和管理交通拥堵,各种交通拥堵指数应运而生。其中,高德地图提供的“拥堵延时指数”因其数据丰富、实时性强和应用广泛而备受关注…...
ISO 21434标准:汽车网络安全管理的利与弊
ISO 21434标准在提升汽车网络安全性方面起到了重要作用,但任何标准都不是完美无缺的,ISO 21434标准也存在一些不足之处。以下是对其不足之处的分析: 一、标准的灵活性与适应性 缺乏具体技术细节:ISO 21434标准更多地提供了网络安…...

无插件H5播放器EasyPlayer.js视频流媒体播放器如何开启electron硬解码Hevc(H265)
在数字化时代,流媒体播放器技术正经历着前所未有的变革。随着人工智能、大数据、云计算等技术的融合,流媒体播放器的核心技术不断演进,为用户提供了更加丰富和个性化的观看体验。 EasyPlayer.js H5播放器,是一款能够同时支持HTTP、…...

excel版数独游戏(已完成)
前段时间一个朋友帮那小孩解数独游戏,让我帮解,我看他用电子表格做,只能显示,不能显示重复,也没有协助解题功能,于是我说帮你做个电子表格版的“解题助手”吧,不能直接解题,但该有的…...

接口上传视频和oss直传视频到阿里云组件
接口视频上传 <template><div class"component-upload-video"><el-uploadclass"avatar-uploader":action"uploadImgUrl":on-progress"uploadVideoProcess":on-success"handleUploadSuccess":limit"lim…...

Arcgis 地图制作
地图如下,不同历史时期:...
【每日一题1121】python校招笔试题、面试题
1、Python字符串不是通过NUL或者’\0’来结束的 C语言中字符串使用’\0’作为结束符,以防止越界。但是在python中,字符串值只包含所定义的东西。 2、执行以下程序,输出结果为() class Base(object):count 0def __in…...

Spring Boot + Vue 基于 RSA 的用户身份认证加密机制实现
Spring Boot Vue 基于 RSA 的用户身份认证加密机制实现 什么是RSA?安全需求介绍前后端交互流程前端使用 RSA 加密密码安装 jsencrypt库实现敏感信息加密 服务器端生成RSA的公私钥文件Windows环境 生成rsa的公私钥文件Linux环境 生成rsa的公私钥文件 后端代码实现返…...

Docker搭建有UI的私有镜像仓库
Docker搭建有UI的私有镜像仓库 一、使用这个docker-compose.yml文件: version: 3services:registry-ui:image: joxit/docker-registry-ui:2.5.7-debianrestart: alwaysports:- 81:80environment:- SINGLE_REGISTRYtrue- REGISTRY_TITLEAtt Docker Registry UI- DE…...
Qt打开文件对话框选择文件之后弹出两次
项目场景: 在 Qt 中,使用 ui 自动生成的 UI 文件会为每个控件自动生成一些默认的槽函数。如果您手动创建的槽函数名称与这些自动生成的槽函数名称相同,就会导致信号被多次连接,从而引发多次弹出文件对话框的问题。 原因分析&…...
【JAVA】正则表达式中的正向肯定预查
在Java中,正向肯定预查(Positive Lookahead)是一种正则表达式的高级特性,用于在匹配某个模式之前检查某个条件是否满足。正向肯定预查不会消耗字符,也就是说,它不会将匹配的字符从剩余的字符串中移除&#…...
django从入门到实战(一)——路由的编写规则与使用
Django 路由的编写规则与使用 在 Django 中,路由(URLconf)是将 URL 映射到视图函数的机制。它允许我们定义网站的 URL 结构,并将请求分发到相应的处理函数。以下是关于 Django 路由的定义规则及使用的详细介绍。 1. Django 的路…...
vue框架开发的前端项目,build和package的区别
在使用 Vue 框架开发前端项目时,build 和 package 是两个常见的操作,它们有不同的目的和作用。下面是它们的区别: 1. Build(构建) build 是将前端源代码(如 Vue 组件、JavaScript 文件、CSS 样式等&#…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...

算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...