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,一经查实,立即删除!

相关文章

掌握精准测量:解锁企业成功的IS010012测量管理体系

在现代企业的竞争环境中&#xff0c;精准的测量管理是成功的基石。IS010012测量管理体系提供了全面而系统的方法&#xff0c;帮助企业在质量、效率和竞争力方面实现飞跃。让我们深入探讨IS010012测量管理体系的关键作用&#xff0c;揭示其如何成为企业成功的秘密武器。 IS01001…

PHP MySQL 创建数据库

PHP MySQL 创建数据库 在Web开发中,PHP和MySQL的组合是一种非常流行的技术栈。PHP是一种服务器端脚本语言,而MySQL是一种关系型数据库管理系统。它们共同为开发者提供了一种强大且灵活的方式来创建动态的、数据驱动的网站。在本教程中,我们将介绍如何使用PHP来创建一个MySQ…

SpringBoot后端代码基本逻辑

数据持久化&#xff08;Dao---Entity---mapper&#xff09; 配置&#xff08;application.yml&#xff09; server:port: 10086 ​ spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/wiki?useUnicodetrue&characterEnco…

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

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

Github 2024-07-14 php开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-14统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10CSS项目1Symfony PHP框架和组件 创建周期:5130 天开发语言:PHP协议类型:MIT LicenseStar数量:28999 个Fork数量:9440 次关注人数…

24/07/10数据结构(5.1213)链表OJ

继续练习题: 7.判断链表是不是回文结构 对于一个链表,设计一个时间复杂度O(n)空间复杂度O(1)的算法,判断是否为回文结果 给定一个链表的头指针A,返回一个bool值代表其是否为回文结构. 测试样例:1->2->2->1 返回:ture bool chkPalindrome(ListNode* A){ …

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; 仓库管理系统包括管理员、员工俩种角色。 管理员功能包括个人中心模块用于修改个人信息和密码、管理员管理、仓库信息管理、基础数据管理功能模块有仓库类型管理和物资类型管理、物资信息管理…

使用xpath获取网页内容

使用xpath获取网页内容 安装 lxml 库 pip install lxml示例 from lxml import etreeurl = f"" respon = requests.get(url=url, verify=False).content.decode() htm

力扣1541.平衡括号字符串的最少插入次数

力扣1541.平衡括号字符串的最少插入次数 记录左括号数量 当遍历到**(只考虑第一个)**右括号时首先判断是否有左括号再判断接下来还有没有右括号 class Solution {public:int minInsertions(string s) {int res0;int lc 0;int n s.size();int i 0;while(i<n){char c s…

GLM3源码学习

原文链接&#xff1a;chatglm源码学习 GLM3源码&#xff1a;https://github.com/THUDM/ChatGLM3 我们直接从openai_api_demo入手&#xff0c;因为api_demo一般是nlp模型后端核心功能实现的部分 openai_api_demo源码 api_server.py api_server.py是提供web api接口的入口文件…

【面试题】Golang 之Channel底层原理 (第三篇)

目录 1.常见channel三大坑&#xff1a;死锁、内存泄漏、panic 1.死锁 1.只有生产者&#xff0c;没有消费者&#xff0c;或者反过来 2 生产者和消费者出现在同一个 goroutine 中 3 buffered channel 已满&#xff0c;且在同一个goroutine中 2.内存泄露 1 如何实现 gorout…

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…

C# 使用 NPOI 处理Excel,导入单元格内容是公式的处理

在C#中使用NPOI库处理Excel文件时&#xff0c;如果单元格内容包含公式&#xff0c;NPOI能够读取这些公式以及它们计算后的值。NPOI是一个开源的.NET库&#xff0c;用于处理Microsoft Office文档&#xff0c;特别是Excel文件&#xff08;.xls和.xlsx&#xff09;。 要处理包含公…

【小超嵌入式】C++猜数字游戏详细分析

一、程序源码 #include <iostream> #include <cstdlib> #include <ctime>using namespace std;int main() {srand(static_cast<unsigned int>(time(0))); // 随机数种子int targetNumber rand() % 100 1; // 生成 1 到 100 之间的随机数int guess…

helm系列之-构建自己的Helm Chart

构建自己的Helm Chart 一般常见的应用&#xff08;nginx、wordpress等&#xff09;公有的helm仓库都提供了chart&#xff0c;可以直接安装或者自定义安装。下面实践从零构建自己的helm chart应用。 准备工作 准备一个用于部署测试的应用镜像并推送到镜像仓库。 应用代码 这…

Linux 命令个人学习笔记

1. 操作目录的命令 (1) ls : 查看指定目录中, 都有哪些内容 直接输入 ls 是查看当前目录中的内容. 还可以给 ls 后面加上一个路径(绝对/相对), 就可以查看指定目录中的内容 比如看根目录(刚安装Centos下) ls / 根目录的地位类似于Java中的Object ls -l 详细查看当前文件的内容…