Java学习苦旅(十六)——List
本篇博客将详细讲解Java中的List。
文章目录
- 预备知识——初识泛型
- 泛型的引入
- 泛型小结
- 预备知识——包装类
- 基本数据类型和包装类直接对应关系
- 装包与拆包
- ArrayList
- 简介
- ArrayList使用
- ArrayList的构造
- ArrayList常见操作
- ArrayList遍历
- 结尾
预备知识——初识泛型
泛型的引入
我们之前实现过的顺序表,只能保存int类型的元素,如果现在需要保存指向String类型对象的引用的顺序表,请问应该如何解决?
这个时候就需要引入泛型这个概念了。
泛型的意义:
- 自动对类型进行检查
- 自动对类型进行强制类型的转换
示例代码:
class MyArrayList<E> {private E[] elem;private int usedSize;public MyArrayList() {this.elem = (E[]) new Object[10];}public void add(E val) {this.elem[usedSize] = val;usedSize++;}public E get(int pos) {return this.elem[pos];}
}public class TestDemo {public static void main(String[] args) {MyArrayList<String> myArrayList = new MyArrayList<>();myArrayList.add("ABC");myArrayList.add("DEF");System.out.println(myArrayList.get(1));}
}
执行结果为:

泛型小结
-
泛型是为了解决某些容器、算法等代码的通用性而引入,并且能在编译期间做类型检查。
-
泛型利用的是 Object 是所有类的祖先类,并且父类的引用可以指向子类对象的特定而工作。
-
泛型是一种编译期间的机制,即 MyArrayList<Integer> 和MyArrayList<String> 在运行期间是一个类型。
-
泛型是 java 中的一种合法语法,标志就是尖括号<>。
预备知识——包装类
基本数据类型和包装类直接对应关系
| 基本数据类型 | 包装类 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
装包与拆包
示例代码
Integer a = 123;//隐式的装包
int b = a;//隐式的拆包Integer a2 = Integer.valueOf(123);//显式的装包
Integer a3 = new Integer(123);//显式的装包int b2 = a2.intValue();//显式的拆包
ArrayList
简介
在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:

说明
-
ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问。
-
ArrayList实现了Cloneable接口,表明ArrayList是可以clone的。
-
ArrayList实现了Serializable接口,表明ArrayList是支持序列化的。
-
和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList。
-
ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表。
ArrayList使用
ArrayList的构造
| 方法 | 解释 |
|---|---|
| ArrayList() | 无参构造 |
| ArrayList(Collection<? extends E> c) | 利用其他Collection构建ArrayList |
| ArrayList(int initialCapacity) | 指定顺序表初始容量 |
示例代码
public static void main(String[] args) {List<Integer> list1 = new ArrayList<>();//构造一个空的列表List<Integer> list2 = new ArrayList<>(10);//构造一个具有10个容量的列表list2.add(1);list2.add(2);list2.add(3);ArrayList<Integer> list3 = new ArrayList<>(list2);//list3构造好之后,与list2中的元素一致
}
结论:
如果ArrayList调用,不带参数的构造方法,那么顺序表的大小是0。当第一次add的时候,整个顺序表才变为了10,当这10个放满了,开始扩容,以1.5倍的方式进行扩容。
如果调用的是给定容量的构造方法,那么顺序表的大小是所给的容量,放满之后还是以1.5倍进行扩容。
ArrayList常见操作
| 方法 | 解释 |
|---|---|
| boolean add(E e) | 尾插e |
| void add(int index, E element) | 将e插入到index位置 |
| boolean addAll(Collection<? extends E> c) | 尾插c中的元素 |
| E remove(int index) | 删除index位置元素 |
| boolean remove(Object o) | 删除遇到的第一个o |
| E get(int index) | 获取下标index位置元素 |
| E set(int index, E element) | 将下标index位置元素设置为element |
| void clear() | 清空 |
| boolean contains(Object o) | 判断o是否在线性表中 |
| int indexOf(Object o) | 返回第一个o所在下标 |
| int lastIndexOf(Object o) | 返回最后一个o的下标 |
| List<E> subList(int fromIndex, int toIndex) | 截取部分list |
示例代码
List<String> list = new ArrayList<>();
list.add("abc");
list.add("def");
list.add("ABC");
list.add("EFG");
System.out.println(list);
System.out.println(list.size());//获取list中有效元素个数
System.out.println("=========更改指定元素==========");
System.out.println(list.get(1));
list.set(1,"xyz");
System.out.println(list.get(1));
System.out.println("=========插入指定元素==========");
list.add(1,"LMN");//在list的index位置插入指定元素,index及后续的元素统一往后移动一个位置
System.out.println(list);
System.out.println("=========删除指定元素==========");
list.remove("ABC");//删除指定元素,找到了就删除,该元素之后的元素统一往前移动一个位置
System.out.println(list);
if(list.contains("OPQ")) {list.add("OPQ");
}
System.out.println("===查找指定元素第一次出现的位置===");
System.out.println(list.indexOf("EFG"));//indexOf从前往后找
System.out.println(list.lastIndexOf("EFG"));//lastIndexOf从后往前找
System.out.println("============================");
List<String> ret = list.subList(1,3);
System.out.println(ret);list.clear();
System.out.println(list.size());
执行结果为:

