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 的三分之一。
    • 如果是,则打印该手机的品牌和价格。

结果展示: 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3 vite+gojs 2.3.14 去除水印

引用vue2的做法&#xff1a;http://t.csdnimg.cn/Yrz8n 自定义vite插件&#xff0c;插件中apply 分两种模式&#xff0c;如果打包请选择build&#xff0c;记得强制刷新浏览器清缓存采能看到最新的gojs界面 export default function createGojsWaterMaker() {return {name:rem…

FPGA笔试

半加器和全加器的区别&#xff1a; 1、半加器不考虑输入的进位&#xff0c;称之为半加。 2、全加器反之&#xff0c;考虑进位。 SRAM/DRAM优缺点对比_sram和dram的主要区别及优缺点-CSDN博客 消除竞争冒险的方法 ①滤波电容&#xff1a;因为尖峰脉冲很窄&#xff0c;用很小的…

PyFluent入门之旅(5)后处理

接着PyFluent入门之旅&#xff08;4&#xff09;算例求解后我们已经完成了求解&#xff0c;并且保存了.dat的结果文件。 现在可以利用Fluent内置的后处理功能进行图像与数据曲线的输出。 1. 计算结果文件的读取 如果需要在计算完成后立即进行后处理&#xff0c;那么直接在求…

Nginx入门到精通六(高可用配置)

下面内容整理自bilibili-尚硅谷-Nginx青铜到王者视频教程 Nginx相关文章 Nginx入门到精通一&#xff08;基本概念介绍&#xff09;-CSDN博客 Nginx入门到精通二&#xff08;安装配置&#xff09;-CSDN博客 Nginx入门到精通三&#xff08;Nginx实例1&#xff1a;反向代理&a…

【Django+Vue3 线上教育平台项目实战】构建高效线上教育平台之首页模块

文章目录 前言一、导航功能实现a.效果图&#xff1a;b.后端代码c.前端代码 二、轮播图功能实现a.效果图b.后端代码c.前端代码 三、标签栏功能实现a.效果图b.后端代码c.前端代码 四、侧边栏功能实现1.整体效果图2.侧边栏功能实现a.效果图b.后端代码c.前端代码 3.侧边栏展示分类及…

springboot1——快速构建项目

需求 第一步&#xff1a;创建maven工程(非web项目) 第二步&#xff1a;导入起步依赖 点击&#xff1a; 下拉复制&#xff1a; 粘贴&#xff1a;&#xff01;&#xff01;这是springboot工程需要继承的父工程 下拉复制&#xff1a; 粘贴&#xff1a;&#xff01;&#xf…

android13 文件管理器无法安装apk 奔溃问题

