集合与数组类似,也是一种容器,用来装数据的。
数组的特点:数组定义完成并启动后,类型确定,长度固定
然而:在处理个数不确定且要进行增删数据操作的时候,使用数组是不太合适的。
这时集合的优点体现了出来,启动后可大小动态变化,类型也可以不固定,适合个数不确定且要进行增删操作的场景,也有着丰富的API。
ArrayList集合是集合的一种
AL集合支持索引
构造器:
public ArrayList()
使用
集合名.add(任何元素,这里数字直接输入,字符单引号,字符串双引号);
直接将其sout(集合名.add(任何元素,这里数字直接输入,字符单引号,字符串双引号));结果为一个布尔值,代表是否添加成功,一般都会添加成功。
而有索引的添加方式无返回值,不能sout
添加元素(有索引,无索引);
import java.util.ArrayList;
public class ArrayListDemo1 {
public static void main(String[] args) {
ArrayList na = new ArrayList();
na.add("Java");
na.add("Java");
na.add("搭街坊卡拉");
na.add(15);
na.add(56.2);
na.add('d');
System.out.println(na);
//为指定索引位置添加元素:要求索引大于已有长度,否则报错
na.add(3,'四');
System.out.println(na);
//输出结果[Java, Java, 搭街坊卡拉, 15, 56.2, d]
//[Java, Java, 搭街坊卡拉, 四, 15, 56.2, d]
//可见插队到第四个位置,后面的位置依次后延一位
}
}
ArrayList对泛型的支持
当想要对某种类型进行操作时,在集合后加<中间填想要操作的数据类型>
例如:
ArrayList<String>只能存储和操作字符串
ArrayList<lnteger>只能存储和操作整形
import java.util.ArrayList;
public class ArrayListDemo2 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(12);
list.add(12.2);//标红
}
}
ArrayList常用API
定义String数据类型的集合如下:
public class ArrayListAPI {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("明月出天山");
list.add("苍茫云海间");
list.add("长风几万里");
list.add("吹度玉门关");
list.add("5b6n");
list.add("asdf");
list.add("qwer");
list.add("zxcv");
1.获取某个索引位置对应的数据get
返回值类型为此处存储的数据类型
String el = list.get(0);
System.out.println(el);//结果为:明月出天山
2.获取集合的长度(元素个数)size
返回值类型为整型
int a = list.size();
System.out.println(a);//输出为8
3.集合的遍历
System.out.println(list);//就能全部输出,但是输出格式有逗号和中括号[,,,],而且不能对单个数据进行操作
System.out.println(a);//依次输出遍历,可以对单个数据操作
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
4.删除元素remove
输入索引位置,返回值:元素值
String de = list.remove(2);
System.out.println(de);//输出结果:长风几万里
System.out.println(list);//结果中少了上面那一句
输入欲删除元素,返回值:布尔值,
当欲删除元素出现多次,此代码默认只删掉第一个;
boolean de = list.remove("吹度玉门关");
System.out.println(de);//结果为ture
System.out.println(list.remove("吹度玉门关"));//结果为false
5.修改索引位置元素值set
返回值,被修改的数据
String e5 = list.set(4 , "汉下白登道");//第五个元素改为“汉下白登道”
System.out.println(e5);//返回5b6n
System.out.println(list);
案例,遍历和删除元素值
需求:
某班考试在系统上进行,成绩大致为98,77,66,89,79,50,100
现在要把成绩低于80分的数据从集合中去掉;
自写版:
import java.util.ArrayList;
public class ArrayListAnLi {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(98);
list.add(77);
list.add(66);
list.add(89);
list.add(79);
list.add(50);
list.add(100);
System.out.println(list);
for (int i = 0; i < list.size(); i++) {
if (list.get(i)<80){//这里int一个score = list.get(i);然后使用score判断较为规范
list.remove(i);
}
}
System.out.println(list);
}
}
运行结果:
[98, 77, 66, 89, 79, 50, 100]
[98, 66, 89, 50, 100]
运行结束后,有一些元素没有被删除掉,发现余孽的特点都是前面有一个<80的元素将其掩护
于是在for循环下if条件中remove之后添加 i--; 可以实现功能
教程版本:
自写版修改前陷入经典套路
for循环从后往前遍历,也可以实现功能
案例,集合存储自定义元素并遍历
需求:保存电影名称,分值和主演,并依次展示出来;
自写版:
需要先写Movie库,使用JavaBean的格式写好Movie的class,注意JB格式属性写成private封装格式。自写创建对象直接使用全参构造器,把电影名,评分,主演三个属性直接赋给对象进行创建。
这时候输出list集合时(第10行)输出的实际上是class的地址而不是内容
import java.util.ArrayList;
public class ArrayListMovie {
public static void main(String[] args) {
ArrayList<Movie> movieInform = new ArrayList<>();
movieInform.add(new Movie("《小沈阳的救赎》",9.7, "罗宾斯"));
movieInform.add(new Movie("《霸王别姬》",9.6, "张国荣、张丰毅"));
movieInform.add(new Movie("《阿甘正传》",9.5, "汤姆汉克斯"));
System.out.println(movieInform);
System.out.println("\t电影名\t\t评分\t主要演员");
for (int i = 0; i < movieInform.size(); i++) {
System.out.println(movieInform.get(i).getName()+"\t"+movieInform.get(i).getScore()+"\t"+movieInform.get(i).getActor());
}
}
}
想要输出内容要使用getter
案例:学生信息系统数据检索
要求:后台存储学生信息,要求可以按照学号检索出学生的信息、
自写版:
一个封装成JavaBean的student的class,一个主函数,两个方法:
package StringAndArrayList;
import sun.java2d.pipe.OutlineTextRenderer;
import java.util.ArrayList;
import java.util.Scanner;
public class ArrayListSerchStudentNumber {
public static void main(String[] args) {
student ns1 = new student(20180302,"叶孤城",23,"护理一班");
student ns2 = new student(20180303,"东方不败",23,"推拿二班");
student ns3 = new student(20180304,"西门吹雪",26,"中医药四班");
student ns4 = new student(20180305,"梅超风",26,"神经科2班");
ArrayList<student> list1 = new ArrayList<>();
list1.add(ns1);
list1.add(ns2);
list1.add(ns3);
list1.add(ns4);
Scanner ns = new Scanner(System.in);
boolean flag = true;
OUT:
while (flag) {
System.out.println("输入1查询全部学生信息,输入2进入检索模式,输入0退出");
int key = ns.nextInt();
switch (key){
case 1:
System.out.println("----------已选择1,输出全体学生信息----------");
viewAllStudentsInform(list1);
break;
case 2:
System.out.println("----------已选择2,查询某一学号信息----------");
System.out.println("请输入欲检索学号:");
int serchnumber = ns.nextInt();
serchOneOfThem(list1,serchnumber);
break;
case 0:
flag = false;
break OUT;
default:
System.out.println("----------选择错误----------");
System.out.println("请重新输入");
}
}
System.out.println("已退出系统");
}
public static void viewAllStudentsInform(ArrayList<student> list){
System.out.println("=================全体学生信息==================");
System.out.println("\t学号\t\t姓名\t\t\t年龄\t\t班级");
for (int i = 0; i < list.size(); i++) {
student ns = list.get(i);
System.out.println(ns.getStuentNumber()+"\t"+ns.getName()+"\t\t"+ns.getAge()+"\t\t"+ns.getClasses());
}
System.out.println("=============================================");
}
public static void serchOneOfThem(ArrayList<student> list,int studentsNumber){
System.out.println("===============学号"+studentsNumber+"检索结果==============");
for (int i = 0; i < list.size(); i++) {
student ns = list.get(i);
if (studentsNumber==ns.getStuentNumber()){
System.out.println("\t学号\t\t姓名\t\t\t年龄\t\t班级");
System.out.println(ns.getStuentNumber()+"\t"+ns.getName()+"\t\t"+ns.getAge()+"\t\t"+ns.getClasses());
System.out.println("=============================================");
break;
}else if (i== list.size()-1){
System.out.println("==============数据库中没有录入该学号=============");
}
}
}
}
教程版本:
使用String定义学号, 遍历学号.equals(输入学号)判断学号是否符合;