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

news2024/11/15 9:32:39

一、前言

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

 今天已经是学习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.coloradmin.cn/o/1925420.html

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

相关文章

怎么安装Manim库在Windows环境下的Jupyter Notebook上

Manim 是解释性数学视频的动画引擎。 您可以使用它来制作数学视频&#xff08;或其他字段&#xff09;。也许你们会在有有些平台上会看过特别好看的数学动画&#xff0c;例如 3Blue1Brown等。这些动画特别好看&#xff0c;还特别丝滑&#xff0c;基本找不到太大的毛病。 我当初…

BasicSR项目(通用图像超分、修复、增强工具库)介绍

项目地址&#xff1a;https://github.com/XPixelGroup/BasicSR 文档地址&#xff1a;https://github.com/XPixelGroup/BasicSR-docs/releases BasicSR 是一个开源项目&#xff0c;旨在提供一个方便易用的图像、视频的超分、复原、增强的工具箱。BasicSR 代码库从2018年4月20日…

【QT】Qt事件

目录 前置知识 事件概念 常见的事件描述 进入和离开事件 代码示例&#xff1a; 鼠标事件 鼠标点击事件 鼠标释放事件 鼠标双击事件 鼠标滚轮动作 键盘事件 定时器事件 开启定时器事件 窗口相关事件 窗口移动触发事件 窗口大小改变时触发的事件 扩展 前置知识…

知识改变命运 第七集(下):Java中数组的定义与使用

4. 数组练习 4.1 数组转字符串 import java.util.Arrays int[] arr {1,2,3,4,5,6}; String newArr Arrays.toString(arr); System.out.println(newArr); // 执行结果 [1, 2, 3, 4, 5, 6]使用这个方法后续打印数组就更方便一些. Java 中提供了 java.util.Arrays 包, 其中包含…

SwiftUI 截图(snapshot)视频画面的极简方法

功能需求 在 万物皆可截图:SwiftUI 中任意视图(包括List和ScrollView)截图的通用实现 这篇博文中,我们实现了在 SwiftUI 中截图几乎任何视图的功能,不幸的是它对视频截图却无能为力。不过别着急,我们还有妙招。 在上面的演示图片中,我们在 SwiftUI 中可以随心所欲的截图…

【ZooKeeper学习笔记】

1. ZooKeeper基本概念 Zookeeper官网&#xff1a;https://zookeeper.apache.org/index.html Zookeeper是Apache Hadoop项目中的一个子项目&#xff0c;是一个树形目录服务Zookeeper翻译过来就是动物园管理员&#xff0c;用来管理Hadoop&#xff08;大象&#xff09;、Hive&…

浪潮信息F-OCC算法夺冠,自动驾驶感知技术再创新高

浪潮信息&#xff0c;作为行业领先的AI技术提供商&#xff0c;其AI团队在近期举办的全球权威CVPR 2024自动驾驶国际挑战赛(Autonomous Grand Challenge)中大放异彩&#xff0c;凭借“F-OCC”算法模型以48.9%的卓越成绩&#xff0c;一举夺得占据栅格和运动估计(Occupancy & …

前端Vue组件化实践:打造仿京东天猫商品属性选择器组件

在前端开发领域&#xff0c;随着业务需求的日益复杂和技术的不断进步&#xff0c;传统的整体式应用开发模式已逐渐显得捉襟见肘。面对日益庞大的系统&#xff0c;每次微小的功能修改或增加都可能导致整个逻辑结构的重构&#xff0c;形成牵一发而动全身的困境。为了解决这一问题…

基于Node.js将个人网站部署到ECS

基于Node.js将个人网站部署到云端ECS 一、如何购买ECS以及如何使用学生认证优惠&#xff1f;1.进入阿里云网站&#xff0c;进行学生认证2.购买学生优惠&#xff0c;免费试用一个月3.重置个人密码 二、服务器的配置以及与宝塔面板的链接1.个人电脑打开终端&#xff08;winR->…

探索性数据分析:使用Python与Pandas库实现数据洞察

