java《ArrayList篇》--ArrayList全套知识点总结及其配套习题逐语句分析(附带全套源代码)

一、前言

来不及悼念字符串了,接下来登场的是集合,集合和数组的用法差不多,不同之处就在于存储的内容,数组是固定的长度的,集合的长度不固定。学习的过程中可以参照数组

 今天已经是学习java的第八天了,接下来的课程都属于进阶部分了。基础部分已经彻底结束了。还是那句话,面向对象十分重要,接下来还会对面向对象进行深入的学习。

java基础部分一览

运算符、判断、循环

数组、方法

java小型实战项目双色球系统

面向对象基础篇综合训练

面向对象进阶篇综合训练

字符串基础篇

字符串进阶篇

二、ArrayList基本概念 

ArrayList 是 Java 中非常常用的动态数组实现,它继承了 AbstractList 并实现了 List 接口。

 动态数组实现

ArrayList 内部使用数组来存储元素,相比于普通的数组,它具有以下优点:

  • 自动扩容:在需要添加更多元素时,ArrayList 会自动增加其内部数组的容量,以容纳新的元素。
  • 随机访问:可以通过索引快速访问数组中的任何元素,时间复杂度为 O(1)。

实现了List接口

ArrayList 实现了 List 接口,因此具有列表的所有特性:

允许存储重复元素。

保持元素的插入顺序。

提供了丰富的操作方法,如添加、删除、获取元素等。

特点和优点

  • 灵活性:可以根据需要动态地增加或减少元素的个数。
  • 性能:在大多数情况下,ArrayList 的性能非常好。在随机访问和尾部插入/删除的操作中表现优异。
  • 易用性:API 简单易懂,提供了丰富的方法来操作集合中的元素。

内部实现

ArrayList 内部使用一个 Object[] 数组来存储元素。当需要增加元素时,如果当前数组容量不足,会创建一个新的更大容量的数组,并将原来的元素复制到新数组中。这种机制保证了 ArrayList 的动态性和高效性。

注意事项

  • 性能问题:频繁地在中间位置插入和删除元素可能会导致性能问题,因为涉及到数组元素的移动和复制。
  • 线程安全ArrayList 不是线程安全的,如果需要在多线程环境下使用,可以考虑使用 Collections.synchronizedList() 或 CopyOnWriteArrayList

三、ArrayList常用操作

1. 集合的创建

要创建一个 ArrayList,需要导入 java.util.ArrayList 并实例化它:

import java.util.ArrayList;public class ArrayList01 {public static void main(String[] args) {//1.创建集合ArrayList<String> list = new ArrayList<String>();}
}

2. 集合的增删改查

2.1 增加元素

//2.添加元素
list.add("A");
list.add("B");
list.add("C");
list.add("D");

2.2 删除元素

//3.删除元素
boolean result1 = list.remove("A");
System.out.println(result1);
System.out.println(list);boolean result2 = list.contains("E");
System.out.println(result2);
System.out.println(list);String str = list.remove(0);
System.out.println(str);
System.out.println(list);

result1为true:因为集合中有A这个元素。

result2为false:因为集合中没有B这个元素。

str为B:list.remove(0)代表list中下标为0的元素。

2.3 修改元素

//4.修改元素
String result3 = list.set(0,"E");
System.out.println(result3);
System.out.println(list);

语法:list.set(想要修改元素的下标,修改后的新值)

2.4 查找元素

//5.查找元素
String result4 = list.get(1);
System.out.println(result4);
System.out.println(list);

语法:list.get(查找元素的下标)

3.集合的遍历

//6.遍历
for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));
}

类似数组的遍历,for、while循环都可以

四、习题讲解

1. 集合的遍历方式

需求:定义一个集合,添加字符串,并进行遍历

遍历格式:[元素一、元素二、元素三]

