• 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 并实例化它:

    1. import java.util.ArrayList;
    2. public class ArrayList01 {
    3. public static void main(String[] args) {
    4. //1.创建集合
    5. ArrayList list = new ArrayList();
    6. }
    7. }

    2. 集合的增删改查

    2.1 增加元素

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

    2.2 删除元素

    1. //3.删除元素
    2. boolean result1 = list.remove("A");
    3. System.out.println(result1);
    4. System.out.println(list);
    5. boolean result2 = list.contains("E");
    6. System.out.println(result2);
    7. System.out.println(list);
    8. String str = list.remove(0);
    9. System.out.println(str);
    10. System.out.println(list);

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

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

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

    2.3 修改元素

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

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

    2.4 查找元素

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

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

    3.集合的遍历

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

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

    四、习题讲解

    1. 集合的遍历方式

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

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

    1. import java.util.ArrayList;
    2. public class text1 {
    3. public static void main(String[] args) {
    4. //1.创建集合
    5. ArrayList list = new ArrayList<>();
    6. //2.添加元素
    7. list.add("Hello");
    8. list.add("World");
    9. list.add("!");
    10. //3.遍历输出
    11. System.out.print("[");
    12. for (int i = 0; i < list.size(); i++) {
    13. if(i==list.size()-1){
    14. System.out.print(list.get(i));
    15. }else{
    16. System.out.print(list.get(i)+",");
    17. }
    18. }
    19. System.out.println("]");
    20. }
    21. }

    结果展示: 

    代码分析:

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

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

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

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

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

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

    2. 添加数字并遍历

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

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

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

    1. public class text2 {
    2. public static void main(String[] args) {
    3. //1.创建集合
    4. ArrayList list = new ArrayList<>();
    5. //2.添加元素
    6. list.add(1);
    7. list.add(2);
    8. list.add(3);
    9. //3.遍历输出
    10. System.out.print("[");
    11. for (int i = 0; i < list.size(); i++) {
    12. if(i==list.size()-1){
    13. System.out.print(list.get(i));
    14. }else{
    15. System.out.print(list.get(i)+",");
    16. }
    17. }
    18. System.out.println("]");
    19. }
    20. }

    结果展示: 

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

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

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

    定义学生类:

    1. public class Student {
    2. private String name;
    3. private int age;
    4. public Student(String name, int age) {
    5. this.name = name;
    6. this.age = age;
    7. }
    8. public Student() {
    9. }
    10. public String getName() {
    11. return name;
    12. }
    13. public void setName(String name) {
    14. this.name = name;
    15. }
    16. public int getAge() {
    17. return age;
    18. }
    19. public void setAge(int age) {
    20. this.age = age;
    21. }
    22. }

    java代码 

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

    代码分析:

    使用 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代码:

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

    结果展示:

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

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

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

    如果存在,返回true

    如果不存在,返回false

    定义用户类:

    1. public class User {
    2. private int id;
    3. private String username;
    4. private String password;
    5. public User() {
    6. }
    7. public User(int id, String username, String password) {
    8. this.id = id;
    9. this.username = username;
    10. this.password = password;
    11. }
    12. public int getId() {
    13. return id;
    14. }
    15. public void setId(int id) {
    16. this.id = id;
    17. }
    18. public String getUsername() {
    19. return username;
    20. }
    21. public void setUsername(String username) {
    22. this.username = username;
    23. }
    24. public String getPassword() {
    25. return password;
    26. }
    27. public void setPassword(String password) {
    28. this.password = password;
    29. }
    30. }

    java代码:

    1. public class text4 {
    2. public static void main(String[] args) {
    3. //1.定义集合
    4. ArrayListlist=new ArrayList<>();
    5. //2.添加用户信息
    6. Scanner sc=new Scanner(System.in);
    7. for (int i = 0; i < 3; i++) {
    8. User user=new User();
    9. System.out.print("请输入用户id:");
    10. user.setId(sc.nextInt());
    11. System.out.print("请输入用户名:");
    12. user.setUsername(sc.next());
    13. System.out.print("请输入用户密码:");
    14. user.setPassword(sc.next());
    15. list.add(user);
    16. }
    17. //3.根据id查找用户信息
    18. System.out.print("请输入你要查找的id:");
    19. int id=sc.nextInt();
    20. for (int i = 0; i < list.size(); i++) {
    21. if(list.get(i).getId()==id){
    22. System.out.println(true);
    23. break;
    24. }else{
    25. System.out.println(false);
    26. break;
    27. }
    28. }
    29. }
    30. }

    代码分析:

    查找用户信息的循环

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

    结果展示: 

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

    需求:定义一个phone类

    phone属性:品牌,价格

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

    定义手机类:

    1. public class Phone {
    2. private String brand;
    3. private int price;
    4. public Phone() {
    5. }
    6. public Phone(String brand, int price) {
    7. this.brand = brand;
    8. this.price = price;
    9. }
    10. public String getBrand() {
    11. return brand;
    12. }
    13. public void setBrand(String brand) {
    14. this.brand = brand;
    15. }
    16. public int getPrice() {
    17. return price;
    18. }
    19. public void setPrice(int price) {
    20. this.price = price;
    21. }
    22. }

    java代码:

    1. public class text5 {
    2. public static void main(String[] args) {
    3. //1.创建集合
    4. ArrayListlist=new ArrayList<>();
    5. //2.存放手机信息
    6. Phone phone1=new Phone("小米",1000);
    7. list.add(phone1);
    8. Phone phone2=new Phone("苹果",8000);
    9. list.add(phone2);
    10. Phone phone3=new Phone("鸭梨",2999);
    11. list.add(phone3);
    12. GetPhone(list);
    13. }
    14. public static void GetPhone(ArrayListlist) {
    15. int sum=0;
    16. for (int i = 0; i < list.size(); i++) {
    17. sum+=list.get(i).getPrice();
    18. }
    19. for (int i = 0; i < list.size(); i++) {
    20. if(list.get(i).getPrice()<=(sum/3)){
    21. System.out.println(list.get(i).getBrand()+" "+list.get(i).getPrice());
    22. }
    23. }
    24. }
    25. }

    代码分析:

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

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

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

    • GetPhone 方法

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

    结果展示: 

  • 相关阅读:
    【复】一次流量分析经历
    MCS:离散随机变量——Binomial分布
    StarUML的介绍与使用
    PCL1.12.1 with QT6.3.2 编译部署
    如何优雅的删除undo表空间
    【附源码】计算机毕业设计SSM视频网站
    字符串匹配——KMP算法
    IDEA - 管理多个Git Remotes
    java图片转pdf ,pdf 导出
    七夕送女朋友什么礼物?2022年七夕礼物推荐
  • 原文地址:https://blog.csdn.net/2302_80329073/article/details/140411115