一.集合概述
数组的特点:
- 数组定义完成启动后,类型确定、长度固定。
- 在个数不能确定,且要进行增删数据操作的时候,数组是不太适合的。
集合的特点:
- 集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。
- 集合非常适合做元素个数不确定,且要进行增删操作的业务场景。
- 集合还提供了许多丰富的API,而数组的功能很单一。
二.ArrayList集合入门
1.ArrayList集合
- ArrayList集合是集合中的一种,它支持索引。
package com.api.arraylist;
import java.util.ArrayList;
/**
目标:创建ArrayList对象,代表集合容器,往里面添加元素。
*/
public class ArrayListDemo1 {
public static void main(String[] args) {
// 1.创建ArrayList集合的对象代表集合容器
ArrayList list = new ArrayList();
// 2.添加数据 ArrayList集合添加元素一般是不会失败的 public boolean add(E e)
// ArrayList集合默认存储任意类型的元素
list.add("Java");
list.add("MySQl");
list.add("SSM");
list.add("SSM");
list.add(23);
list.add(56.78);
System.out.println(list.add('中')); // true
//根据变量的地址去找这个内容,变量里面存的其实还是地址
System.out.println(list); //[Java, MySQl, SSM, SSM, 23, 56.78, 中] 根据变量的地址去找这个内容
// 3.给指定索引位置处插入元素 public void add(int index, E element) 方法重载
list.add(2,"javaweb");
System.out.println(list);// [Java, MySQl, javaweb, SSM, SSM, 23, 56.78, 中]
}
}
2.ArrayList对于泛型的支持
- ArrayList<E>:其实就是一个泛型类,可以在编译阶段约束集合对象只能操作某种数据结构。
- ArrayList<String>:此集合只能操作字符串类型的元素。
- ArrayList<Integer>:此集合只能操作整数类型的元素。
- 泛型只能支持引用数据类型,不能支持基本数据类型。
- 使用泛型:<数据类型>
- 创建集合对象都应该使用泛型
package com.api.arraylist;
import java.util.ArrayList;
/**
目标:能够使用泛型约束ArrayList集合操作的数据类型
*/
public class ArrayListDemo2 {
public static void main(String[] args) {
// Object代表一切类型 泛型相当于是一个标记 Integer相当于int的引用类型 使用泛型来定义集合是一种规范和标准
// 使用泛型来定义集合是一种规范和标准 不是所有的类都支持泛型
// ArrayList<String> list = new ArrayList<String>();
ArrayList<String> list = new ArrayList<>(); // 从JDK1.7开始,泛型后面的类型申明可以不写
list.add("Java");
list.add("MySQL");
// list.add(23);
// list.add(78.89);
//Integer相当于int的引用类型
ArrayList<Integer> list2 = new ArrayList<>();
list2.add(23);
list2.add(67);
// list2.add("Java");
//Object代表一切类型
ArrayList<Object> list3 = new ArrayList<>();
}
}
3.ArrayList集合常用方法
package com.api.arraylist;
import java.util.ArrayList;
/**
目标:掌握ArrayList集合的常用API
*/
public class ArrayListDemo3 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("Java");
list.add("MySQL");
list.add("MyBatis");
list.add("HTML");
// 1.public E get(int index):获取某个索引位置处的元素值
String e = list.get(3);
System.out.println(e); //MyBatis
// 2.public int size():获取集合的大小(元素个数)
System.out.println(list.size()); // 5
// 3.完成集合的遍历
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// 4.public E remove(int index):删除某个索引位置处的元素值,并返回被删除的元素值
System.out.println(list); // [Java, Java, MySQL, MyBatis, HTML]
String e2 = list.remove(2);
System.out.println(e2); // MySQL
System.out.println(list); // [Java, Java, MyBatis, HTML]
// 5.public boolean remove(Object o):直接删除元素值,删除成功返回true,删除失败返回false
// 只会默认删除第一次出现的元素值,后面的不删除(针对元素出现重复的情况)
System.out.println(list.remove("Java")); //默认删除前面的Java
System.out.println(list); // [Java, MyBatis, HTML]
// 6.public E set(int index,E element):修改某个索引位置处的元素值 左侧返回修改前的值
String e3 = list.set(2,"MySQL");
System.out.println(e3); // HTML
System.out.println(list); // [Java, MyBatis, MySQL]
}
}
4.ArrayList集合案例
案例一:遍历并删除元素
需求:
- 某个班级的考试在系统上面进行。成绩大致为:98,77,66,89,79,50,100
- 现在需要先把成绩低于80分以下的数据去掉
分析:
- 定义ArrayList集合存储多名学员的成绩。
- 遍历集合每个元素,如果元素值低于80分,去掉它。
import java.util.ArrayList;
public class ArrayListDemo1 {
public static void main(String[] args) {
// 目标:学习集合遍历并删除元素的正确操作
// 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); // [98, 77, 66, 89, 79, 50, 100]
// [98, 77, 66, 89, 79, 50, 100]
// [98, 66, 89, 50, 100]
// i
// 2.遍历集合中的元素,并删除元素值低于80分的
// 有毛病的代码
// for(int i = 0;i < scores.size();i++){
// int score = scores.get(i);
// if(score < 80){
// scores.remove(i);
// }
// }
// System.out.println(scores); // [98, 66, 89, 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); // [98, 89, 100]
// 方案二:倒着遍历再删除元素,从后往前遍历,这样可以防止跳位
for(int i = scores.size() - 1;i >= 0;i--){
int score = scores.get(i);
if(score < 80){
scores.remove(score);
}
}
System.out.println(scores); // [98, 89, 100]
}
}
案例二:存储自定义类型的对象
需求:某影院系统需要在后台存储上述三部电影,然后依次展示出来。
分析:
- 定义一个电影类,定义一个集合存储电影对象
- 创建3个电影对象,封装相关数据,把这三个对象存入到集合中去
- 遍历集合中的3个对象,输出其相关信息