import java.util.ArrayList;public class text1 {public static void main(String[] args) {//1.创建集合ArrayList<String> list = new ArrayList<>();//2.添加元素list.add("Hello");list.add("World");list.add("!");//3.遍历输出System.out.print("[");for (int i = 0; i < list.size(); i++) {if(i==list.size()-1){System.out.print(list.get(i));}else{System.out.print(list.get(i)+",");}}System.out.println("]");}
}

结果展示: 

代码分析:

System.out.print("["); 打印左括号 [,作为输出的起始标志。

for 循环遍历 list 中的每个元素:

list.size() 返回列表中元素的个数,循环条件 i < list.size() 确保循环遍历到所有元素。

list.get(i) 获取索引为 i 的元素。

根据索引 i 是否是最后一个元素,使用条件判断来决定是直接打印元素还是打印元素后跟随逗号。

System.out.println("]"); 打印右括号 ],作为输出的结束标志,并换行。

2. 添加数字并遍历

需求:定义一个集合,添加数字,并进行遍历

遍历格式:[元素一、元素二、元素三]

基本数据类型对应的包装类:

public class text2 {public static void main(String[] args) {//1.创建集合ArrayList<Integer> list = new ArrayList<>();//2.添加元素list.add(1);list.add(2);list.add(3);//3.遍历输出System.out.print("[");for (int i = 0; i < list.size(); i++) {if(i==list.size()-1){System.out.print(list.get(i));}else{System.out.print(list.get(i)+",");}}System.out.println("]");}
}

结果展示: 

3. 添加学生对象进行遍历

需求:定义一个集合,添加一些学生对象,并进行遍历。

学生对象的属性:姓名、年龄。

定义学生类:

public class Student {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public Student() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

java代码 

import java.util.ArrayList;public class text3 {public static void main(String[] args) {//1.创建集合ArrayList<Student>list=new ArrayList<>();//2.创建学生对象Student s1=new Student("张三",18);Student s2=new Student("李四",19);Student s3=new Student("王五",22);//3.添加元素list.add(s1);list.add(s2);list.add(s3);//4.遍历输出学生信息for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i).getName()+'\t'+list.get(i).getAge());}}
}

代码分析:

使用 for 循环遍历 list 中的每个 Student 对象:

  • list.size() 返回列表中元素的个数,循环条件 i < list.size() 确保循环遍历到所有元素。
  • list.get(i) 获取索引为 i 的 Student 对象。
  • list.get(i).getName() 和 list.get(i).getAge() 分别获取当前 Student 对象的名字和年龄。
  • System.out.println() 打印每个学生的姓名和年龄,使用 '\t' 进行姓名和年龄的分隔。

结果展示:

需求:定义一个集合,键盘录入一些学生对象,并进行遍历。

学生对象的属性:姓名、年龄。

java代码:

public class text3 {public static void main(String[] args) {//1.创建集合ArrayList<Student>list=new ArrayList<>();Scanner sc=new Scanner(System.in);//2.键盘录入学生对象for(int i=0;i<3;i++){Student s=new Student();System.out.println("请输入学生姓名:");s.setName(sc.next());System.out.println("请输入学生年龄:");s.setAge(sc.nextInt());list.add(s);}//3.遍历输出学生信息for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i).getName()+'\t'+list.get(i).getAge());}}
}

结果展示:

4. 添加用户对象并判断是否存在

需求:集合存入用户信息,用户属性有:id,username、password

要求:定义一个方法,根据ID查询用户信息

如果存在,返回true

如果不存在,返回false

定义用户类:

public class User {private int id;private String username;private String password;public User() {}public User(int id, String username, String password) {this.id = id;this.username = username;this.password = password;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

java代码:

public class text4 {public static void main(String[] args) {//1.定义集合ArrayList<User>list=new ArrayList<>();//2.添加用户信息Scanner sc=new Scanner(System.in);for (int i = 0; i < 3; i++) {User user=new User();System.out.print("请输入用户id:");user.setId(sc.nextInt());System.out.print("请输入用户名:");user.setUsername(sc.next());System.out.print("请输入用户密码:");user.setPassword(sc.next());list.add(user);}//3.根据id查找用户信息System.out.print("请输入你要查找的id:");int id=sc.nextInt();for (int i = 0; i < list.size(); i++) {if(list.get(i).getId()==id){System.out.println(true);break;}else{System.out.println(false);break;}}}
}

代码分析:

查找用户信息的循环

  • 使用 for 循环遍历 list 中的每个 User 对象。
  • 每次迭代开始时,提示用户输入要查找的 id。
  • 获取用户输入的 id,并与当前 User 对象的 id 进行比较。
  • 如果找到匹配的 id,输出 true 并结束循环。
  • 如果没有找到匹配的 id,输出 false 并结束循环。

结果展示: 

 5. 添加手机对象并返回要求的数据

需求:定义一个phone类

phone属性:品牌,价格

定义一个方法,将价格低于3000的手机信息返回

定义手机类:

public class Phone {private String brand;private int price;public Phone() {}public Phone(String brand, int price) {this.brand = brand;this.price = price;}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}
}

java代码:

public class text5 {public static void main(String[] args) {//1.创建集合ArrayList<Phone>list=new ArrayList<>();//2.存放手机信息Phone phone1=new Phone("小米",1000);list.add(phone1);Phone phone2=new Phone("苹果",8000);list.add(phone2);Phone phone3=new Phone("鸭梨",2999);list.add(phone3);GetPhone(list);}public static void GetPhone(ArrayList<Phone>list) {int sum=0;for (int i = 0; i < list.size(); i++) {sum+=list.get(i).getPrice();}for (int i = 0; i < list.size(); i++) {if(list.get(i).getPrice()<=(sum/3)){System.out.println(list.get(i).getBrand()+" "+list.get(i).getPrice());}}}
}

代码分析:

  • ArrayList<Phone> list = new ArrayList<>();:创建了一个泛型为 Phone 的动态数组 list,用于存储手机对象。

  • Phone 类:假设 Phone 类有两个属性,品牌 (brand) 和价格 (price),并且具有相应的构造函数和获取方法(如 getBrand()getPrice())。

  • 主函数 main:在 main 函数中,创建了三个不同品牌和价格的手机对象,并将它们依次添加到 list 中。然后调用了 GetPhone(list) 方法。

  • GetPhone 方法

    • 首先计算了所有手机价格的总和 sum
    • 然后遍历 list,检查每个手机的价格是否小于等于 sum 的三分之一。
    • 如果是,则打印该手机的品牌和价格。

结果展示: 

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

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

相关文章

LabVIEW中modbusTCP怎样才能和profibusDP通信?

在LabVIEW中&#xff0c;Modbus TCP和Profibus DP是两种不同的工业通信协议&#xff0c;要实现这两者之间的通信&#xff0c;可以采用网关设备进行协议转换&#xff0c;或者通过一个中间设备&#xff08;如PLC&#xff09;进行数据桥接。以下是实现此通信的一些方法&#xff1a…

win10系统更新后无法休眠待机或者唤醒,解决方法如下

是否使用鼠标唤醒 是否使用鼠标唤醒 是否使用键盘唤醒

unity 手动制作天空盒及使用

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神不吝指教&#xff01; 文章目录 前言一、使用前后左右上下六张图1.准备6张机密结合的图片2.创建Material材质球3.使用天空盒 二、使用HDR贴图制作1.准备HDR贴图2.导入unity 修改Texture Sourpe 属性3.创建材质球4.使用…

【java计算机毕设】基于J2EE的仓库管理系统设计与开发源码带文档MySQL ssm vue maven前后端可分离也可不分离

目录 1项目功能 2项目介绍 3项目地址 1项目功能 2项目介绍 系统功能&#xff1a; 仓库管理系统包括管理员、员工俩种角色。 管理员功能包括个人中心模块用于修改个人信息和密码、管理员管理、仓库信息管理、基础数据管理功能模块有仓库类型管理和物资类型管理、物资信息管理…

CSS学习碎碎念之卡片展示

效果展示&#xff1a; 代码展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>图片展示</title…

Android C++系列:Linux网络(三)协议格式

1. 数据包封装 传输层及其以下的机制由内核提供,应用层由用户进程提供(后面将介绍如何使用 socket API编写应用程序),应用程序对通讯数据的含义进行解释,而传输层及其以下 处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。应用层 数据通过协议栈发到…

《Linux系统编程篇》vim的使用 ——基础篇

引言 上节课我们讲了&#xff0c;如何将虚拟机的用户目录映射到自己windows的z盘&#xff0c;虽然这样之后我们可以用自己的编译器比如说Visual Studio Code&#xff0c;或者其他方式去操作里面的文件&#xff0c;但是这是可搭建的情况下&#xff0c;在一些特殊情况下&#xf…

(十一) Docker compose 部署 Mysql 和 其它容器

文章目录 1、前言1.1、部署 MySQL 容器的 3 种类型1.2、M2芯片类型问题 2、具体实现2.1、单独部署 mysql 供宿主机访问2.1.1、文件夹结构2.1.2、docker-compose.yml 内容2.1.3、运行 2.2、单独部署 mysql 容器供其它容器访问&#xff08;以 apollo 为例&#xff09;2.2.1、文件…

pyinstaller教程(二)-快速使用(打包python程序为exe)

1.介绍 PyInstaller 是一个强大的 Python 打包工具&#xff0c;可以将 Python 程序打包成独立的可执行文件。以下会基于如何在win系统上将python程序打包为exe可执行程序为例&#xff0c;介绍安装方式、快速使用、注意事项以及特别用法。 2.安装方式 通过 pip 安装 PyInstal…

万界星空科技MES系统:食品加工安全的实时监控与智能管理

万界星空科技MES系统通过集成多种技术和功能&#xff0c;能够实时监控食品加工过程中各环节的安全风险。以下是对该系统如何实现实时监控的详细分析&#xff1a; 一、集成传感器和数据分析技术 万界星空科技MES系统利用集成的传感器和数据分析技术&#xff0c;实时监控生产过程…

基于SSM的校园一卡通管理系统的设计与实现

摘 要 本报告全方位、深层次地阐述了校园一卡通管理系统从构思到落地的整个设计与实现历程。此系统凭借前沿的 SSM&#xff08;Spring、Spring MVC、MyBatis&#xff09;框架精心打造而成&#xff0c;旨在为学校构建一个兼具高效性、便利性与智能化的一卡通管理服务平台。 该系…

数学建模入门

目录 文章目录 前言 一、数学建模是什么&#xff1f; 1、官方概念&#xff1a; 2、具体过程 3、适合哪一类人参加&#xff1f; 4、需要有哪些学科基础呢&#xff1f; 二、怎样准备数学建模&#xff08;必备‘硬件’&#xff09; 1.组队 2.资料搜索 3.常用算法总结 4.论文撰写的…

微前端解决方案

在实施微前端架构时&#xff0c;前端框架和技术的选型是非常重要的。不同的框架和技术有着不同的优缺点&#xff0c;需要结合具体的应用场景进行选择。一、常见的微前端解决方案 Web Components Web Components&#xff08;包括Custom Elements、Shadow DOM和HTML Imports&…

数据建设实践之大数据平台(一)准备环境

大数据组件版本信息 zookeeper-3.5.7hadoop-3.3.5mysql-5.7.28apache-hive-3.1.3spark-3.3.1dataxapache-dolphinscheduler-3.1.9大数据技术架构 大数据组件部署规划 node101node102node103node104node105datax datax datax ZK ZK ZK RM RM NM

HTML网页大设计-家乡普宁德安里

代码地址: https://pan.quark.cn/s/57e48c3b3292

二分图——AcWing 257. 关押罪犯

目录 二分图 定义 运用情况 注意事项 解题思路 AcWing 257. 关押罪犯 题目描述 运行代码 代码思路 改进思路 二分图 定义 二分图&#xff08;Bipartite Graph&#xff09;是一种特殊的图&#xff0c;在这种图中&#xff0c;顶点可以被分成两个互不相交的集合&…

C语言 | Leetcode C语言题解之第233题数字1的个数

题目&#xff1a; 题解&#xff1a; int countDigitOne(int n) {// mulk 表示 10^k// 在下面的代码中&#xff0c;可以发现 k 并没有被直接使用到&#xff08;都是使用 10^k&#xff09;// 但为了让代码看起来更加直观&#xff0c;这里保留了 klong long mulk 1;int ans 0;f…

硬盘HDD:AI时代的战略金矿?

在这个AI如火如荼的时代&#xff0c;你可能以为硬盘HDD已经像那些过时的诺基亚手机一样&#xff0c;被闪存和云存储淘汰到历史的尘埃里。但&#xff0c;别急着给HDD们举行退休派对&#xff0c;因为根据Finis Conner这位硬盘界的传奇人物的说法&#xff0c;它们非但没退场&#…

Linux进程——子进程详解

文章目录 查看进程的另一种方式如何创建子进程fork函数详解fork函数的用法fork函数做了什么为什么fork有两个返回值父子进程的运行顺序是什么样的为什么fork函数的两个返回值不同 在上一节中我们简单介绍了进程的概念&#xff0c;还有父进程和子进程 这篇文章的主要内容是介绍…

eNsp公司管理的网络NAT策略搭建

实验拓扑图 实验需求&#xff1a; 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 8&#xff0c;分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 9&#xff0c;多出口环境基于带…