探索性数据分析&#xff1a;使用Python与Pandas库实现数据洞察 引言 在当今数据驱动的时代&#xff0c;数据分析已成为决策制定、策略规划和业务优化的关键环节。无论是商业智能、金融分析还是市场研究&#xff0c;数据分析都扮演着至关重要的角色。Pandas库作为Python生态系统…

一文SpringCloud

Springcloud 什么是Springcloud&#xff1f; 官网&#xff1a;Spring Cloud Data Flow Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控…

Flat Ads:金融APP海外广告投放素材的优化指南

在当今全球化的数字营销环境中,金融APP的海外营销推广已成为众多金融机构与开发者最为关注的环节之一。面对不同地域、文化及用户习惯的挑战,如何优化广告素材,以吸引目标受众的注意并促成有效转化,成为了广告主们亟待解决的问题。 作为领先的全球化营销推广平台,Flat Ads凭借…

树莓派PICO使用INA226测量电流和总线电压(3)

上一篇文章我们讲了如何测试电流&#xff0c;但是INA226有一个非常典型的问题&#xff0c;那就是误差比较大&#xff0c;因为采样电阻非常小&#xff0c;我的开发板用的是100mΩ的采样电阻&#xff0c;在设定中我也用的是这个采样电阻值&#xff0c;但事实上&#xff0c;测试得…

文件内容查阅

cat concatenate files and print on the standard output Linux中一个最简单的且最常用的命令是cat命令。其功能是在终端设备上显示文件内容。 cat命令-n选项用于显示行号。 tac concatenate and print files in reverse tac命令的功能是用于反向显示文件内容&#xff0c;即…

【Qt 基础】绘图

画笔 QPen pen; pen.setWidth(3); // 线条宽度 pen.setColor(Qt::red);// 画笔颜色 pen.setStyle(Qt::DashLine);// 线条样式 pen.setCapStyle(Qt::RoundCap);// 线端样式 pen.setJoinStyle(Qt::BevelJoin);// 连接样式 painter.setPen(pen);线条 线端 连接 画刷 QBrush bru…

css设置弹性flex后,如果设置100vh高度不撑满的原因

问题 父元素设置height为100%&#xff0c;有两个子元素&#xff0c;第一个设置height:100vh&#xff0c;第二个设置flex:1&#xff0c;此时第一个高度无法撑满盒子 原因解决方式 当父元素设置display为flex,第一个div设置高度64px,剩一个div设置高度为flex&#xff1a;1,这时…

数据处理-Matplotlib 绘图展示

文章目录 1. Matplotlib 简介2. 安装3. Matplotlib Pyplot4. 绘制图表1. 折线图2. 散点图3. 柱状图4. 饼图5. 直方图 5. 中文显示 1. Matplotlib 简介 Matplotlib 是 Python 的绘图库&#xff0c;它能让使用者很轻松地将数据图形化&#xff0c;并且提供多样化的输出格式。 Ma…

Qt项目中添加自定义文件夹,进行整理归类

Qt项目中添加文件夹进行归类 1、在windows的工程目录下创建一个文件夹&#xff0c;如widgets 2、将.h 、.cpp、.ui文件拷贝到windows该文件夹widgets 3、在qt工程中&#xff0c;根目录右键&#xff0c;选择添加现有文件&#xff0c;批量选择 .h 、.cpp、.ui文件之后&#xf…

初识影刀:EXCEL根据部门筛选低值易耗品

第一次知道这个办公自动化的软件还是在招聘网站上&#xff0c;了解之后发现对于办公中重复性的工作还是挺有帮助的&#xff0c;特别是那些操作非EXCEL的重复性工作&#xff0c;当然用在EXCEL上更加方便&#xff0c;有些操作比写VBA便捷。 下面就是一个了解基本操作后&#xff…

开发总结 - H5/web C端评论区开发逻辑

1. 背景 平时做的系统都是偏公司业务的系统&#xff0c;这次开发了一个用户评论的功能&#xff0c;同时开发了web版和H5版本的&#xff0c;因为没有做过这种C端的常用的功能&#xff0c;所以记录一下此次的开发&#xff0c;从参考友商设计到独立思考业务之间的区别再到实际开发…