ArrayList
ArrayList集合
ArrayList与数组的区别:
1. 数组和ArrayList的本质区别在于前者是类型安全的,而后者是类型不安全的.
2. ArrayList为了兼容所有类型对象,使用了Object数组,在使用元素的时候会有装箱和拆箱的操作,降低了程序的性能.
3. ArrayList会动态扩充容量,容量为原来的2倍.
4. ArrayList只有把元素添加进去之后才可以通过下标访问相应的元素.
5. 数组在创建的时候就已经确定了数据类型,并且它的长度是固定的,只能通过下标改变各个元素的值和访问.
如果已经知道数据的长度并且不需要频繁的做插入和删除操作,建议使用数组,反之亦然.
ArrayList泛型
ArrayList<数据类型/类名> 集合名 = new ArrayList<>();
<>尖括号里的是泛型String Integer Character Boolean等引用数据类型
如果不写泛型,那么集合里什么元素都能存储,list.add(1); list.add(“abc”);
都可以存储,这样是不安全。
例如:加上
案例一:
目标:学习遍历并删除元素的正确方案
需求
- 某个班级的考试在系统上进行,成绩大致为 0 ~ 100之间
- 现在需要先把成绩低于80分的数据去掉
分析:
- 1.定义ArrayList集合存储多名学员的成绩。
- 2.遍历集合每个元素,如果元素低于80分,去掉它。
案例一 代码:
public static void arrayListSeeAndDelete() {
//目标;学习遍历并删除原数的正确方案
// 1.创建一个ArrayList集合存储一个班级学生的成绩
ArrayList<Integer> scores = new ArrayList<>();
scores.add(98);
scores.add(77);
scores.add(66);
scores.add(89);
scores.add(79);
scores.add(50);
scores.add(100);
System.out.println(scores);
/*
方法一:
*/
// 2.把低于80分的成绩从集合中去掉
// scores = [98, 77, 66, 89, 79, 50, 100]
// scores = [98, 77, 66, 89, 79, 50, 100]
/* for (int i = 0; i < scores.size(); i++) {
int score = scores.get(i);
if (score < 80) {
scores.remove(i);
i--; //删除成功后,必须退一步才能保证后面不满足条件的元素不被跳过
}
}
System.out.println(scores);*/
/*
方法二:
倒着遍历再删除
*/
for (int i = scores.size() - 1; i >= 0; i--) {
int score = scores.get(i);
if (score < 80) {
scores.remove(i); // 可以避免跳过删除
}
}
}
案例二:
目标:理解ArrayList集合存储自定义类型的对象,并且对集合中对象进行遍历
需求
- 定义电影类
- 创建三个电影对象
- 创建一个电影类型的ArrayList集合存储三部电影对象
- 遍历电影类型中的每个电影对象,访问其信息并输出
案例二 代码Part Ⅰ:
电影类及其构造方法get/set方法。
public class ArrayListMovieShow {
//目标:理解ArrayList集合存储自定义类型的对象
// 1.定义电影类。 ArrayListMovieShow
private String name;
private double score;
private String actor;
public ArrayListMovieShow(String name, double score, String actor) {
this.name = name;
this.score = score;
this.actor = actor;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public String getActor() {
return actor;
}
public void setActor(String actor) {
this.actor = actor;
}
}
案例二 代码Part Ⅱ:
主函数部分:
public static void main(String[] args) {
// 2.创建三个电影类
ArrayListMovieShow m1 = new ArrayListMovieShow("《肖申克的救赎》", 9.8, "罗宾斯");
ArrayListMovieShow m2 = new ArrayListMovieShow("《霸王别姬》", 9.7, "张国荣、张丰毅");
ArrayListMovieShow m3 = new ArrayListMovieShow("《阿甘正传》", 9.6, "汤姆·汉克斯");
// 3.创建一个电影类型的ArrayList集合,存储三个电影对象
ArrayList<ArrayListMovieShow> movies = new ArrayList<>();
movies.add(m1);
movies.add(m2);
movies.add(m3);
System.out.println(movies); //输出三个电影对象的地址
// 4.遍历电影类型的集合中的每个电影对象。访问他的信息即可
for (int i = 0; i < movies.size(); i++) {
ArrayListMovieShow m = movies.get(i);
System.out.println("电影名:" + m.getName());
System.out.println("电影得分:" + m.getScore());
System.out.println("电影主演:" + m.getActor());
System.out.println("--------------------------------");
}
}
输出结果
[javaBase.practice.ArrayListMovieShow@1b6d3586, javaBase.practice.ArrayListMovieShow@4554617c, javaBase.practice.ArrayListMovieShow@74a14482]
电影名:《肖申克的救赎》
电影得分:9.8
电影主演:罗宾斯
--------------------------------
电影名:《霸王别姬》
电影得分:9.7
电影主演:张国荣、张丰毅
--------------------------------
电影名:《阿甘正传》
电影得分:9.6
电影主演:汤姆·汉克斯
--------------------------------
案例三
目标:实现ArrayList遍历,删除,存对象,搜索
需求
- 后台程序需要储存学生信息并展示,然后要按照学号搜索学生信息的功能
分析:
- 1.定义 ArrayListStudentSee 类,定义ArrayList集合储存学生对象信息并遍历展示出来。
- 2.提供一个方法,可以接受ArrayList集合,和要搜索的学号,返回搜索到的学生对象信息并展示,如果搜索不到,返回NULL。
- 3.使用死循环,让用户可以不停的搜索。
案例三 代码PartⅠ(ArrayListStudentSee类
):
public class ArrayListStudentSee {
private String studentNumber;
private String name;
private int age;
private String className;
public ArrayListStudentSee() {
}
public ArrayListStudentSee(String studentNumber, String name, int age, String className) {
this.studentNumber = studentNumber;
this.name = name;
this.age = age;
this.className = className;
}
public String getStudentNumber() {
return studentNumber;
}
public void setStudentNumber(String studentNumber) {
this.studentNumber = studentNumber;
}
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;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
}
案例三 代码:PartⅡ(为test方法调用getStudentById方法
得到返回值并输出查询结果)
public static void main(String[] args) {
test();
}
public static void test() {
// 1.定义学生类
// 2.创建集合存储学生对象,创建学生对象封装学生信息
ArrayList<ArrayListStudentSee> students = new ArrayList<>();
students.add(new ArrayListStudentSee("20180302", "叶孤城", 23, "护理一班"));
// ArrayListStudentSee student1 = new ArrayListStudentSee("20180302", "叶孤城", 23, "护理一班"); //上面的分解
// students.add(student1);
students.add(new ArrayListStudentSee("20180303", "东方不败", 22, "推拿二班"));
students.add(new ArrayListStudentSee("20180304", "西门吹雪", 27, "中医药四班"));
students.add(new ArrayListStudentSee("20180305", "梅超风", 24, "神经科二班"));
// 3.遍历这些学生信息展示
for (int i = 0; i < students.size(); i++) {
ArrayListStudentSee s = students.get(i);
System.out.println(s.getStudentNumber() + "\t" + s.getName() + "\t" + s.getAge() + "\t" + s.getClassName());
}
// 4.定义方法完成按照学好的收缩功能
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("请输入学号查询学生对象:");
String studentNumber = scanner.next();
// 5.调用方法查询
ArrayListStudentSee s = getStudentById(students, studentNumber);
// 6.判断s中是否存在学生对象地址
if (s == null) {
System.out.println("对不起,查无此人~~");
} else {
System.out.println("您所查询的学生信息如下:");
System.out.println(s.getStudentNumber() + "\t" + s.getName() + "\t" + s.getAge() + "\t" + s.getClassName());
}
}
}
/**
* 根据学生的学号查询学生对象返回
* @param student 存储全部学生对象的集合
* @param studyNumber 搜索的学生的学号
* @return 学生对象 | null
*/
public static ArrayListStudentSee getStudentById(ArrayList<ArrayListStudentSee> student, String studyNumber) { //根据学号查找学生信息 (学生类型的集合)
// 1.遍历全部学生对象
for (int i = 0; i < student.size(); i++) {
ArrayListStudentSee s = student.get(i);
// 2.询问当前遍历的这个学生对象的学号,是否是我们要找的学号
if (s.getStudentNumber().equals(studyNumber)) {
// 这个s代表的学生对象,就是我们要找的学号
return s;
}
}
//查无此人
return null;
}
案例来自B站黑马,如有错误请多多交流。
本文来自博客园,作者:Haziy,转载请注明原文链接:https://www.cnblogs.com/zhangyouren/p/16412012.html
本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。
博主的文章没有高度、深度和广度,只是凑字数。由于博主的水平不高,不足和错误之处在所难免,希望大家能够批评指出。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?