Java 学习笔记(基础篇11)
1. 学生管理系统升级版
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<User>();Scanner sc = new Scanner(System.in);loop:while (true) {System.out.println("欢迎来到学生管理系统");System.out.println("请选择操作:1登录 2注册 3忘记密码 4退出系统");String choose = sc.next();switch (choose) {case "1":login(list);break;case "2":register(list);break;case "3":forgetPassWord(list);break;case "4":System.out.println("谢谢使用,再见");break loop;default:System.out.println("没有这个选项");}}}public static void login(ArrayList<User> list) {Scanner sc = new Scanner(System.in);System.out.println("请输入用户名");String username = sc.next();boolean flag = contains(list, username);if (!flag){System.out.println("用户名" + username + "未注册,请先注册再登录");return; //不太理解}System.out.println("请输入密码");String password = sc.next();while (true) {String rightCode = getCode();System.out.println("当前正确的验证码为:" + rightCode);System.out.println("请输入验证码");String code = sc.next();if (code.equalsIgnoreCase(rightCode)){System.out.println("验证码正确");break;} else{System.out.println("验证码错误");continue;}}User useInfo = new User(username, password, null, null); //不太理解boolean result = checkUserInfo(list,useInfo);if (result){System.out.println("登录成功,可以开始使用");} else{System.out.println("登陆失败,用户名或密码错误");}}public static boolean checkUserInfo(ArrayList<User> list, User useInfo){for (int i = 0; i < list.size(); i++) {User user = list.get(i);if (user.getUsername().equals(useInfo.getUsername()) &&user.getPassword().equals(useInfo.getPassword())){return true;}}return false;}public static void register(ArrayList<User> list) {Scanner sc = new Scanner(System.in);String username;String password;String personID;String phoneNumber;while (true) {System.out.println("请输入用户名");username = sc.next();boolean flag1 = checkUsername(username);if (flag1) {System.out.println("格式满足条件,继续判断用户名是否唯一");} else {System.out.println("用户名格式不满足条件,需要重新输入");continue; //不太理解}boolean flag2 = contains(list, username);if (flag2) {System.out.println("用户名" + username + "已存在,请重新输入");} else {System.out.println("用户名" + username + "可用");break;}}while (true) {System.out.println("请输入要注册的密码");password = sc.next();System.out.println("请再次输入要注册的密码");String againPassword = sc.next();if (!password.equals(againPassword)) {System.out.println("两次密码输入不一致,请重新输入");continue;} else{System.out.println("两次密码一致,请继续输入其他数据");break;}}while (true) {System.out.println("请输入身份证号码:");personID = sc.next();boolean flag = checkPersonID(personID);if (flag) {System.out.println("身份证号码满足要求");break;} else{System.out.println("身份证号码格式有误,请重新输入");continue;}}while (true) {System.out.println("请输入手机号码");phoneNumber = sc.next();boolean flag = checkPhoneNumber(phoneNumber);if (flag){System.out.println("手机号码格式正确");break;} else{System.out.println("手机号码格式有误");}}User u = new User(username, password, personID, phoneNumber);list.add(u);System.out.println("注册成功");printList(list);}public static void printList(ArrayList<User> list) {for (int i = 0; i < list.size(); i++) {User user = list.get(i);System.out.println(user.getUsername() + " " + user.getPassword() + " "+ user.getPersonID() + " " + user.getPhoneNumber());}}public static boolean checkPhoneNumber(String phoneNumber) {if (phoneNumber.length() != 11) {return false;}if (phoneNumber.startsWith("0")){return false;}for (int i = 0; i < phoneNumber.length(); i++) {char c = phoneNumber.charAt(i);if (!(c >= '0' && c <= '9')) {return false;}}return true;}public static boolean checkPersonID(String personID) {if (personID.length() != 18){return false;}char c = personID.charAt(0);if (c == '0'){return false;}for (int i = 1; i < personID.length() - 1; i++) {char ch = personID.charAt(i);if (!(ch >= '0' && ch <= '9')){return false;}}char endChar = personID.charAt(personID.length() - 1);if ((endChar >= '0' && endChar <= '9') || (endChar >= 'x' || endChar == 'X')){return true;} else{return false;}}public static boolean contains(ArrayList<User> list, String username) {for (int i = 0; i < list.size(); i++) {User user = list.get(i);String rightUsername = user.getUsername();if (username.equals(rightUsername)) {return true;}}return false;}public static void forgetPassWord(ArrayList<User> list) {Scanner sc = new Scanner(System.in);System.out.println("请输入用户名");String username = sc.next();boolean flag = contains(list, username);if (!flag){System.out.println("当前用户" + username + "未注册,请先注册");return;}System.out.println("请输入身份证号码");String personID = sc.next();System.out.println("请输入手机号码");String phoneNumber = sc.next();int index = findIndex(list, username);User user = list.get(index);if (!(user.getPersonID().equals(personID) && user.getPhoneNumber().equals(phoneNumber))){System.out.println("身份证号码或手机号码输入有误,不能修改密码");return;}String password;while (true) {System.out.println("请输入新的密码");password = sc.next();System.out.println("请再次输入新的密码");String againPassword = sc.next();if (password.equals(againPassword)){System.out.println("两次密码输入一致");break;} else{System.out.println("两次密码输入不一致,请重新输入");continue;}}user.setPassword(password);System.out.println("密码修改成功");}public static int findIndex(ArrayList<User> list, String username){for (int i = 0; i < list.size(); i++) {User user = list.get(i);if (user.getUsername().equals(username)){return i;}}return -1;}public static String getCode(){ //不太理解ArrayList<Character> list = new ArrayList<>(); //不太理解,char类型for (int i = 0; i < 26; i++) {list.add((char)('a' + i));list.add((char)('A' + i));}Random r = new Random();StringBuilder sb = new StringBuilder();for (int i = 0; i < 4; i++) {int index = r.nextInt(list.size());char c = list.get(index); //不太理解sb.append(c);}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);}public static boolean checkUsername(String username) {int len = username.length();if (len < 3 || len > 15){return false;}for (int i = 0; i < username.length(); i++) {char c = username.charAt(i);if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'))) {return false;}}int count = 0;for (int i = 0; i < username.length(); i++) {char c = username.charAt(i);if ((c > 'a' && c < 'z') || (c > 'A' && c < 'Z')) {count++;break;}}return count > 0;}
}
关键逻辑:
① login
方法中的return;
if (!flag){System.out.println("用户名" + username + "未注册,请先注册再登录");return; // 这里的return
}
作用:在void
类型的方法中,return;
表示立即结束当前方法,返回到方法的调用处(这里就是回到main
方法的循环中)。
场景解释:
当用户输入的用户名未注册(!flag
为true
)时,程序打印提示信息后,通过return
直接结束login
方法,不再执行后续的 “输入密码”“验证验证码” 等登录逻辑。这样可以避免对未注册的用户进行无效的后续操作,直接回到主菜单循环。
② 创建一个临时的User
对象,封装用户输入的 “用户名” 和 “密码”,用于后续与已注册用户信息的比对。
User useInfo = new User(username, password, null, null);
细节解释:
User
是一个自定义类(通常包含username
、password
、personID
、phoneNumber
四个属性,以及对应的构造方法和getter
方法)。- 这里的构造方法参数是
(username, password, personID, phoneNumber)
,但后两个参数传了null
(空)。 - 原因:登录验证只需要比对 “用户名” 和 “密码”,不需要用到身份证和手机号,所以临时对象只需封装这两个必要信息即可。后续
checkUserInfo
方法会用这个临时对象的用户名和密码,与list
中已注册用户的信息进行匹配。
③ getCode
方法中的ArrayList<Character> list = new ArrayList<>();
作用:创建一个存储Character
类型的集合,用于存放验证码可能用到的大小写字母。
关键知识点:
- Java 中的
ArrayList
是集合,只能存储 “对象”,不能直接存储基本数据类型(如char
、int
等)。 Character
是char
的 “包装类”(将基本类型char
包装成对象),因此ArrayList<Character>
可以存储字符(以对象形式)。- 这里的逻辑是:循环添加 26 个小写字母(
'a'
到'z'
)和 26 个大写字母('A'
到'Z'
)到集合中,为后续生成验证码的字母部分做准备。
2. 综合练习
题目 1:实现学生管理系统登录功能
一、题目描述
现有一个学生管理系统,已定义User
类(包含username
、password
、personID
、phoneNumber
属性及对应的构造方法、getter
方法),且提供以下工具方法:
public static boolean contains(ArrayList<User> list, String username)
:判断集合中是否存在指定用户名的用户,存在返回true
,不存在返回false
;public static String getCode()
:生成并返回一个随机验证码(包含大小写字母和数字,支持equalsIgnoreCase
忽略大小写校验);public static boolean checkUserInfo(ArrayList<User> list, User userInfo)
:比对集合中是否存在 “用户名和密码完全匹配” 的用户,匹配返回true
,不匹配返回false
。
请你编写login
方法,实现学生管理系统的登录逻辑,具体需求如下:
(1) 提示用户输入用户名,调用contains
方法判断该用户名是否已注册;若未注册,打印 “用户名 XXX 未注册,请先注册再登录” 并结束登录方法;
(2) 若用户名已注册,提示用户输入密码;
(3) 生成随机验证码并在控制台提示 “当前正确的验证码为:XXX”,然后提示用户输入验证码;
- 若用户输入的验证码与正确验证码(忽略大小写)一致,打印 “验证码正确” 并进入下一步;
- 若不一致,打印 “验证码错误” 并重新生成验证码,要求用户重新输入(循环直至验证码正确);
(4) 创建临时User
对象,封装用户输入的用户名和密码(身份证号、手机号传null
),调用checkUserInfo
方法比对用户名和密码;
- 若比对成功,打印 “登录成功,可以开始使用”;
- 若比对失败,打印 “登录失败,用户名或密码错误”。
public static void login(ArrayList<User> list) {Scanner sc = new Scanner(System.in);System.out.println("请输入用户名");String username = sc.next();boolean flag = contains(list, username); //不太理解if (!flag){System.out.println("用户名" + username + "未注册,请先注册再登录");return; //不太理解}System.out.println("请输入密码");String password = sc.next();while (true) {String rightCode = getCode();System.out.println("当前正确的验证码为:" + rightCode);System.out.println("请输入验证码");String code = sc.next();if (code.equalsIgnoreCase(rightCode)){System.out.println("验证码正确");break;} else{System.out.println("验证码错误");continue;}}User useInfo = new User(username, password, null, null); //不太理解boolean result = checkUserInfo(list,useInfo);if (result){System.out.println("登录成功,可以开始使用");} else{System.out.println("登陆失败,用户名或密码错误");}}
题目 2:验证码生成器实现
请设计一个 Java 方法getCode()
,用于生成一个随机的 5 位验证码,具体要求如下:
(1) 验证码由 4 个字母(包含大小写)和 1 个数字(0-9)组成
(2) 字母需涵盖 26 个小写字母(a-z)和 26 个大写字母(A-Z),随机选取
(3) 数字随机生成(0-9)
(4) 数字在验证码中的位置需随机(不能固定在某一位置)
(5) 最终返回生成的 5 位验证码字符串
public static String getCode(){ //不太理解ArrayList<Character> list = new ArrayList<>(); //不太理解,char类型for (int i = 0; i < 26; i++) {list.add((char)('a' + i));list.add((char)('A' + i));}Random r = new Random();StringBuilder sb = new StringBuilder();for (int i = 0; i < 4; i++) {int index = r.nextInt(list.size());char c = list.get(index); //不太理解sb.append(c);}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);}