Java09集合基础
一、关于集合
1、什么是集合
集合是一种容器,用来装数据,类似于数组
Q:有数组,为什么还要学习集合?
A:数组定义完成并启用后,长度就固定了;而集合的大小可变,开发中用到的更多。
2、常见集合
3、ArrayList长度可变原理
-
当创建ArrayList集合容器的时候,底层会存在一个长度为10个大小的空数组
-
当存储空间不够需要扩容时,底层会自动创建一个新的扩容数组,大小为原数组的1.5倍,同时将原数组的数据都拷贝到新的扩容数组,并将新元素添加到新数组
4、集合和数组的使用选择
-
数组:存储的元素个数固定不变
-
集合:存储的元素个数经常发生改变
二、ArrayList基础入门
1、ArrayList集合的创建
格式:ArrayList<泛型> 集合变量名 = new ArrayList<泛型>();
注意:jdk7版本以后,new之后的<>中的泛型可省略不写,它自动匹配左边的类型
!!!泛型用来限制集合中存储的数据类型!!!
!!!泛型中不允许存储基本数据类型!!!
Q:如果需要存储基本数据类型怎么解决?
A:使用基本数据类型所对应的包装类
-
8种基本数据类型及其对应的包装类
2、ArrayList集合常用成员方法
-
增
-
将指定的元素添加到此集合的末尾
public boolean add(E e) //返回添加成功的状态,成功为true,失败为false;注意底层是没有失败的情况的
-
在此集合中的指定位置插入指定的元素(插队添加)
public void add(int index,E element) //效果同插队,无返回值
-
-
删
-
删除指定索引处的元素
public E remove(int index) //返回被删除的元素
-
删除指定的元素
public boolean remove(Object o) //返回是否删除成功的状态
-
-
改
修改指定索引处为对应元素
public E set(int index,E element) //返回被修改的元素
-
查
-
返回指定索引处的元素
public E get(int index)
-
返回集合中的元素个数
public int size()
-
♥注意:增删改方法的返回值一般不做接收,但是查的返回值一定要接收,接收了才可以对查到的结果做进一步操作。
3、小demo
-
集合删除元素
需求:1、创建一个存储String的集合,内部存储(test,张三,李四,test,test)字符串 2、删除所有的test字符串,删除后,将集合剩余元素打印在控制台
public class ArrayListTest3 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("test"); list.add("张三"); list.add("李四"); list.add("test"); list.add("test"); //正序遍历,调用remove方法后要记得i-- for (int i = 0; i < list.size(); i++) { String s = list.get(i); if("test".equals(s)){ list.remove(i); i--; } } //倒序遍历 for (int i = list.size()-1; i >= 0; i--) { String s = list.get(i); if("test".equals(s)){ list.remove(i); } } System.out.println(list); } }
♥注意:在正序遍历删除集合元素的时候,由于集合的维护机制,当集合中某个元素被成功删除后,后续元素会依次前移,而i指针++可能会导致遗漏一些元素的检查。解决办法就是在成功删除后先让i--,回到上一个位置,这样当再次进入循环i++时能刚好检查到刚才被删元素的下一个元素。当然也可以采用倒序遍历,倒序遍历就不存在这种问题。
-
集合元素筛选
-
需求:1、定义一个方法,方法接收一个集合对象(泛型为Student)
2、方法内部将年龄低于18的学生对象找出
3、将找到的对象存入新集合对象,方法返回新集合
-
public class ArrayListTest4 { public static void main(String[] args) { Student stu1 = new Student("Anna",23); Student stu2 = new Student("Tom",12); Student stu3 = new Student("Mary",20); Student stu4 = new Student("Jerry",25); Student stu5 = new Student("Bill",14); ArrayList<Student> list = new ArrayList<>(); list.add(stu1); list.add(stu2); list.add(stu3); list.add(stu4); list.add(stu5); ArrayList<Student> newlist = filter(list); for (int i = 0; i < newlist.size(); i++) { Student student = newlist.get(i); System.out.println(student.getName()+","+student.getAge()); } } private static ArrayList<Student> filter(ArrayList<Student> list) { ArrayList<Student> newlist = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { Student student = list.get(i); if(student.getAge()<18){ newlist.add(student); } } return newlist; } }
分析助解
三、学生管理系统案例练习
1、分析思路图
2、代码实现
package com.itheima.start;
import domain.Student;
import java.util.ArrayList;
import java.util.Scanner;
/**
* @Auther:Anna
* @Date:2024/4/26-04-26-14:57
* @Description:com.itheima.start
* @version:1.0
**/
public class start {
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<>();
/* 用于测试功能的假数据
Student stu1 = new Student("heima001","张三", 23, "1999-11-11");
Student stu2 = new Student("heima002","李四", 23, "1999-11-11");
Student stu3 = new Student("heima003","王五", 23, "1999-11-11");
list.add(stu1);
list.add(stu2);
list.add(stu3);*/
while(true) {
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 :
addStudent(list);
break;
case 2 :
deleteStudentById(list);
break;
case 3 :
updateStudentInfoById(list);
break;
case 4 :
showStudentInfos(list);
break;
case 5 :
System.out.println("感谢您的使用!再见");
System.exit(0); //终止正在运行的JVM虚拟机
default:
System.out.println("您的输入有误,请重新输入!");
break;
}
}
}
/**
*此方法根据键盘录入学生信息并添加到集合
*/
private static void addStudent(ArrayList<Student> list) {
Scanner sc =new Scanner(System.in);
System.out.println("请输入学生学号:");
//提升变量的作用域
String id;
//while循环校验id
while(true){
id= sc.next();
//判断学号唯一性
int index = getIndex(id,list);
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 birthday = sc.next();
Student stu = new Student(id,name,age,birthday);
list.add(stu);
}
/**
*此方法根据id修改学生信息
*/
private static void updateStudentInfoById(ArrayList<Student> list) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要修改的学生id:");
String id = sc.next();
int index = getIndex(id,list);
if(index==-1){
System.out.println("查无此人,修改失败!");
}else{
System.out.println("请输入新的学生姓名:");
String name = sc.next();
System.out.println("请输入新的学生年龄:");
int age = sc.nextInt();
System.out.println("请输入新的学生生日:");
String birthday = sc.next();
Student stu = new Student(id,name,age,birthday);
list.set(index,stu);
System.out.println("修改成功!");
}
}
/**
*此方法根据id删除学生信息
*/
private static void deleteStudentById(ArrayList<Student> list) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要删除的学生id:");
String id = sc.next();
int index = getIndex(id,list);
if(index==-1){
System.out.println("查无此人,请重新输入!");
}else{
list.remove(index);
System.out.println("删除成功!");
}
}
/**
*此方法用于通过学号id获取索引
*/
private static int getIndex(String id, ArrayList<Student> list) {
for (int i = 0; i < list.size(); i++) {
Student stu = list.get(i);
if(id.equals(stu.getId())){
return i;
}
}
return -1;
}
/**
* 此方法用于查看学生
*/
private static void showStudentInfos(ArrayList<Student> list) {
if(list.size()==0){
System.out.println("查无信息,请添加后重试!");
}else{
//遍历集合,取出学生对象
System.out.println("学号\t\t\t姓名\t年龄\t生日");
for (int i = 0; i < list.size(); i++) {
Student stu = list.get(i);
System.out.println(stu.getId()+"\t"+stu.getName()+"\t"+stu.getAge()+"\t"+stu.getBirthday() );
}
}
}
}