一、集合类的总结
集合的长度是可以随意改变的,但是集合只能存储对象,不能存储基本数据类型,但是可以存储自动封箱之后的基本数据类型(int--->Integer),且集合没有默认值
List:有序的、有索引值、允许重复
Set: 无序的、无索引值、不允许重复
HashMap:会对存入的数据进行自动排序、以键值对的形式存储、键不允许重复、值允许重复
Collection遍历集合的三种方式
1.使用size()和get()进行遍历
2.使用迭代器Iterator进行遍历
3.使用增强for进行遍历
Map集合遍历集合的两种方式
1.使用keyset()进行遍历
2.使用entryset()进行遍历
Collection和Map都是集合体系的最顶层,两者没有任何联系
常见异常
1.Collection集合是无法使用add(),会报并发修改异常。而List集合是可以使用add(),不会报异常
2.Set集合如果想要去重必须重写hashcode()和equals(),如果不重写就能重复添加一个元素
3.TreeSet集合如果想添加多个不重复的元素就必须实现Comparable,并且重写它的compareTo()
可以使用Collections工具类操作集合对象,因为它里面封装了很多操作集合的方法
ArrayList和LinkedList如何选择使用
1.对于查询速率有要求的建议使用ArrayList
2.对于增删速率有要求的建议使用LinkedList
ArrayList的底层实现是数组:连续的、有顺序、查找快、增删慢
LinkedList的底层实现是链表:不是连续的、但是有顺序、查找慢、增删快
HashSet的底层实现是Hash表
TreeSet的底层实现是二叉树
Map的底层实现是Hash表+红黑树
二、Map集合如何对key(键)去重
package com.bianyiit.cast;
import java.util.Objects;
public class Person implements Comparable {
private String name;
private int age;
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 Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Object o){
Person p=(Person)o;
if(this.age>p.age){
return 1;
}else if(this.age==p.getAge()){
return 0;
}else if(this.age<p.age){
return -1;
}
return 0;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//重写hashcode()和equals()方法去重
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
package com.bianyiit.anli;
import com.bianyiit.cast.Person;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class DemoHashMapStudent {
public static void main(String[] args) {
Map<Person,String> m=new HashMap();
Person p1=new Person("张三",18);
Person p2=new Person("李四",13);
Person p3=new Person("王五",18);
Person p4=new Person("王五",18);
Person p5=new Person("赵六",20);
//put()--映射功能,判断集合中是否有相同的key,没有相同的key时,返回值是null,并且把元素添加进集合中去
//如果有相同的key,返回的是被覆盖的value,添加到集合中把原来的value覆盖掉
//使用Person对象作为键key,使用id作为值value
m.put(p1,"1");
m.put(p2,"2");
m.put(p3,"3");
m.put(p4,"4");
m.put(p5,"5");
//在Person类里面写对象的去重
Set<Map.Entry<Person, String>> entries = m.entrySet();
for (Map.Entry<Person, String> entry : entries) {
Person key = entry.getKey();
String value = entry.getValue();
System.out.println(key+":"+value);
}
}
}
//自定义对象作为Map图的key时,要想去重,必须在自定义类里面去重写object的hashcode()和equals(),因为key是放在set集合中,不能重复
//输出结果:
Person{name='王五', age=18}:4
Person{name='赵六', age=20}:5
Person{name='张三', age=18}:1
Person{name='李四', age=13}:2
获取指定字符串单个字符的内容和出现的次数
package com.bianyiit.anli;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class ZifuChuangZiShu {
public static void main(String[] args) {
//判断字符串出现的次数
String s="zhangsanlisiwangwuzhaoliu";
//定义一个map集合
Map<Character,Integer> m=new HashMap<>();
//遍历字符串
for (int i = 0; i <s.length() ; i++) {
char ch=s.charAt(i);
if(m.containsKey(ch)){ //通过contains判断集合中是否有key
int value=(int)m.get(ch);
value++;
m.put(ch,value);
}else{
m.put(ch,1);
}
}
//遍历集合的第一种方法
Set<Character> keys = m.keySet();
for (Object key : keys) {
Integer value = m.get(key);
System.out.println(key+":"+value);
}
//遍历集合的第二种方法
/*Set<Map.Entry<Character, Integer>> set = m.entrySet();
for (Map.Entry<Character, Integer> Entry : set) {
Character key = Entry.getKey();
Integer value = Entry.getValue();
System.out.println(key+":"+value);
}*/
System.out.println(m);
}
}
//输出结果
{a=4, s=2, u=2, g=2, w=2, h=2, i=3, z=2, l=2, n=3, o=1}
四、集合类综合应用–学生管理系统
学生类Student.java
package com.bianyiit.cast;
import java.util.Objects;
public class Student {
//ID 姓名 性别 班级
private String name;
private int id;
private String classname;
private String sex;
//生成get和set方法
public String getName() {
return name;
}
public void setName(String name) {
if(name.length()<=4){
this.name = name;
}else{
this.name = "xxx";
}
}
public int getId() {
return id;
}
public void setId(int id) {
if(id>=1&&id<=100){
this.id = id;
}else{
this.id = 0;
}
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
if(classname.equals("102")||classname.equals("103")){
this.classname = classname;
}else{
this.classname = "null";
}
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
if(sex.equals("男")||sex.equals("女")){
this.sex = sex;
}else{
this.sex = "不明";
}
}
//无参构造方法
public Student() {
}
//有参构造方法
public Student(String name, int id, String classname, String sex) {
this.name = name;
this.id = id;
this.classname = classname;
this.sex = sex;
}
//重写equasls()
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return id == student.id &&
sex == student.sex &&
Objects.equals(name, student.name) &&
Objects.equals(classname, student.classname);
}
//重写hashcode()
@Override
public int hashCode() {
return Objects.hash(name, id, classname, sex);
}
//重写toString()
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", id=" + id +
", classname='" + classname + '\'' +
", sex=" + sex +
'}';
}
}
测试类StudentManage
package com.bianyiit.cast;
import org.omg.CORBA.ARG_IN;
import java.util.ArrayList;
import java.util.Scanner;
public class StudentManage {
public static void main(String[] args) {
ArrayList<Student> arr=new ArrayList<Student>(); //使用集合保存学生信息
while(true){
System.out.println("----Welcome To Student Manage----");
System.out.println("1.查看所有的学生信息");
System.out.println("2.添加学生");
System.out.println("3.删除学生");
System.out.println("4.修改学生");
System.out.println("5.退出系统");
System.out.print("请输入您的选择[num]:");
//扫描器
Scanner sc=new Scanner(System.in);
int i = sc.nextInt();
//通过switch去实现各个功能
switch (i){
case 1:
FindAllStudent(arr);
break;
case 2:
InsertStudent(arr);
break;
case 3:
deleteStu(arr);
break;
case 4:
changeStu(arr);
break;
case 5:
System.out.println("已成功退出系统!!");
System.exit(0); //退出系统
break;
default:
break;
}
}
}
public static void FindAllStudent(ArrayList<Student> arr) {
System.out.println("-------------学生信息显示如下---------------");
System.out.println("学号\t\t姓名\t\t性别\t\t班级\t\t");
//遍历所有的学生对象
for (int i = 0; i < arr.size(); i++) {
Student student = arr.get(i);
System.out.println(student.getId()+"\t\t\t"+student.getName()+"\t\t"+student.getSex()+"\t\t\t"+student.getClassname());
}
System.out.println("-------------------------------------------");
System.out.println();
}
public static void InsertStudent(ArrayList<Student> arr){
if(arr.isEmpty()){
int idcode; //学号
String name; //姓名
String sex; //性别
String classname; //班级
Scanner sc1=new Scanner(System.in);
Student s=new Student();
System.out.println("请输入您的学号!");
idcode = sc1.nextInt();
s.setId(idcode);
while(s.getId()==0){
System.out.println("您输入的ID不正确,只允许从0-100,请重新输入!");
System.out.println("请输入您的学号!");
idcode = sc1.nextInt();
s.setId(idcode);
}
System.out.println("请输入您的姓名!");
name = sc1.next();
s.setName(name);
while(s.getName().equals("xxx")){
System.out.println("姓名不符合要求,请重新输入!");
System.out.println("请输入您的姓名!");
name = sc1.next();
s.setName(name);
}
System.out.println("请输入您的性别!");
sex = sc1.next();
s.setSex(sex);
while(s.getSex().equals("不明")){
System.out.println("对不起,性别只能输入男/女,请重新输入!");
System.out.println("请输入您的性别!");
sex = sc1.next();
s.setSex(sex);
}
System.out.println("请输入您的班级!");
classname = sc1.next();
s.setClassname(classname);
while(s.getClassname().equals("null")){
System.out.println("对不起,班级只能输入102/103,请重新输入!");
System.out.println("请输入您的班级!");
classname = sc1.next();
s.setClassname(classname);
}
//通过set方法设置Student的各个属性
s.setClassname(classname);
//将Student添加进集合中
arr.add(s);
//给出添加成功的提示
System.out.println("添加成功!");
System.out.println();
}else{
int flag=-1; //定义一个标识符 如果遍历完之后已经有该学生的学号则更改flag=1
Scanner sc=new Scanner(System.in);
System.out.println("请输入您的学号!");
int idcode = sc.nextInt();
//遍历集合中所有的元素
for (int i = 0; i < arr.size(); i++) {
Student s1 = arr.get(i);
if(s1.getId()==idcode){
flag=1;
break;
}
}
if(flag==1){ //与集合中已有的学生对象进行比较如果学号重复
System.out.println("该学生学号已经存在,不允许添加相同学号的学生!!");
System.out.println();
}else{ //与集合中已有的学生对象进行比较如果学号不重复
//创建一个学生对象
Student s=new Student();
System.out.println("请输入您的姓名!");
String name = sc.next();
System.out.println("请输入您的性别!");
String sex = sc.next();
System.out.println("请输入您的班级!");
String classname = sc.next();
//通过set方法设置Student的各个属性
s.setId(idcode);
s.setName(name);
s.setSex(sex);
s.setClassname(classname);
//将Student添加进集合中
arr.add(s);
//给出添加成功的提示
System.out.println("添加成功!");
System.out.println();
}
}
}
public static void deleteStu(ArrayList<Student> arr){
//遍历集合
//如果集合里面没有元素
if(arr.isEmpty()){
System.out.println("集合为空,无法进行删除操作!!");
System.out.println();
}else{
int delete=-1; //定义一个标志用来标识需要删除的对象
System.out.println("请输入您的学号!");
int flag=-1;
Scanner sc=new Scanner(System.in);
int id = sc.nextInt();
/*for (Student student : arr) {
String id1 = student.getId();
if(id==id1){
flag=1;
break;
}
}*/
for (int i = 0; i < arr.size(); i++) {
Student s1 = arr.get(i);
if(s1.getId()==id){
flag=1;
delete=i;
}
}
if(flag==1){
Student student = arr.get(delete);
arr.remove(student);
System.out.println("已成功删除该学生!!");
System.out.println();
}else{
System.out.println("系统里面不存在该学生,无法删除!!");
System.out.println();
}
}
}
public static void changeStu(ArrayList<Student> arr){
//遍历集合
//如果集合里面没有元素
if(arr.isEmpty()){
System.out.println("集合为空,无法进行修改操作!!");
System.out.println();
}else{
int delete=-1; //定义一个标志用来标识需要删除的对象
System.out.println("请输入您的学号!");
int flag=-1;
Scanner sc=new Scanner(System.in);
int id = sc.nextInt();
/*for (Student student : arr) {
String id1 = student.getId();
if(id==id1){
flag=1;
break;
}
}*/
for (int i = 0; i < arr.size(); i++) {
Student s1 = arr.get(i);
if(s1.getId()==id){
flag=1;
delete=i;
}
}
if(flag==1){
Student student = arr.get(delete);
System.out.print("请输入修改的学生的姓名:");
String name = sc.next();
student.setName(name);
System.out.print("请输入修改的学生的性别:");
String sex = sc.next();
student.setSex(sex);
System.out.print("请输入修改的学生的班级:");
String classname = sc.next();
student.setClassname(classname);
arr.set(delete,student);
System.out.println("学生信息修改成功!!");
System.out.println();
}else{
System.out.println("系统里面不存在该学生,无法修改!!");
System.out.println();
}
}
}
}
//输出结果:
----Welcome To Student Manage----
1.查看所有的学生信息
2.添加学生
3.删除学生
4.修改学生
5.退出系统
请输入您的选择[num]:1
-------------学生信息显示如下---------------
学号 姓名 性别 班级
-------------------------------------------
----Welcome To Student Manage----
1.查看所有的学生信息
2.添加学生
3.删除学生
4.修改学生
5.退出系统
请输入您的选择[num]:2
请输入您的学号!
0
您输入的ID不正确,只允许从0-100,请重新输入!
请输入您的学号!
1
请输入您的姓名!
我是大傻缺
姓名不符合要求,请重新输入!
请输入您的姓名!
张三
请输入您的性别!
猫
对不起,性别只能输入男/女,请重新输入!
请输入您的性别!
男
请输入您的班级!
105
对不起,班级只能输入102/103,请重新输入!
请输入您的班级!
103
添加成功!
----Welcome To Student Manage----
1.查看所有的学生信息
2.添加学生
3.删除学生
4.修改学生
5.退出系统
请输入您的选择[num]:1
-------------学生信息显示如下---------------
学号 姓名 性别 班级
1 张三 男 103
-------------------------------------------
----Welcome To Student Manage----
1.查看所有的学生信息
2.添加学生
3.删除学生
4.修改学生
5.退出系统
请输入您的选择[num]:4
请输入您的学号!
1
请输入修改的学生的姓名:李四
请输入修改的学生的性别:女
请输入修改的学生的班级:19
学生信息修改成功!!
----Welcome To Student Manage----
1.查看所有的学生信息
2.添加学生
3.删除学生
4.修改学生
5.退出系统
请输入您的选择[num]:1
-------------学生信息显示如下---------------
学号 姓名 性别 班级
1 李四 女 null
-------------------------------------------
----Welcome To Student Manage----
1.查看所有的学生信息
2.添加学生
3.删除学生
4.修改学生
5.退出系统
请输入您的选择[num]:5
已成功退出系统!!
该学生管理系统还是有瑕疵,如果小伙伴们对这个系统感兴趣,欢迎大家继续改进!!