总纲 android13 rom 开发总纲说明 目录 1.前言 2.我们简单写个apk测试下 3.排查客户apk 4.frameworks源码排查 5.编译验证 6.彩蛋 1.前言 客户提供的文件管理apk不能安装apk文件,一点击就奔溃。 2.我们简单写个apk测试下 private void installApk(File apkFile) {i…

将swagger注解导入apifox的IDEA配置

在使用IDEA开发中&#xff0c;经常需要将后端接口导出到Apifox&#xff0c;以便于测试。将swagger注解内容导出到Apifox中&#xff0c;需要进行以下设置: file->settting打开对话框&#xff0c;选择Other Settings -> Apifox Help&#xff0c;如下图&#xff1a; 2.选…

【JavaWeb程序设计】Servlet(二)

目录 一、改进上一篇博客Servlet&#xff08;一&#xff09;的第一题 1. 运行截图 2. 建表 3. 实体类 4. JSP页面 4.1 login.jsp 4.2 loginSuccess.jsp 4.3 loginFail.jsp 5. mybatis-config.xml 6. 工具类&#xff1a;创建SqlSessionFactory实例&#xff0c;进行 My…

Twelve Labs:专注视频理解,像人类一样理解视频内容

在当今数字化世界中&#xff0c;视频已成为人们获取信息和娱乐的主要方式之一。 AI视频生成领域的竞争也很激烈&#xff0c;Pika、Sora、Luma AI以及国内的可灵等&#xff0c;多模态、视频生成甚至也被视为大模型发展的某种必经之路。然而&#xff0c;与文本生成相比&#xff…

什么ISP?什么是IAP?

做单片机开发的工程师经常会听到两个词&#xff1a;ISP和IAP&#xff0c;但新手往往对这两个概念不是很清楚&#xff0c;今天就来和大家聊聊什么是ISP&#xff0c;什么是IAP&#xff1f; 一、ISP ISP的全称是&#xff1a;In System Programming&#xff0c;即在系统编程&…

【蓄势·致远】 同为科技(TOWE)2024年年中会议

2024年7月2日-8日&#xff0c;同为科技&#xff08;TOWE&#xff09;召开2024年年中工作会议。会议回顾上半年总体工作情况&#xff0c;分析研判发展形势&#xff0c;规划部署下半年工作。 为期一周的工作会议&#xff0c;由同为科技&#xff08;TOWE&#xff09;创始人、董事长…

MySQL的插入(DML)

1.给指定字段添加数据 这个就是&#xff0c;想插入所对应的字段&#xff0c;就插入所对应的数值。先把字段列出来&#xff0c;不一定是全部的字段&#xff0c; 然后插入想要的值&#xff0c;注意&#xff0c;只能插入一行。 INSERT INTO 表名 (字段1,字段2,.....) VALUES(值…

vue学习day08-v-model详解、sync修饰符、ref和$refs获取dom组件、Vue异步更新和$nextTick

25、v-model详解 &#xff08;1&#xff09;v-model原理 1&#xff09;原理: v-model本质上是一个语法糖&#xff0c;比如&#xff1a;在应用于输入框时&#xff0c;就是value属性与input事件的合写。 2&#xff09;作用 ①数据变&#xff0c;视图变 ②视图变&#xff0c…

网络协议 — Keepalived 高可用方案

目录 文章目录 目录Keepalived 是实现了 VRRP 协议的软件Keepalived 的软件架构VRRP StackCheckersKeepalived 的配置Global configurationvrrp_scriptVRRP Configurationvrrp synchroization groupvrrp instancevirtual ip addressesvirtual routesLVS Configurationvirtual_s…

Qt+MySQL实现社团管理系统

开发环境 ● Qt 5.14.1 ● Win10 ● Mysql 5.7.28 系统介绍 系统主要实现的功能如下图所示 社团管理系统主要包含了以下几个亮点功能 轮播图显示社团信息支持excel形式的导入导出学生信息权限控制&#xff08;管理员、超级管理员、用户&#xff09; 系统效果展示 登录界面…

Leetcode(经典题)day2

H指数 274. H 指数 - 力扣&#xff08;LeetCode&#xff09; 先对数组排序&#xff0c;然后从大的一头开始遍历&#xff0c;只要数组当前的数比现在的h指数大就给h指数1&#xff0c;直到数组当前的数比现在的h指数小的时候结束&#xff0c;这时h的值就是要返回的结果。 排序…

Python酷库之旅-第三方库Pandas(021)

目录 一、用法精讲 52、pandas.from_dummies函数 52-1、语法 52-2、参数 52-3、功能 52-4、返回值 52-5、说明 52-6、用法 52-6-1、数据准备 52-6-2、代码示例 52-6-3、结果输出 53、pandas.factorize函数 53-1、语法 53-2、参数 53-3、功能 53-4、返回值 53-…

用户登陆实现前后端JWT鉴权

目录 一、JWT介绍 二、前端配置 三、后端配置 四、实战 一、JWT介绍 1.1 什么是jwt JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在各方之间以安全的方式传输信息。JWT 是一种紧凑、自包含的信息载体&…

UML/SysML建模工具更新情况(2024年7月)(1)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 工具最新版本&#xff1a;Enterprise Architect 17.0 BETA 更新时间&#xff1a;2024年7月2日 工具简介 性价比很高&#xff0c;目前最流行的UML建模工具。还包含需求管理、项目估算…