【Java基础06】ArrayList

文章目录

  • 1.ArrayList
    • 1.1 集合的基本使用
    • 1.2 集合的创建和成员方法
    • 1.3 练习一:集合的遍历
      • 基本数据类型对应的包装类
    • 1.4 练习二:使用集合存储并遍历学生对象
    • 1.4 练习三:添加用户对象并判断是否存在
      • 写方法要思考的步骤
    • 1.5 练习四:添加手机对象并返回要求的数据
      • 技巧:如果要返回多个数据,可以把这些数据先放进一个容器当中,再把容器返回。如集合,数组。
  • 2 综合练习1:学生管理系统
    • **学生类**
    • StudentSystem
      • 注意点(循环检验,查找满足某条件的对象是否存在)
  • 2 综合练习2:学生管理系统升级版
    • User类
    • App
      • 封装思想
      • 多写一步可读性高
      • 如何调整字符串中内容
      • 其他注意点

本文部分参考本篇文章

1.ArrayList

1.1 集合的基本使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

集合有很多,如下图所示,本节所介绍的是其中一种:ArrayList
在这里插入图片描述

1.2 集合的创建和成员方法

成员方法:可以按照增删改查去记忆
在这里插入图片描述

package ArrayList;import java.util.ArrayList;public class ArrayListDemo1 {public static void main(String[] args) {//1.创建集合的对象//泛型:限定集合中存储数据的类型。也就是那个<>,需要在类名后面加上<>表示数据类型//ArrayList<String> list = new ArrayList<String>();//JDK7ArrayList<String> list = new ArrayList<>();//此时我们创建的是ArrayList的对象,而ArrayList是java已经写好的一一个类//这个类在底层做了一些处理//Point! 打印对象不是地址值,而是集合中存储数据内容//Point! 在展示的时候会拿[]把所有的数据进行包装,逗号空格作为分隔System.out.println(list);//2.集合的成员方法//2.1添加元素//2.1.1末尾添加boolean result = list.add("A"); //会有返回值,但一般不用管,默认是ture,只需要使用添加功能就行System.out.println(result);System.out.println(list);list.add("A");list.add("B");list.add("C");System.out.println(list);//2.1.2 给定位置插入list.add(1,"A"); //在索引 1 的位置插入 "A“,原来这个位置及后面的元素会向后移动一位。//2.2 删除元素//2.2.1 根据元素值删除list.remove("B");//也有boolean返回值,删除成功返回true,失败返回false(要删除的元素不存在)System.out.println(list);boolean result2 = list.remove("D");System.out.println(result2);System.out.println(list);//2.2.2 根据索引删除//会返回被删除的元素String str = list.remove(0);System.out.println(str);System.out.println(list);//2.3 修改元素//会返回被覆盖的元素(原来的旧值)String str1 = list.set(0,"aaa");System.out.println(str1);System.out.println(list);//2.4 查询元素//2.4.1 根据索引查询//会返回查询到的元素String str2 = list.get(0);System.out.println(str2);//2.4.2 获取集合的长度 + 遍历for (int i = 0; i < list.size(); i++) { //list.fori即可得到String str3 = list.get(i);System.out.println(str3);}}
}

1.3 练习一:集合的遍历

定义一个集合,添加字符串,并进行遍历 遍历格式参照: [元素1, 元素2,元素3]。

package ArrayList;import java.util.ArrayList;
import java.util.StringJoiner;public class ArrayListTest01 {public static void main(String[] args) {//定义一个集合,添加字符串,并进行遍历 遍历格式参照: [元素1,元素2,元素3]。ArrayList<String> list = new ArrayList<>();list.add("A");list.add("B");list.add("C");list.add("D");list.add(1,"E"); //在索引 1 的位置插入 "E“,原来这个位置及后面的元素会向后移动一位。System.out.println(list);//方法一:使用sj(因为有开头结尾和间隔符进行联想)StringJoiner sj = new StringJoiner(",","[","]");//list.forEach(sj::add); //简略版本for (int i = 0; i < list.size(); i++) {sj.add(list.get(i));}System.out.println(sj.toString());System.out.print("["); //注意这里是得是print,不然会换行!!!for (int i = 0; i < list.size(); i++) {if(i==list.size()-1){System.out.print(list.get(i));} else{System.out.print(list.get(i) + ",");}}System.out.println("]");//注意,如果是添加数字,要变成对应包装类ArrayList<Integer> list2 = new ArrayList<>(); //注意不是int,是Integer//jdk5以后int Integer之间是可以互相转化的list2.add(1);list2.add(2);list2.add(3);System.out.println(list2);ArrayList<Character> list3 = new ArrayList<>();list3.add('A');list3.add('B');list3.add('C');System.out.println(list3);}
}

基本数据类型对应的包装类

集合中如果要添加基本数据类型,需要变成其对应的包装类
在这里插入图片描述

1.4 练习二:使用集合存储并遍历学生对象

需求:
定义一个集合,添加一些学生对象,并进行遍历
学生类的属性为:姓名,年龄。
要求:
对象的数据来自键盘录入

package ArrayList;import java.util.ArrayList;
import java.util.Scanner;public class ArrayListTest02 {public static void main(String[] args) {/*需求:定义一个集合,添加一些学生对象,并进行遍历学生类的属性为:姓名,年龄。要求:对象的数据来自键盘录入*///1.创建集合ArrayList<ArrayTest02_Stu> list = new ArrayList<>();////2.创建学生对象//ArrayTest02_Stu s1 = new ArrayTest02_Stu("zhangsan",23);//ArrayTest02_Stu s2 = new ArrayTest02_Stu("lisi",24);//ArrayTest02_Stu s3 = new ArrayTest02_Stu("wangwu",25);//2.键盘录入学生的信息Scanner scanner = new Scanner(System.in);for (int i = 0; i < 2; i++) {System.out.println("输入名字");//point 每次会创建新的string对象,因此不会是同一个地址//point 如果把创建对象放在外部,那么每次list.add都是同一个地址,会产生输出的都是最后一次输入的值的情况String name = scanner.next();System.out.println("输入年龄");int age = scanner.nextInt();list.add(new ArrayTest02_Stu(name, age));}//3.添加元素//list.add(s1);  //point! 注意添加的是这个对象所在的地址,所以每次添加必须得创建多个对象,不然只能把一个对象来回添加多次//list.add(s2);//list.add(s3);//4.遍历集合for (int i = 0; i < list.size(); i++) {ArrayTest02_Stu stu = list.get(i);//输出的时候需要get,不然我们自己定义的类没有特殊处理直接print是地址值//System.out.println(stu);System.out.println(stu.getName() + "," + stu.getAge());}}
}

循环中注意每次放置进列表的都必须是一个新对象
如果把创建对象放在外部,那么每次list.add都是同一个地址,会产生输出的都是最后一次输入的值的情况
在这里插入图片描述

1.4 练习三:添加用户对象并判断是否存在

在这里插入图片描述
本题重点就是查找的方法,可以设置boolean返回值,遍历查找是否相同。

package ArrayList;import java.util.ArrayList;
import java.util.Scanner;public class ArrayListTest03 {public static void main(String[] args) {ArrayList<ArrayTest03_User> list = new ArrayList<>();Scanner sc = new Scanner(System.in);for (int i = 0; i < 3; i++) {System.out.println("输入第"+(i+1)+"个用户的id");int id = sc.nextInt();System.out.println("输入用户姓名");String name = sc.next();System.out.println("输入用户密码");String password = sc.next();list.add(new ArrayTest03_User(id, name, password));}//输入查找的idSystem.out.println("请输入需要查找的id");int sid = sc.nextInt();boolean result = search(list, sid);System.out.println(result);}//写函数需要考虑的内容//1.这个方法用来干嘛?//2.这个方法需要哪些内容才能完成?//3.调用处是否需要使用方法返回的结果?public static boolean search(ArrayList<ArrayTest03_User> list, int sid){ //point 注意这里要指定类型// point!不能直接查,因为不一定能查到,查不到的话直接报错,无法返回boolean值!//遍历比较合适for (int i = 0; i < list.size(); i++) {ArrayTest03_User user = list.get(i);int id = user.getId();if(id == sid){return true;}}return false;}
}

写方法要思考的步骤

//写函数需要考虑的内容
//1.这个方法用来干嘛?
//2.这个方法需要哪些内容才能完成?
//3.调用处是否需要使用方法返回的结果?

1.5 练习四:添加手机对象并返回要求的数据

在这里插入图片描述

package ArrayList;import java.util.ArrayList;public class ArrayListTest04 {public static void main(String[] args) {ArrayList<ArrayTest04_Phone> list = new ArrayList<>();ArrayTest04_Phone p1 = new ArrayTest04_Phone("小米",1000);list.add(p1);ArrayTest04_Phone p2 = new ArrayTest04_Phone("苹果",8000);list.add(p2);ArrayTest04_Phone p3 = new ArrayTest04_Phone("锤子",2000);list.add(p3);ArrayList<ArrayTest04_Phone> result_list = search(list);if (result_list != null) {for (int i = 0; i < result_list.size(); i++) {System.out.println("品牌为"+result_list.get(i).getBrand()+","+"价格为"+result_list.get(i).getPrice());}}else{System.out.println("没有低于3000的手机");}}//point 技巧://如果要返回多个数据,可以把这些数据先放进一个容器当中,再把容器返回//如集合,数组public static ArrayList<ArrayTest04_Phone> search(ArrayList<ArrayTest04_Phone> list){ArrayList<ArrayTest04_Phone> slist = new ArrayList<>();for (int i = 0; i < list.size(); i++) {if( list.get(i).getPrice() <= 3000 ){slist.add(list.get(i));}}return slist;}
}

技巧:如果要返回多个数据,可以把这些数据先放进一个容器当中,再把容器返回。如集合,数组。

2 综合练习1:学生管理系统

  • 案例需求
    针对目前我们的所学内容,完成一个综合案例:学生管理系统。
    该系统主要功能如下:

    添加学生:通过键盘录入学生信息,添加到集合中

    删除学生:通过键盘录入要删除学生的学号,将该学生对象从集合中删除

    修改学生:通过键盘录入要修改学生的学号,将该学生对象其他信息进行修改

    查看学生:将集合中的学生对象信息进行展示

    退出系统:结束程序

学生类

package StudentSystem;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;}
}

StudentSystem

package StudentSystem;import java.util.ArrayList;
import java.util.Scanner;public class StudentSystem {public static void main(String[] args) {ArrayList<Student> list = new ArrayList<>();Scanner sc = new Scanner(System.in);boolean flag = false;while(!flag) {  //可以用loop,flag,exit(0)表示退出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("请输入你的选择:");int choice = sc.nextInt();switch (choice) {case 1 -> addStudent(list);  //箭头是新版,用冒号的话得另外写breakcase 2 -> deleteStudent(list);case 3 -> updateStudent(list);case 4 -> queryStudent(list);case 5 -> {System.out.println("退出");flag = true;}default -> System.out.println("没有这个选项");}}}public static void addStudent(ArrayList<Student> list) {System.out.println("进入添加学生板块");Scanner sc = new Scanner(System.in);System.out.println("请输入学生id");String id = sc.next();//while (true) { //point 这段整复杂了,还没考虑到二次检查//    boolean containId = contains(list, id);//    if (containId) {//        System.out.println("已经存在同样的ID,请换一个");//    } else{//        System.out.println("ID有效");//        break;//    }//    System.out.println("请输入新的id");//    id = sc.next(); //point 在循环外部声明的,不会随着循环结束消失//}//我的写法boolean containId = contains(list, id);while (containId) {System.out.println("已经存在同样的ID,请换一个");System.out.println("请输入新的id");id = sc.next();containId = contains(list, id);}System.out.println("ID有效");//视频的写法是先定义一个null的id,然后在while中输入,用if判断,满足条件可以breakSystem.out.println("请输入姓名");String name = sc.next();System.out.println("请输入年龄");int age = sc.nextInt();System.out.println("请输入地址");String address = sc.next();list.add(new Student(id, name, age, address)); //也可以拆开用setSystem.out.println("学生信息添加成功");}public static void deleteStudent(ArrayList<Student> list) {System.out.println("进入删除学生板块");Scanner sc = new Scanner(System.in);System.out.println("请输入要删除的id");String id = sc.next();//检查id是否存在//point 可以直接看gexIndex是否大于0boolean containId = contains(list, id);if (containId) {System.out.println("存在该id");//ArrayList通过ID获取idx的部分得自己写int idx = getIndex(list, id);list.remove(idx);System.out.println("删除成功");}else{System.out.println("不存在该id");return;}}public static void updateStudent(ArrayList<Student> list) {System.out.println("进入修改学生板块");Scanner sc = new Scanner(System.in);System.out.println("请输入要修改的id");String id = sc.next();int idx = getIndex(list, id);if (idx != -1) {System.out.println("请输入要修改的学生姓名");String newName = sc.next();System.out.println("请输入要修改的学生age");int newAge = sc.nextInt();System.out.println("请输入要修改的学生地址");String newAddress = sc.next();list.set(idx, new Student(id, newName, newAge, newAddress));System.out.println("修改成功");}else{System.out.println("不存在该id");}}public static void queryStudent(ArrayList<Student> list) {System.out.println("进入查询学生板块");if(list.isEmpty()) {System.out.println("无学生信息");return;  //注意得有这个}Scanner sc = new Scanner(System.in);System.out.println("请输入要查询的学生的id");String id = sc.next();//最好是遍历,不过如果都是按照顺序来的话应该也可以进行一个越界判断然后输出for (int i = 0; i < list.size(); i++) {if(id.equals(list.get(i).getId())) {Student querystu = list.get(i);System.out.println("id\t姓名\t年龄\t住址");System.out.println(querystu.getId() + "\t" + querystu.getName() + "\t" + querystu.getAge() + "\t" + querystu.getAddress());return;}}System.out.println("没有要查询的学生信息");//return; point 如果是void 不需要最后的return}public static boolean contains(ArrayList<Student> list, String id) {//循环遍历得到每一个学生对象//拿到学生对象后,获取id进行判断for (int i = 0; i < list.size(); i++) {if(list.get(i).getId().equals(id)) {return true;}}return false;}//这块可以直接调用下面的 getIndex>=0就是true//对应输入id的索引public static int getIndex(ArrayList<Student> list, String id) {int idx = 0;for (int i = 0; i < list.size(); i++) {Student stu = list.get(i);String stuId = stu.getId();//查询到的id和要删除id进行比较if(stuId.equals(id)) {idx = i;return idx;}}return -1;  //point必须得在这写个返回,就-1就行}}

注意点(循环检验,查找满足某条件的对象是否存在)

注意:getIndex可以替代contains,有就是对应索引,没有就是-1
必须得遍历结束后再return false,不能for不满足直接returnfalse
经典结构:while(true){ if(满足条件)break; else{continue;}} 这样可以循环,直至满足条件
也可以用flag,loop,exit(0)终止循环

2 综合练习2:学生管理系统升级版

加入了登录,注册和忘记密码三个板块

User类

package StudentSystem;public class User {private String name;private String password;private String personID;private String phoneNumber;public User() {}public User(String name, String password, String personID, String phoneNumber) {this.name = name;this.password = password;this.personID = personID;this.phoneNumber = phoneNumber;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getPersonID() {return personID;}public void setPersonID(String personID) {this.personID = personID;}public String getPhoneNumber() {return phoneNumber;}public void setPhoneNumber(String phoneNumber) {this.phoneNumber = phoneNumber;}
}

App

package StudentSystem;import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;public class App {public static void main(String[] args) {ArrayList<User> list = new ArrayList<>();Scanner sc = new Scanner(System.in);boolean flag = true;while (flag) {System.out.println("------欢迎来到学生管理系统------");System.out.println("1.登录");System.out.println("2.注册");System.out.println("3.忘记密码");System.out.println("4.退出");System.out.println("请输入你的选择:");int choice = sc.nextInt();switch (choice) {case 1 -> logIn(list);case 2 -> register(list);case 3 -> forgetPassword(list);case 4 -> {System.out.println("退出系统,再见");flag = false;//return;  //如果程序不是循环运行的,在这return一下就行}default -> System.out.println("没有这个选项");}}}public static void logIn(ArrayList<User> list){System.out.println("进入登录板块");Scanner sc = new Scanner(System.in);for (int i = 0; i < 3; i++ ) {//1.键盘录入用户名System.out.println("请输入用户名");String username = sc.next();//检测用户名是否存在boolean check = contains(list, username);if (!check) {System.out.println("用户名"+username+"不存在,请先注册");return;}//2.键盘录入密码System.out.println("请输入密码");String password = sc.next();//3.键盘录入验证码while (true) {String rightcode = getCode();System.out.println("验证码为" + rightcode);System.out.println("请输入验证码");String code = sc.next();if(code.equalsIgnoreCase(rightcode)){ //point 忽略大小写System.out.println("验证码正确");break;}else{System.out.println("验证码错误");continue;}}//4.验证用户名和密码是否正确//检测是否在集合中//point 封装思想的应用//point 把一些零散的数据,封装成一个对象User userInfo = new User(username,password,null,null);boolean checkcheckUserInfo = checkUserInfo(list,userInfo);if (checkcheckUserInfo) {System.out.println("登录成功,可以使用");break;}else{System.out.println("登录失败,用户名或者密码错误");if(i == 2){System.out.println("当前账号"+username+"被锁定");return;}else{System.out.println("登录失败,用户名或者密码错误,还剩下"+(2-i)+"次机会");}}}}private static boolean checkUserInfo(ArrayList<User> list, User userInfo) {for (int i = 0; i < list.size(); i++) {User user = list.get(i);if(user.getName().equals(userInfo.getName()) && user.getPassword().equals(userInfo.getPassword())){return true;}}return false;}public static void register(ArrayList<User> list){System.out.println("进入注册板块");//在外部声明变量String username= null; //point 初始化避免报错String password= null;String personID= null;String phoneNumber= null;//添加用户信息到集合中//1.键盘录入添加用户名以及判断限制Scanner sc = new Scanner(System.in);boolean flag = true;while (flag) {System.out.println("请输入用户名");username = sc.next();//point 先验证格式是否正确,再验证是否唯一//1.1 用户名长度3-15位之间//1.2 不能是纯数字,需要是数字加字母//1.3 用户名唯一boolean checkUsername = checkUsername(username);//到这里判断用户名格式是否正确,接着才能判断是否唯一if(!checkUsername){System.out.println("格式不正确,请重新输入");continue; //point 善于使用continue!!}//走到这一步,因为有continue,已经保证了格式正确System.out.println("格式正确,验证id是否唯一");boolean flag2 = contains(list, username);if(flag2){System.out.println("用户名重复,请重新输入");continue;} else{System.out.println("id唯一,用户名"+username+"可用");flag = false;   //或者外层设为true,这里直接break}}System.out.println("用户名设置成功,请输入密码");//键盘录入添加密码以及判断限制while (true) {password = sc.next();System.out.println("请再次输入密码");String againPassword = sc.next();if(password.equals(againPassword)){System.out.println("两次密码一致");break;}else{System.out.println("两次密码不一致,请重新输入密码");continue;}}System.out.println("密码设置成功,请输入身份证号码");//键盘录入身份证号码以及判断限制//长度为18位//不能0开头//前17位必须是数字//最后一位可以是数字,也可以是大写X或者小写xwhile (true) {System.out.println("请输入身份证号码");personID = sc.next();boolean flag2 = checkPersonID(personID);if(!flag2){continue;}else{System.out.println("身份证号码设置成功");break;}}System.out.println("身份证号码设置成功,请输入手机号");//键盘录入手机以及判断限制//长度为11位//不能0开头//必须是数字while (true) {System.out.println("请输入手机号");phoneNumber = sc.next();boolean flag3 = checkPhoneNumber(phoneNumber);if(flag3){System.out.println("手机号设置成功");break;}}//把输入正确的内容放到用户对象中list.add(new User(username,password,personID,phoneNumber));System.out.println("注册成功");printList(list);}public static void forgetPassword(ArrayList<User> list){System.out.println("进入忘记密码板块");Scanner sc = new Scanner(System.in);//1.键盘录入用户名System.out.println("请输入用户名");String username = sc.next();boolean checkUsername = contains(list,username);if(checkUsername){System.out.println("存在此用户");}else{System.out.println("用户名"+username+"不存在,请先注册");return;}//2.键盘录入身份证和手机号System.out.println("请输入身份证");String personID = sc.next();System.out.println("请输入手机号");String phoneNumber = sc.next();//验证身份证和手机号User checkUser = new User(username,null,personID,phoneNumber);int index = findIndex(list, checkUser.getName());User findUser = list.get(index);if(findUser.getPersonID().equalsIgnoreCase(checkUser.getPersonID()) && //point 可以Ingore,排除掉大小写X的影响findUser.getPhoneNumber().equals(checkUser.getPhoneNumber())){System.out.println("身份证或手机号验证正确");}else{System.out.println("身份证和手机号输入错误");return;}//已经验证了身份证和手机号,可以开始修改密码String newPassword = null;while (true) {System.out.println("请输入新密码");newPassword = sc.next();System.out.println("请再次输入新密码");String newPassword2 = sc.next();if(newPassword.equals(newPassword2)){System.out.println("两次密码一致,有效");break;}else{System.out.println("两次密码不一致,重新输入");continue;}}//修改密码list.get(index).setPassword(newPassword); //善于使用get方法System.out.println("密码修改成功");}private static int findIndex(ArrayList<User> list, String name) {for (int i = 0; i < list.size(); i++) {User user = list.get(i);if (user.getName().equals(name)) {return i;}}return -1;}private static void printList(ArrayList<User> list) {for (int i = 0; i < list.size(); i++) {User user = list.get(i);System.out.println(user.getName()+","+user.getPassword()+","+user.getPersonID()+","+user.getPhoneNumber());}}private static boolean checkPhoneNumber(String phoneNumber) {//长度为11位if(phoneNumber.length() != 11){System.out.println("手机号不是11位,请重新输入");return false;}//不能0开头char firstNumber = phoneNumber.charAt(0);if(firstNumber == '0'){System.out.println("手机号不能为0开头,请重新输入");return false;}//必须是数字for (int i = 0; i < phoneNumber.length(); i++) {char ch = phoneNumber.charAt(i);if(!(ch >= '0' && ch <= '9')){System.out.println("手机号存在非数字,请重新输入");return false;}}return true;}private static boolean checkPersonID(String personID) {//长度为18位if(personID.length() != 18){System.out.println("身份证不是18位,请重新输入");return false;} else{System.out.println("身份证满足18位,继续检验");}//不能0开头char firstChar = personID.charAt(0);if(firstChar == '0'){System.out.println("身份证首位为0,请重新输入");return false;}else{System.out.println("身份证首位满足不为0,继续检验");}//前17位必须是数字for (int i = 0; i < personID.length() - 1 ; i++) { //前17位,长度-1就行char ch = personID.charAt(i);if(!(ch <= '9' && ch >= '0')){System.out.println("前17位存在非数字,请重新输入");return false;}}//最后一位可以是数字,也可以是大写X或者小写xchar lastChar = personID.charAt(personID.length() - 1);if(!(lastChar <= '9' && lastChar >= '0') || (lastChar == 'X') || (lastChar == 'x')){System.out.println("最后一位输入有问题,请重新输入");return false;}else{return true;}}public static boolean checkUsername(String username){//1.1 用户名长度3-15位之间//if (username.length() < 3 || username.length() > 15) //point 这样写调用两次有点复杂int len = username.length(); //多写一步可读性高,调用一次效率提升if(len < 3 || len > 15){return false;}//1.2 不能是纯数字,需要是数字加字母//循环遍历int cnt = 0;for (int i = 0; i < username.length(); i++) {char ch = username.charAt(i);if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {cnt++;break; //有一个字母就不用继续遍历了}}//if(cnt == 0){//    return false;//}return cnt > 0;}public static boolean contains(ArrayList<User> list, String username){for (int i = 0; i < list.size(); i++) {User u = list.get(i);if (u.getName().equals(username)) {return true;}}//必须得遍历结束后再return falsereturn false; //list为空默认可以}public static String getCode(){//生成验证码//1.创建一个包含所有字母的集合或者stringbuilderArrayList<Character> list = new ArrayList<>();for (int i = 0; i < 26; i++) {list.add((char) ('a' + i));list.add((char) ('A' + i));}//挑选随机字母//point 可以随机生成五个,其中一个用数字覆盖StringBuilder sb = new StringBuilder();Random r = new Random();for (int i = 0; i < 4; i++) {int index = r.nextInt(list.size());sb.append(list.get(index));}//挑选随机数字int number = r.nextInt(10);sb.append(number); //注意这一步//调整字符串中的内容,可以把字符串先变为一个字符数组,// 然后调整字符数组里面的数据,最后再把字符数组变为字符串char[] arr = sb.toString().toCharArray();int randomIndex = r.nextInt(arr.length);char temp = arr[randomIndex];arr[randomIndex] = arr[arr.length - 1];arr[arr.length - 1] = temp;return new String(arr);}
}

封装思想

把一些零散的数据,封装成一个对象,传入或者传出,会更加高效

多写一步可读性高

if (username.length() < 3 || username.length() > 15) {...}//point 这样写调用两次有点复杂//多写一步可读性高,调用一次效率提升
int len = username.length(); 
if(len < 3 || len > 15){...}

如何调整字符串中内容

1.substring,适用于已知移动到哪里
2.把字符串先变为一个字符数组,然后调整字符数组里面的数据,最后再把字符数组变为字符串

其他注意点

str.equalsIgnoreCase忽略大小写比较,验证码和身份证最后一位都可以用得到
整个方法内都要用到的变量不要在循环里声明+初始化(只在循环里初始化也会报错的其实),可以外部声明,初始化一个空值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92677.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ddos 放在多个云主机,同时运行

1. 起因&#xff0c; 目的: 我打开 grok, 被 cloudflare 拦截&#xff0c;问我是不是机器人。 这个情况&#xff0c;如果是别的小网站也就算了&#xff0c;很正常。 大公司也搞这种东西&#xff0c;要么是偷懒&#xff0c;要么是太小气了。 一气之下&#xff0c;我决定写个 ddo…

lspci/setpci用法小结

目录 1.lspci用法小结 2.lspci -t 3.setpci用法小结 1.lspci用法小结 参考博客&#xff1a;【PCIe】lspci用法小结 - 知乎 lspci是一个用来显示系统中所有PCI总线设备或者连接到该总线上所有设备的工具 man lspci lspci(8) …

光通信从入门到精通:PDH→DWDM→OTN 的超详细演进笔记

光通信从入门到精通&#xff1a;PDH→DWDM→OTN 的超详细演进笔记 作者&#xff1a; 脱脱克克 日期&#xff1a;2025-07-24 关键词&#xff1a;DWDM、OTN、G.709、光纤、带宽、C-band、L-band、DSP、ROADM 摘要 本文用一条“高速公路”的比喻&#xff0c;把 40 年光传输技术演进…

安全初级——网页

网页代码<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>用户登录</title><script src&…

JVM原理及其机制(二)

目录 一 . 垃圾回收机制&#xff08;GC&#xff09; 二 . 垃圾回收的具体步骤 &#xff08;1&#xff09;先找出谁是垃圾 方案一&#xff1a;引用计数 方案二&#xff1a;可达性分析 &#xff08;2&#xff09;释放垃圾的内存空间 方案一&#xff1a;标记清除 方案二…

Solo:基于 zkHE 的身份验证协议,构建 Web3 可信匿名身份层

“Solo 正在基于其独创的 zkHE 架构&#xff0c;构建一套“可信匿名”的链上身份系统&#xff0c;有望打破长期困扰 Web3 的“不可能三角”&#xff0c;即在隐私保护、身份唯一性与去中心化可验证性之间实现兼得。”前不久&#xff0c;Web3 身份层项目 Solo 宣布完成 120 万美元…

【Excel函数】将数据非空的字段筛选出来放在新列

一、需求描述 将对应数据不为空的字段筛选出来放在新的列里 二、解析 IFERROR(INDEX(B$2:B$10,SMALL(IF(C$2:C$10<>"",ROW(C$2:C$10)-ROW(C$2)1),ROW(A1))),"") 1. IF(C$2:C$10<>"", ROW(C$2:C$10)-ROW(C$2)1) 作用&#xff1a;…

【unity游戏开发入门到精通——组件篇】unity的粒子系统力场 (Particle System Force Field)实现如旋风、吸引力、风吹效果等

文章目录前言一、参数介绍二、Particle System Force Field 的核心特性三、如何使用1、粒子系统开启外力选项2、然后再添加粒子系统力场 (Particle System Force Field)即可参考专栏推荐完结前言 Unity的粒子系统是一个非常强大的工具&#xff0c;可以用来创建各种动态效果&am…

JS逆向基础( AES 解密密文WordArray和Uint8Array实战②)

1. Uint8Array 就像「快递柜」 每个格子固定放「1 瓶饮料」(1 字节 = 8 位,范围 0-255 就像饮料编号) 比如装了 3 瓶:可乐(编号 255)、雪碧(10)、矿泉水(0) 这是超市通用的标准货架,任何工具(JS 内置功能)都认识这种摆放方式 用途:运输、存储所有二进制东西(图片…

论文阅读:《针对多目标优化和应用的 NSGA-II 综述》一些关于优化算法的简介

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

Elasticsearch(ES)安装

docker下安装ES 拉取镜像docker pull elasticsearch:7.4.0 创建文件夹 权限赋值 chmod -R 777 /usr/local/docker/es 创建配置 #可访问IP http.host: 0.0.0.0 # 跨域 http.cors.enabled: true http.cors.allow-origin: "*" 编写脚本并赋权 首先先返回上一级目录&…

Pycharm、Python安装及配置小白教程

本篇博客主要介绍了如何使用工具软件快速安装Pycharm和Python并完成基础配置。 目录 一、Python与Pycharm是什么&#xff1f; 二、安装工具软件 三、安装Python 四、安装Pycharm 五、配置Pycharm 1. 基础设置 2. 配置解释器 一、Python与Pycharm是什么&#xff1f; …

Redis数据库入门教程

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、基于内存的高性能键值存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。本教程将带你从零开始全面学习Redis&#xff0c;涵盖基础概念、安装配置、数据结构、持久化机制以及与Python的交互等内容…

工业仪表识别(一)环境安装

仪表识别环境安装 &#xff11;&#xff0e;cuda cuda 11.8 intall&#xff08;cuda11.8、cuda12.6按照需求安装&#xff09; ref: https://developer.nvidia.com/cuda-11-8-0-download-archive?target_osLinux&target_archx86_64&DistributionUbuntu&target_vers…

闲庭信步使用图像验证平台加速FPGA的开发:第三十四课——车牌识别的FPGA实现(6)叠加车牌识别的信息

&#xff08;本系列只需要modelsim即可完成数字图像的处理&#xff0c;每个工程都搭建了全自动化的仿真环境&#xff0c;只需要双击top_tb.bat文件就可以完成整个的仿真&#xff0c;大大降低了初学者的门槛&#xff01;&#xff01;&#xff01;&#xff01;如需要该系列的工程…

Windows上用于跨平台开发的环境工具

1. MSYS2&#xff08;Minimal SYStem 2&#xff09; 一款模拟Unix环境的软件&#xff0c;可以执行unix命令。通过pacman管理工具&#xff0c;类似Ubuntu上apt-get&#xff0c;RedHat中的yum。 MSYS2最大好处就是能够在Windows上轻松编译一些由Unix环境工具链开发的工程&#…

【硬件-笔试面试题】硬件/电子工程师,笔试面试题-15,(知识点:DC-DC电源,BUCK电路,铁损,铜损)

目录 1、题目 2、解答 选项 A 选项 B 选项 C 选项 D 3、相关知识点 一、纹波 二、感量&#xff08;电感量L&#xff09; 三、开关频率f 四、铁损 五、铜损 题目汇总版&#xff1a; 【硬件-笔试面试题】硬件/电子工程师&#xff0c;笔试面试题汇总版&#xff0c;持…

Ethereum: 从 1e+21 到千枚以太币:解密 Geth 控制台的余额查询

大家好今天&#xff0c;我们来聊一个新手在接触以太坊节点时经常会遇到的场景。想象一下&#xff0c;我们成功运行了一个私有以太坊节点&#xff0c;并尝试查询一个账户的余额&#xff0c;然后我们看到了这样一个返回结果&#xff1a;1e21。 这是什么意思&#xff1f;是出错了&…

2025最新软件测试面试八股文(含答案+文档)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、什么是POM&#xff0c;为什么要使用它&#xff1f;POM是Page Object Model的简称&#xff0c;它是一种设计思想&#xff0c;而不是框架。大概的意思是&#xff…

表格数据处理-TabNet模型使用说明(模型构建+SHAP)

一、模型介绍 论文为《TabNet: Attentive Interpretable Tabular Learning》发表于2021年&#xff0c;属于Google Cloud AI。该研究针对表格数据提出了一种新的深度神经网络&#xff08;DNN&#xff09;架构TabNet&#xff0c;旨在解决传统深度学习在表格数据上表现不如决策树模…