ArrayList遍历
示例代码
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
//直接打印
System.out.println(list);
//使用for循环
for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i) + " ");
}
System.out.println();
//使用for-each
for (Integer s : list) {System.out.print(s + " ");
}
System.out.println();
//迭代器打印——Iterator
Iterator<Integer> it = list.iterator();
while(it.hasNext()) {System.out.print(it.next() + " ");
}
System.out.println();
//迭代器打印——ListIterator
ListIterator<Integer> it1 = list.listIterator();
while(it1.hasNext()) {System.out.print(it1.next() + " ");
}
System.out.println();
执行结果为:

结尾
本篇博客到此结束。
上一篇博客:Java学习苦旅(十五)——异常
下一篇博客:Java学习苦旅(十七)——栈和队列
相关文章:
Java学习苦旅(十六)——List
本篇博客将详细讲解Java中的List。 文章目录 预备知识——初识泛型泛型的引入泛型小结 预备知识——包装类基本数据类型和包装类直接对应关系装包与拆包 ArrayList简介ArrayList使用ArrayList的构造ArrayList常见操作ArrayList遍历 结尾 预备知识——初识泛型 泛型的引入 我…...
python爬虫实现获取招聘信息
使用的python版本: 3.12.1 selenium版本:4.8.0 urllib版本:1.26.18 from selenium import webdriver from selenium.webdriver import ActionChains import timeimport re import xlwt import urllib.parsedef get_html(url):chrome_drive…...
模块电源(七):LDO 应用
1、Typical application circuit LDO 典型应用电路如下图所示: 2、High Output Current Positive Voltage Regulator 通过 PNP 型三极管 Tr1 ,可以提高 LDO 的输出电流能力,电路如下图所示: 设流过 R1 的电流为 ,当 …...
Redis命令---Hash(哈希)篇 (超全)
目录 1.Redis Hmset 命令 - 同时将多个 field-value (域-值)对设置到哈希表 key 中。简介语法可用版本: > 2.0.0返回值: 如果命令执行成功,返回 OK 。 示例 2.Redis Hmget 命令 - 获取所有给定字段的值简介语法可用版本: > 2.0.0返回值: 一个包含多个给定字段…...
Objects are not valid as a React child (found: object with keys {name}).
在jsx中可以嵌套表达式,将表达式作为内容的一部分,但是要注意,普通对象不能作为子元素;但是数组,react元素对象是可以的 如下:不能将stu这个对象作为子元素放 function App() {const myCal imgStyleconst…...
nodejs业务分层如何写后端接口
这里展示的是在node express 项目中的操作 ,数据库使用的是MongoDB,前期关于express和MongoDB的文章可访问: Nodejs后端express框架 server后端接口操作:通过路由匹配——>调用对应的 Controller——>进行 Service调用——&…...
Windows 7 虚拟机的安装以及解决安装VMVMware tools问题
1.Windows 7 虚拟机的安装以及解决安装VMVMware tools问题 参考:Windows 7 虚拟机的安装以及解决安装VMVMware tools问题 注意:下载官方补丁:Microsoft Update Catalog在智慧联想浏览器中打不开,要在火狐中才能打开下载。 2.win7如…...
[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-9PID控制器
本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-9PID控制器) P —— Proportional I —— Integral D —— Derivative 当前误差/过去误差/误差的变化趋势 K p ⋅ e K_{\mathrm{p}}\cdot e Kp⋅e:比…...
SSM养老院综合服务系统----计算机毕业设计
项目介绍 该项目为后台管理项目,分为管理员与护工两种角色; 管理员角色包含以下功能: 管理员登录,个人资料密码管理,用户管理,床位类型管理,床位管理,护工管理,老人管理,咨询登记管理,预约登记管理,老人健康信息管理,费用管理等功能。 护…...
广州求职招聘(找工作)去哪里找比较好
在广州找工作,可以选择“吉鹿力招聘网”这个平台。它是一个号称直接和boss聊的互联网招聘神器,同时,“吉鹿力招聘网”作岗位比较齐全,企业用户也多,比较全面。在“吉鹿力招聘网”历即可投递岗位。 广州找工作上 吉鹿力…...
ARM NEON 指令
NEON指令 按照操作数类型可以分为正常指令、宽指令、窄指令、饱和指令、长指令。 正常指令:生成大小相同且类型通常与操作数向量相同到结果向量。长指令:对双字向量操作数执行运算,生产四字向量到结果。所生成的元素一般是操作数元素宽度到…...
Open3D 最小二乘拟合平面——拉格朗日乘子法
目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接Open3D 最小二乘拟合平面——拉格朗日乘子法。爬虫自重。 一、算法原理 设拟合出的平面方程为: a x + b y +...
Rockchip平台Android应用预安装功能(基于Android13)
Rockchip平台Android应用预安装功能(基于Android13) 1. 预安装应用类型 Android上的应用预安装功能,主要是指配置产品时,根据厂商要求,将事先准备好的第三方应用预置进Android系统。预安装分为以下几种类型: 安装不可卸载应用安…...
vue项目表单使用正则过滤ip、手机号
import useFormValidate from /hooks/useFormValidatesetup(props, { emit }) {const { validateName, validateIPAndPort } useFormValidate()const state reactive({workFaceInfo: props.info?.id ? props.info : {},sysTypeData: props.sysType,formRules: {name: [{req…...
vscode编译调试sln工程
使用msvc工具链 vscode配置调用visual studio的编译和调试环境_vscode用vs-CSDN博客 将vscode打造无敌的IDE(14) tasks.json和launch.json配置详解,随心所欲添加自动化任务_tasks.json详解-CSDN博客 通过命令行使用 Microsoft C 工具集 | Microsoft Learn 编译…...
Android 车联网——CarManager管理器(四)
上篇文章介绍了CarPropertyService 的使用,这一篇我们来看一下 Android Automotive OS 中一些子模块如何使用 CarPropertyManager。 一、管理器调用 ICarImpl 源码位置:/packages/services/Car/service/src/com/android/car/ICarImpl.java @Override public IBinder getC…...
C# OpenCvSharp读取rtsp流录制mp4可分段保存
软件界面: 测试环境: VS2019 .NET Framework 4.7.2 OpencvSharp4.8.0 输入RTSP流地址即可拉取RTSP流,支持抓拍和录制RTSP流视频,且支持支持按固定时间保存,比如我想5分钟保存一个视频,设置保存间隔为30…...
Maven的心脏:深入解析settings.xml配置文件
Maven作为Java世界中最著名的构建工具之一,其灵魂所在无疑是那些配置文件。在这些配置文件中,settings.xml扮演着至关重要的角色。今天,我们就来深入剖析这个Maven的心脏部件,看看它如何为我们的项目搏动生命。 一、Maven settin…...
uni静态资源引入及css图片图标引用规范
1、页面组件引入 单页面中的组件引入需经过导入——注册——使用三个步骤; <template><view><!-- 3.使用组件 --><uni-rate text"1"></uni-rate></view> </template> <script>// 1. 导入组件import un…...
API 开放平台项目(已整理,已废弃)
项目大纲 前端 React 18Ant Design Pro 5.x 脚手架Ant Design & Procomponents 组件库Umi 4 前端框架OpenAPI 前端代码生成 后端 Java Spring BootMySQL 数据库MyBatis-Plus 及 MyBatis X 自动生成API 签名认证(Http 调用)Spring Boot Starter&#…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
