ArrayList
对象数组
数组:数组是容器,可以存放多个类型一致的数据。数组一旦定义长度不能变化。
特点:元素类型相同,长度不可变
。
定义一个数组:类型
数组存储类型[] 数组名;
数组存储类型 数组名[];
类型可以是任何的类型:基本数据类型,引用数据类型
如果是我们自己定义的类型当作数组的类型:例如Student类型,
Student[] students;
Student students[];
students = new Student[3];
Student类型定义的数组,元素存储的一定是Student类型的数据。肯定是Student的对象。
/*
定义学生类,创建三个学生对象,放到学生类的数组中
*/
public class Demo01 {
public static void main(String[] args) {
//创建三个学生对象
Student s1 = new Student("迪丽热巴", 18);
Student s2 = new Student("马儿扎哈", 20);
Student s3 = new Student("古力娜扎", 17);
//放到学生类的数组中
Student[] students = new Student[3];
//给元素赋值
students[0] = s1;
students[1] = s2;
students[2] = s3;
//遍历数组打印元素的属性值
for (int i = 0; i < students.length; i++) {
Student stu = students[i];
//System.out.println("stu = " + stu);//打印地址
System.out.println(stu.getName() + ":" + stu.getAge()); //获取属性值打印
}
//数组弊端:长度固定,如果有多的数据不能存储
// Student s4 = new Student("蔡徐坤", 20);
// students[3] = s4;
//集合:也是容器,跟数组不一样的是,长度可变了。
}
}
ArrayList的概述及使用步骤
ArrayList是一个集合:集合也是容器,可以存储多个数据,长度可变化
ArrayList使用步骤:
希望集合创建后只能存储某一特定类型的数据。需要借助泛型。
ArrayList:中E就是泛型,泛指任意的引用数据类型。
E的作用:是为了指定集合所能存储的类型,如果要存储某种类型的数据时,只要将E换成这个类型即可。
【例如】
要定义一个集合用来存储字符串数据【String】 E–>String
ArrayList<String> list = new ArrayList<>();
要定义个集合用来存储学生对象数据【Student 】 E–>Student
ArrayList<Student> list = new ArrayList<>();
对象调用方法
ArrayList<String> list = new ArrayList<>();
//E -->String 所有改类方法中的Edouard变成 String
list.add("Hello");
ArrayList常用方法
boolean add(E e)将指定的元素添加到此列表的尾部。
E remove(int index) 移除此列表中指定位置上的元素。
boolean remove(Object o) 除此列表中首次出现的指定元素(如果存在)。
E set(int index, E element) 用指定的元素替代此列表中指定位置上的元素。
E get(int index) 返回此列表中指定位置上的元素。
void clear() 移除此集合中的所有元素。
boolean contains(Object o) 如果此列表中包含指定的元素,则返回 true。
boolean isEmpty() 如果此列表中没有元素,则返回 true
int size() 返回此列表中的元素数。
String,StringBuilder,ArrayList,基本数据类型,不打印地址,打印内容!
当ArrayList中存储基本数据类型,字符串类型的数据时,能够直接打印内容。
原因:
String,StringBuilder,ArrayList 继承Object类,重写了里面的toString方法。
/*
【增删改查】
boolean add(E e)将指定的元素添加到此列表的尾部。
E remove(int index) 移除此列表中指定位置上的元素。
boolean remove(Object o) 除此列表中首次出现的指定元素(如果存在)。
E set(int index, E element) 用指定的元素替代此列表中指定位置上的元素。
E get(int index) 返回此列表中指定位置上的元素。
void clear() 移除此集合中的所有元素。
boolean contains(Object o) 如果此列表中包含指定的元素,则返回 true。
boolean isEmpty() 如果此列表中没有元素,则返回 true
int size() 返回此列表中的元素数。
String,StringBuilder,ArrayList,基本数据类型
当ArrayList中存储基本数据类型,字符串类型的数据时,能够直接打印内容。
*/
public class Demo01 {
public static void main(String[] args) {
//创建一个存储字符串数据的集合
ArrayList<String> list = new ArrayList<>();
//boolean add(E e)将指定的元素添加到此列表的尾部。
//E->String: 创建对象时指定的
list.add("唐僧");//0
list.add("悟空");//1
list.add("八戒");//2
list.add("沙僧");//3
list.add("小白龙");//4
System.out.println(list.size() + ":" + list); //5:[唐僧, 悟空, 八戒, 沙僧, 小白龙]
//集合的元素也是很有索引的,索引范围数组一样[0,size-1]
//E remove(int index) 移除此列表中指定位置上的元素。
String remove = list.remove(4);//小白龙
System.out.println("remove = " + remove);//小白龙
System.out.println(list.size() + ":" + list); //4:[唐僧, 悟空, 八戒, 沙僧]
//boolean remove(Object o) 除此列表中首次出现的指定元素(如果存在)。
//删除八戒
boolean remove1 = list.remove("八戒");
System.out.println("remove1 = " + remove1);//true
System.out.println(list.remove("白骨精"));//false
System.out.println(list.size() + ":" + list); //3:[唐僧, 悟空, 沙僧]
//E set(int index, E element) 用指定的元素替代此列表中指定位置上的元素。
//把“悟空"换成"斗战胜佛"
String set = list.set(1, "斗战胜佛");
System.out.println("set = " + set);//悟空
System.out.println(list.size() + ":" + list); //3:[唐僧, 斗战胜佛, 沙僧]
//E get(int index) 返回此列表中指定位置上的元素。
//获取沙僧,索引在2位置
String get = list.get(2);
System.out.println("get = " + get);//沙僧
//void clear() 移除此集合中的所有元素。
// list.clear();
// System.out.println(list.size() + ":" + list); //0:[]
//boolean contains(Object o) 如果此列表中包含指定的元素,则返回 true。
//判断是否存在"沙僧"
System.out.println(list.contains("沙僧"));//true
//判断是否存在"小白龙"
System.out.println(list.contains("小白龙"));//false
System.out.println("========");
//boolean isEmpty() 如果此列表中没有元素,则返回 true
System.out.println(list.isEmpty());//false
list.clear();
System.out.println(list.isEmpty());//true
//int size() 返回此列表中的元素数。
}
}
ArrayList遍历
集合遍历:访问集合中元素
小技巧:
【集合名.fori】:自增遍历
//【集合名.fori】:自增遍历
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
不需要:list.size().fori
【集合名.forr】:自减遍历
//【集合名.forr】:自减遍历
for (int i = list.size() - 1; i >= 0; i--) {
System.out.println(list.get(i));
}
【注意】list.size().forr: int i = list.size(); i > 0,list.size()不会减1,i不会等于0
/*
遍历打印集合
*/
public class Demo02 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("唐僧");//0
list.add("悟空");//1
list.add("八戒");//2
list.add("沙僧");//3
list.add("小白龙");//4
int size = list.size();
for (int i = 0; i < size; i++) {
System.out.println(list.get(i));
}
System.out.println("=====");
//小技巧:
//【集合名.fori】:自增遍历
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("=====");
//【集合名.forr】:自减遍历
for (int i = list.size() - 1; i >= 0; i--) {
System.out.println(list.get(i));
}
}
}
ArrayList存储基本数据类型
如何存储基本数据类型:
1)集合中的泛型E, 用来限定集合能够存储的类型。类型只能是引用数据类型。
如果要存储基本数据类型,那么我们需要将基本数据类型转化为引用数据类型。
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
基本数据类型 包装类型
基本数据类型和包装类型之间可以自动完成转化。
自动装箱:基本数据类型自动转化为包装类型
自动拆箱:包装类型自动转化为基本数据类型
Ctrl+Shift+U:大小写转化
public class Demo01 {
public static void main(String[] args) {
//ArrayList<int> list = new ArrayList<int>();
//定义集合存储int类型的数据。
ArrayList<Integer> list = new ArrayList<>();
list.add(100); //自动装箱:基本数据类型自动转化为包装类型
list.add(200);
System.out.println("list = " + list);
}
}
ArrayList练习:集合添加字符串并遍历
/*
创建一个存储字符串的集合,存储3个字符串元素,使用程序实现在控制台遍历该集合
*/
public class Demo01 {
public static void main(String[] args) {
//创建一个存储字符串的集合,存储3个字符串元素
ArrayList<String> list = new ArrayList<>();
list.add("Hello");
list.add("World");
list.add("Java");
for (int i = 0; i < list.size(); i++) {
//get
String s = list.get(i);
System.out.println("s = " + s);
}
}
}
ArrayList练习:对象添加到集合
/*
创建一个存储学生对象的集合,存储3个学生对象,
使用程序实现在控制台遍历该集合打印对象属性值
*/
public class Demo02 {
public static void main(String[] args) {
//创建集合存储学生对象
ArrayList<Student> list = new ArrayList<>();
//创建三个学生对象
Student s1 = new Student("迪丽热巴", 18);
Student s2 = new Student("马儿扎哈", 20);
Student s3 = new Student("古力娜扎", 17);
//把学生对象放到集合中
list.add(s1);
list.add(s2);
list.add(s3);
//遍历集合,打印学生属性值
for (int i = 0; i < list.size(); i++) {
Student s = list.get(i);
System.out.println(s.getName()+":"+s.getAge());
}
}
}
ArrayList练习:ArrayList存储学生对象并遍历升级版
/*
创建一个存储学生对象的集合,存储3个学生对象,
使用程序实现在控制台遍历该集合打印对象属性值
升级:学生的姓名和年龄要键盘录入
*/
public class Demo03 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//创建集合存储学生对象
ArrayList<Student> list = new ArrayList<>();
//创建三个学生对象
//Student s1 = new Student("迪丽热巴", 18);
//Student s2 = new Student("马儿扎哈", 20);
//Student s3 = new Student("古力娜扎", 17);
//把学生对象放到集合中
//list.add(s1);
//list.add(s2);
//list.add(s3);
//通过键盘输入来定义对象内容 【升级】
for (int i = 0; i < 3; i++) { //3次循环
System.out.println("请输入名字");
String name = sc.next();
System.out.println("请输入年龄");
int age = sc.nextInt();
Student stu = new Student(name, age); //创建对象,name,age 数据来自键盘录入
list.add(stu); //添加对象到集合
}
//遍历集合,打印学生属性值
for (int i = 0; i < list.size(); i++) {
Student s = list.get(i);
System.out.println(s.getName()+":"+s.getAge());
}
}
}
ArrayList练习:ArrayList类型作为参数
/*
定义以指定格式打印集合的方法(ArrayList类型作为参数),
使用[]扩起集合,使用“, ”分隔每个元素。格式参照 [元素, 元素, 元素]。
*/
public class Demo04 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("AAA");
list.add("AAA");
list.add("AAA");
list.add("AAA");
list.add("AAA");
printArray(list); //调用方法执行
}
public static void printArray(ArrayList<String> list) {
//使用[]扩起集合,使用“, ”分隔每个元素。格式参照 [元素, 元素, 元素]。
System.out.print("[");
//遍历集合打印元素
for (int i = 0; i < list.size(); i++) {
if (i == list.size() - 1) {
//是最后一个元素: 元素]
System.out.println(list.get(i)+"]");
} else {
//不是最后一个元素: 元素,
System.out.print(list.get(i)+", ");
}
}
}
}
ArrayList练习:ArrayList类型作为返回值
/*
定义一个方法,返回一个装有10个[20,50]之间随机数的集合,在mian方法中调用并遍历输出元素
*/
public class Demo05 {
public static void main(String[] args) {
//4:调用方法得到了集合
ArrayList<Integer> nums = getNums();
//5:遍历输出集合中的随机数
for (int i = 0; i < nums.size(); i++) {
System.out.println(nums.get(i));
}
}
public static ArrayList<Integer> getNums() {
//1:创建存储随机数的集合
ArrayList<Integer> list = new ArrayList<>();
//2:创建Random对象生成随机数:10个[20,50]
Random rd = new Random();
//借助10次循环生成随机数,放到集合
for (int i = 0; i < 10; i++) {
//[20,50] = [0,30]+20
int num = rd.nextInt(31) + 20;
list.add(num);
}
//3:返回集合对象
return list;
}
}
学生管理系统
- 1.欢迎界面
/*
* 1.欢迎界面
* 2.查看学生
* 3.添加学生
* 4.删除学生
* 5.修改学生
* 6.退出系统
* 7.其他提醒
* */
public class ManageStudent {
public static void main(String[] args) {
while (true) {
System.out.println("====欢迎来到学生管理系统====");
System.out.println("我们有如下功能:");
System.out.println("输入1 查看所有学生");
System.out.println("输入2 添加学生");
System.out.println("输入3 删除学生");
System.out.println("输入4 修改学生");
System.out.println("输入5 退出");
System.out.println("请输入你的选择:");
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
switch (choice) {
case 1:
System.out.println("查看所有学生");
break;
case 2:
System.out.println("添加学生");
break;
case 3:
System.out.println("删除学生");
break;
case 4:
System.out.println("修改学生");
break;
case 5:
System.out.println("退出");
break;
default:
System.out.println("没有这个功能!敬请期待!!!");
}
}
}
}
- 2.查看学生
/*
查看学生信息
Ctrl+Alt+M:抽取方法
*/
private static void lookStudents(ArrayList<Student> students) {
if (students.isEmpty()) {
System.out.println("没有学生信息,请录入学生信息!");
return;//结束方法
}
System.out.println("学号\t姓名\t年龄\t居住地");
//遍历学生集合,打印学生属性值
for (int i = 0; i < students.size(); i++) {
Student stu1 = students.get(i);
System.out.println(stu1.getId() + "\t" + stu1.getName() + "\t" + stu1.getAge() + "\t" + stu1.getAddress());
}
}
- 3.添加学生
private static void addStudent(ArrayList<Student> students) {
//键盘输入学生信息
Scanner sc = new Scanner(System.in);
String id;
while (true) {
System.out.println("请输入学生学号:");
id = sc.next();
//判断输入的学号在集合中是否存在有相同学号的学生
//设计一个方法:判断学号是否存在,如果存在返回索引,否则索引为-1
int index = findStudent(id, students);
if (index == -1) {
break;
} else {
System.out.println("学号已存在,请重新输入");
}
}
System.out.println("请输入学生姓名:");
String name = sc.next();
System.out.println("请输入学生年龄:");
int age = sc.nextInt();
System.out.println("请输入学生地址:");
String address = sc.next();
//构建学生对象
Student stu1 = new Student(id,name,age,address);
//添加到集合
students.add(stu1);
//提示录入成功
System.out.println("恭喜您,添加学生成功!!");
}
//查找学号为id的学生索引,如果不存在返回-1,存在返回实际的索引
private static int findStudent(String id, ArrayList<Student> students) {
//遍历集合,获取学生对象的学号,和参数id比较
for (int i = 0; i < students.size(); i++) {
Student s = students.get(i);
if (s.getId().equals(id)) {
//找到了一个学号相同的学生,返回索引
//如果相同返回索引
return i;
}
}
//没有找到相同学号的学生对象,集合中没有这个学号
return -1;
}
- 4.删除学生
private static void removeSutdent(ArrayList<Student> students) {
//1:键盘输入一个学号
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要删除学生的学号:");
String id = sc.next();
//2:找到学号对应的索引进行删除,如果存在删除,不存在不用删除
int index = findStudentById(id, students);
if (index == -1) {
System.out.println("没有您要删除的学生!!");
} else {
students.remove(index);//删除学生
System.out.println("恭喜,删除成功!!");
}
}
- 5.修改学生
//更新学生信息
private static void updateStudent(ArrayList<Student> students) {
//1:键盘输入一个需要修改学生的学号
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要修改学生的学号:");
String id = sc.next();
//2:获取学号对应在集合中学生的索引
int index = findStudentById(id, students);
if (index == -1) {
System.out.println("没有找到您要修改的学生信息!!");
} else {
//3:通过索引获取要修改信息的学生
Student stu1 = students.get(index);//就是要修改的对象
System.out.println("请输入学生姓名:");
String name = sc.next();
System.out.println("请输入学生年龄:");
int age = sc.nextInt();
System.out.println("请输入学生地址:");
String address = sc.next();
//更新信息
stu1.setName(name);
stu1.setAge(age);
stu1.setAddress(address);
//更新回到集合
students.set(index, stu1);
System.out.println("恭喜!!修改信息成功!!");
}
}
- 6.退出系统
case 5:
//System.out.println("退出");
System.out.println("欢迎下次光临!!Bye!!");
System.exit(0); //0表示正常退出,JVM
break;
- 7.其他提醒
default:
System.out.println("没有这个功能,敬请期待!!");
break;
学生管理系统【完整版】
package com.com.arraylist.学生管理系统;
public class Student {
private String id;
private String name;
private int age;
private String address;
public Student() {
}
public Student(String id, String name, int age, String address) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
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 getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
package com.com.arraylist.学生管理系统;
import java.util.ArrayList;
import java.util.Scanner;
/*
* 1.欢迎界面
* 2.查看学生
* 3.添加学生
* 4.删除学生
* 5.修改学生
* 6.退出系统
* 7.其他提醒
* */
public class ManageStudent {
public static void main(String[] args) {
ArrayList<Student> students = new ArrayList<>();
Student stu1 = new Student("1","张三",18,"上海");
Student stu2 = new Student("2","李四",18,"北京");
students.add(stu1);
students.add(stu2);
while (true) {
System.out.println("====欢迎来到学生管理系统====");
System.out.println("我们有如下功能:");
System.out.println("输入1 查看所有学生");
System.out.println("输入2 添加学生");
System.out.println("输入3 删除学生");
System.out.println("输入4 修改学生");
System.out.println("输入5 退出");
System.out.println("请输入你的选择:");
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
switch (choice) {
case 1:
// System.out.println("查看所有学生");
queryStudents(students);
break;
case 2:
// System.out.println("添加学生");
addStudent(students);
break;
case 3:
// System.out.println("删除学生");
removeStudent(students);
break;
case 4:
// System.out.println("修改学生");
updateStudent(students);
break;
case 5:
// System.out.println("退出");
System.out.println("欢迎下次光临!!!");
System.exit(0); // 0表示正常退出JVM
break;
default:
System.out.println("没有这个功能!敬请期待!!!");
}
}
}
/**
* 修改学生
* @param students
*/
private static void updateStudent(ArrayList<Student> students) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您要修改学生的学号:");
String id = scanner.next();
int index = findStudentById(id, students);
if (index == -1) {
System.out.println("要修改的学生信息不存在!!!");
}else {
Student student = students.get(index);
Scanner scanner1 = new Scanner(System.in);
System.out.println("请输入学生姓名:");
String name = scanner1.next();
System.out.println("请输入学生年龄:");
int age = scanner1.nextInt();
System.out.println("请输入学生地址:");
String address = scanner1.next();
student.setName(name);
student.setAge(age);
student.setAddress(address);
// 不需要设置回去,因为Student student = students.get(index)获取到的是地址
// 修改地址里的内容,集合里对应的内容也会发生改变
// 为了便于理解【将修改的内容更新回到集合】
students.set(index,student);
System.out.println("修改成功!!!");
}
}
/** 删除学生
* @param students
*/
private static void removeStudent(ArrayList<Student> students) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您要删除学生的学号:");
String id = scanner.next();
int index = findStudentById(id, students);
if (index == -1) {
System.out.println("要删除的学生不存在!!!");
}else {
students.remove(index);
System.out.println("删除成功!!!");
}
}
/** 添加学生
* @param students
*/
private static void addStudent(ArrayList<Student> students) {
Scanner scanner = new Scanner(System.in);
String id;
while (true) {
System.out.println("请输入学生学号:");
id = scanner.next();
int index = findStudentById(id,students);
if (index == -1) {
break;
}else {
System.out.println("学号已存在!请重新输入!!!");
}
}
System.out.println("请输入学生姓名:");
String name = scanner.next();
System.out.println("请输入学生年龄:");
int age = scanner.nextInt();
System.out.println("请输入学生地址:");
String address = scanner.next();
Student student = new Student(id, name, age, address);
students.add(student);
System.out.println("添加学生成功!!!");
}
/** 查找学号为id的学生的索引,不存在返回-1,存在返回实际的索引
* @param id
* @param students
* @return
*/
private static int findStudentById(String id, ArrayList<Student> students) {
for (int i = 0; i < students.size(); i++) {
Student student = students.get(i);
if (student.getId().equals(id)) {
return i;
}
}
return -1;
}
/** 查看学生信息
* @param students
*/
private static void queryStudents(ArrayList<Student> students) {
if (students.isEmpty()) {
System.out.println("没有学生信息,请录入学生信息!");
return; //结束方法
}
System.out.println("学号\t姓名\t年龄\t居住地");
for (int i = 0; i < students.size(); i++) {
Student student = students.get(i);
System.out.println(student.getId() + "\t\t" + student.getName() + "\t" + student.getAge() + "\t\t" + student.getAddress());
}
}
}