ArrayList 集合
目录
数组和集合的比较
数组的特点:
1.数组定义后类型确定,长度固定
2.集合类型可以不固定,大小是可变的
适合数据个数和类型确定的场景
集合的特点:
1.集合的大小不固定,启动后可以动态变化,类型也可以选择不固定
2.集合非常适合做元素个数不确定,且要进行增删的业务场景
3.集合提供了很多丰富发功能,而数组的功能很单一
如何理解集合的泛型
一个集合标准意义上来说,应该最好只包含一种数据类型,不管是简单的int(j集合中需要使用Intanger来代表),String等等类型还是自定义类。在进行泛型定义后,这个集合里的元素就只能包含这一种数据类型。
集合的常用API
使用实例
package ArrayList;
import java.util.ArrayList;
public class ArrayListAPI {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>(); //泛型设置了String类型则下方添加发数据只能是String类型
list.add("SeHun");
list.add("FZD");
list.add("MySQL");
list.add("java");
//public E get(int index) 获取某处位置的元素
String e = list.get(1);
System.out.println(e);
//public int size() 获取集合的大小
System.out.println(list.size());
//完成集合的遍历
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
//public E remove(int index) 删除某个索引位置处的元素值,并返回要删除的元素的值
System.out.println("删除前:");
System.out.println(list);
String e1 = list.remove(2);
System.out.println(e1);
System.out.println(list);
//public boolean remove(Object o) 直接删除元素值,删除成功返回true,删除失败返回false
list.remove("java");
System.out.println(list);
//public E set(int index,E element) 修改某个位置的元素的值
list.add("java");
String e2 = list.set(2, "java1");
System.out.println(e2);
System.out.println(list);
}
}
关于集合运用的实例
(一)
package ArrayList;
import java.util.ArrayList;
import java.util.Scanner;
public class ArrayListBianLiShanChu {
public static void main(String[] args) {
//创建集合对象,存入学生成绩
ArrayList<Integer> list = new ArrayList<>();
//输入要存入成绩的学生个数
Scanner sc = new Scanner(System.in);
System.out.println("请输入要录入成绩的学生个数:");
int number = sc.nextInt();
System.out.println("请分别输入学生的成绩:");
for (int i = 0; i < number; i++) {
int score = sc.nextInt();
list.add(score);
}
System.out.println(list);
//遍历集合中的每一个元素,从最后一个位置向前删除才会避免漏删情况
for (int i = list.size()-1; i >= 0 ; i--) {
Integer score1 = list.get(i);
//判断分数是否低于80,如果低于则从集合中删除
if(score1<80){
list.remove(i);
}
}
System.out.println(list);
}
}
(二)做一个电影存储集合,此处拓展到了自定义类的创建知识
电影类
package ArrayList;
public class Movie {
//定义电影类,创建三个电影对象,分别为名称,评分以及主演
private String name;
private double score;
private String actor;
//无参构造器(只要有有参构造器就得有无参构造器
public Movie() {
}
//有参构造器
public Movie(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;
}
}
主函数
package ArrayList;
import java.util.ArrayList;
public class ArrayListMovie {
public static void main(String[] args) {
//1.定义一个电影类
//2.定义一个ArrayList集合来存储这些影片对象
ArrayList<Movie> Movies = new ArrayList<>();
//3.创建影片对象封装电影数据,把对象都添加到集合中
//创建影片对象
Movie m1 = new Movie("肖申克的救赎",9.7,"罗宾斯");
Movie m2 = new Movie("霸王别姬",9.6,"张国荣");
Movie m3 = new Movie("阿甘正传",9.5,"汤姆。汉克斯");
//添加对象到集合中
Movies.add(m1);
Movies.add(m2);
Movies.add(m3);
//4.遍历集合中的对象
for (int i = 0; i < Movies.size(); i++) {
Movie movie = Movies.get(i); // 新创建一个Movie类的对象movie来接收Movies集合中的索引处的元素
System.out.println("片名" + movie.getName());
System.out.println("评分" + movie.getScore());
System.out.println("演员" + movie.getActor());
}
}
}
总结
在遍历输出集合的时候,无法将集合内的元素直接输出。因为集合内存储的并不是对象的本身,而是他们的地址。此时就需要创建一个同类型的变量(比如此处的movie)来承接元素的地址,通过元素的地址找到对应元素的信息,再将其输出,才会得到元素的真实内容,
(三)
学生类的定义(自己创建一种数据类型)
package ArrayList;
public class Student {
//定义学生类的学号,姓名,年龄和班级
private String number;
private String name;
private int age;
private String grade;
//无参构造函数
public Student() {
}
//有参构造器
public Student(String number, String name, int age, String grade) {
this.number = number;
this.name = name;
this.age = age;
this.grade = grade;
}
//get set函数
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
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 getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
}
主函数
package ArrayList;
import java.util.ArrayList;
import java.util.Scanner;
public class ArrayListSerachElement {
public static void main(String[] args) {
//学生信息系统数据搜索
//后台程序需要存储学生的信息并展示,然后提供按照学号搜索学生信息的功能
//1.定义一个学生类
//2.提供一个集合来容纳学生信息
//创建一个集合
ArrayList<Student> students = new ArrayList<>();
Student s1 = new Student("04201084","张",19,"计科2001");
Student s2 = new Student("04201085","杨",19,"计科2002");
Student s3 = new Student("04201086","陈",20,"计科2003");
Student s4 = new Student("04201087","车",21,"计科2004");
//将对象信息添加进入集合
students.add(s1);
students.add(s2);
students.add(s3);
students.add(s4);
//3.遍历集合中的学生对象并展示数据
System.out.println("学号\t\t\t\t姓名\t\t年龄\t\t班级");
for (int i = 0; i < students.size(); i++) {
Student s = students.get(i);
System.out.println( s.getNumber()+"\t\t"+s.getName()+"\t\t"+s.getAge()+"\t\t"+s.getGrade());
}
//4.让用户不断的输入学号搜索出学生对象信息
//定义一个方法
Scanner sc = new Scanner(System.in);
while (true) { // 放入死循环中让他可以无限查询
System.out.println("请输入所要查询同学的学号:");
String id = sc.next();
Student s =getStudentId(students,id); // 定义一个同类型变量来接受方法中的返回值
//判断学号是否存在
if(s==null){
System.out.println("查无此学生!");
}
else{
System.out.println("学号\t\t\t\t姓名\t\t年龄\t\t班级");
System.out.println( s.getNumber()+"\t\t"+s.getName()+"\t\t"+s.getAge()+"\t\t"+s.getGrade());
}
}
}
public static Student getStudentId(ArrayList<Student> students,String number) {
//根据学号找出学生对象并返回
//所有时候集合中存储的都是元素的地址,都需要定义一个类型的变量来承接这个地址通过地址找到定义类中的元素信息
for (int i = 0; i < students.size(); i++) {//此处集合应该使用形参中的students
Student s = students.get(i);
if (s.getNumber().equals(number)) {//如果所遍历到的对象的学号与传入的学号参数一致
return s; //返回该对象s(也就是包含学生信息的对象)
}
}
return null;
}
}
ps.此处设置了死循环,可以提供用户无数次查询
该题目为(二)的升级版,但基础部分思路类似
查询结果
以上就是集合以及集合代表ArrayList的基本内容
明天见!