//定义电影类
public class Movie {
// 1.成员变量私有化
private String name; // 名字
private double score; // 评分
private String actor; // 演员
// 2.提供一个无参构造器
public Movie(){
}
// 有参构造器
public Movie(String name,double score,String actor){
this.name = name;
this.score = score;
this.actor = actor;
}
// 3.提供成员变量对应的Setter,Getter方法
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setScore(double score){
this.score = score;
}
public double getScore(){
return score;
}
public void setActor(String actor){
this.actor = actor;
}
public String getActor(){
return actor;
}
}
import java.util.ArrayList;
public class ArrayListDemo {
public static void main(String[] args) {
// 目标:集合存储自定义类型的对象
// 1.定义一个电影类,定义一个集合存储电影对象
ArrayList<Movie> movies = new ArrayList<>();
// 2.创建电影对象封装电影数据,把电影对象添加到集合中去
movies.add(new Movie("《肖生客的救赎》",9.7,"罗宾斯"));
movies.add(new Movie("《霸王别姬》",9.6,"张国荣"));
movies.add(new Movie("《阿甘正传》",9.5,"汤姆汉克斯"));
System.out.println(movies); // 集合存储的自定义类型,它存储的并不是对象本身,而是存储的是对象的地址
// 3.遍历集合中的电影对象并展示出来
for(int i = 0;i < movies.size();i++){
Movie movie = movies.get(i);
System.out.println("片名" + movie.getName());
System.out.println("评分:" + movie.getScore());
System.out.println("主演:" + movie.getActor());
System.out.println("----------------------------");
}
}
}

ArrayList集合案例三:元素搜索

需求:
- 后台程序需要存储如上学生信息并展示,然后要提供按照学号搜索学生信息的功能。
分析:
- 定义Student类,定义ArrayList集合存储如上学生信息,并遍历展示出来。
- 提供一个方法,同时可以接收ArrayList集合,和要搜索的学号,返回搜索到的学生信息,并展示。
- 使用死循环,让用户可以不停的搜索。
package com.api.arraylist;
public class Student {
private String studyId; //学号
private String name; // 姓名
private int age; // 年龄
private String className; // 班级
public Student() {
}
public Student(String studyId, String name, int age, String className) {
this.studyId = studyId;
this.name = name;
this.age = age;
this.className = className;
}
public String getStudyId() {
return studyId;
}
public void setStudyId(String studyId) {
this.studyId = studyId;
}
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;
}
}
package com.api.arraylist;
import java.util.ArrayList;
import java.util.Scanner;
/**
案例:学生信息系统:展示数据,并按照学号完成搜索
学生类信息(学号, 姓名 , 年龄 , 班级)
测试数据:
"20180302", "叶孤城" ,23 , "护理一班"
"20180303", "东方不败",23 , "推拿二班"
"20180304", "西门吹雪" ,26 , "中医药四班"
"20180305", "梅超风" , 26, "神经科2班"
*/
public class ArrayListTest6 {
public static void main(String[] args) {
// 1.定义一个学生类,后期用于创建对象封装学生数据
// 2.定义一个集合对象用于装学生对象
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("20180302", "叶孤城" ,23 , "护理一班"));
students.add(new Student( "20180303", "东方不败",23 , "推拿二班"));
students.add(new Student( "20180304", "西门吹雪" ,26 , "中医药四班"));
students.add(new Student( "20180305", "梅超风" , 26, "神经科2班"));
System.out.println("学号\t\t\t\t姓名\t\t\t年龄\t\t班级");
// 3.遍历集合中的每个学生对象并展示其数据
for(int i = 0;i < students.size(); i++){
Student s = students.get(i);
System.out.println(s.getStudyId() + "\t\t" + s.getName() + "\t\t" + s.getAge() + "\t\t" + s.getClassName());
}
// 4.让用户不断的输入学号,可以搜索出该学生对象信息并展示出来(独立成方法)
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请您输入要查询的学号:");
String id = sc.next();
Student s = getStudentByStudyId(students,id);
// 判断学号是否存在
if(s == null){
System.out.println("查无此人!");
}else{
// 找到了该学生对象了,信息如下
System.out.println("您要查询的学生信息如下:");
System.out.println("学号\t\t\t\t姓名\t\t\t年龄\t\t班级");
System.out.println(s.getStudyId() + "\t\t" + s.getName() + "\t\t" + s.getAge() + "\t\t" + s.getClassName());
}
}
}
/**
根据学号,去集合中找出学生对象并返回
*/
public static Student getStudentByStudyId(ArrayList<Student> students,String studyId){
for(int i = 0;i < students.size();i++){
Student s = students.get(i);
if(s.getStudyId().equals(studyId)){
return s;
}
}
return null; // 查无此学号
}
}
