先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
-
系统优化
-
把
updateStudent
和deleteStudentById
中录入学生id代码抽取到一个方法(inputStudentId
)中
该方法的主要作用就是录入学生的id,方法的返回值为String
类型
- 把
addStudent
和updateStudent
中录入学生信息的代码抽取到一个方法(inputStudentInfo
)中
该方法的主要作用就是录入学生的信息,并封装为学生对象,方法的返回值为Student
类型
4.2.3代码实现
学生类
public class Student {
private String id;
private String name;
private String age;
private String birthday;
String address;
public Student() {
}
public Student(String id, String name, String age, String birthday) {
this.id = id;
this.name = name;
this.age = age;
this.birthday = birthday;
}
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 String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
}
程序入口InfoManagerEntry类
public class InfoManagerEntry {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
// 主菜单搭建
System.out.println(“--------欢迎来到黑马信息管理系统--------”);
System.out.println(“请输入您的选择: 1.学生管理 2.老师管理 3.退出”);
String choice = sc.next();
switch (choice) {
case “1”:
// System.out.println(“学生管理”);
// 开启学生管理系统
StudentController studentController = new StudentController();
studentController.start();
break;
case “2”:
System.out.println(“老师管理”);
TeacherController teacherController = new TeacherController();
teacherController.start();
break;
case “3”:
System.out.println(“感谢您的使用”);
// 退出当前正在运行的JVM虚拟机
System.exit(0);
break;
default:
System.out.println(“您的输入有误, 请重新输入”);
break;
}
}
}
}
StudentController类
public class StudentController {
// 业务员对象
private StudentService studentService = new StudentService();
private Scanner sc = new Scanner(System.in);
// 开启学生管理系统, 并展示学生管理系统菜单
public void start() {
//Scanner sc = new Scanner(System.in);
studentLoop:
while (true) {
System.out.println(“--------欢迎来到 <学生> 管理系统--------”);
System.out.println(“请输入您的选择: 1.添加学生 2.删除学生 3.修改学生 4.查看学生 5.退出”);
String choice = sc.next();
switch (choice) {
case “1”:
// System.out.println(“添加”);
addStudent();
break;
case “2”:
// System.out.println(“删除”);
deleteStudentById();
break;
case “3”:
// System.out.println(“修改”);
updateStudent();
break;
case “4”:
// System.out.println(“查询”);
findAllStudent();
break;
case “5”:
System.out.println(“感谢您使用学生管理系统, 再见!”);
break studentLoop;
default:
System.out.println(“您的输入有误, 请重新输入”);
break;
}
}
}
// 修改学生方法
public void updateStudent() {
String updateId = inputStudentId();
Student newStu = inputStudentInfo(updateId);
studentService.updateStudent(updateId, newStu);
System.out.println(“修改成功!”);
}
// 删除学生方法
public void deleteStudentById() {
String delId = inputStudentId();
// 3. 调用业务员中的deleteStudentById根据id, 删除学生
studentService.deleteStudentById(delId);
// 4. 提示删除成功
System.out.println(“删除成功!”);
}
// 查看学生方法
public void findAllStudent() {
// 1. 调用业务员中的获取方法, 得到学生的对象数组
Student[] stus = studentService.findAllStudent();
// 2. 判断数组的内存地址, 是否为null
if (stus == null) {
System.out.println(“查无信息, 请添加后重试”);
return;
}
// 3. 遍历数组, 获取学生信息并打印在控制台
System.out.println(“学号\t\t姓名\t年龄\t生日”);
for (int i = 0; i < stus.length; i++) {
Student stu = stus[i];
if (stu != null) {
System.out.println(stu.getId() + “\t” + stu.getName() + “\t” + stu.getAge() + “\t\t” + stu.getBirthday());
}
}
}
// 添加学生方法
public void addStudent() {
// StudentService studentService = new StudentService();
// 1. 键盘接收学生信息
String id;
while (true) {
System.out.println(“请输入学生id:”);
id = sc.next();
boolean flag = studentService.isExists(id);
if (flag) {
System.out.println(“学号已被占用, 请重新输入”);
} else {
break;
}
}
Student stu = inputStudentInfo(id);
// 3. 将学生对象,传递给StudentService(业务员)中的addStudent方法
boolean result = studentService.addStudent(stu);
// 4. 根据返回的boolean类型结果, 在控制台打印成功\失败
if (result) {
System.out.println(“添加成功”);
} else {
System.out.println(“添加失败”);
}
}
// 键盘录入学生id
public String inputStudentId() {
String id;
while (true) {
System.out.println(“请输入学生id:”);
id = sc.next();
boolean exists = studentService.isExists(id);
if (!exists) {
System.out.println(“您输入的id不存在, 请重新输入:”);
} else {
break;
}
}
return id;
}
// 键盘录入学生信息
public Student inputStudentInfo(String id) {
System.out.println(“请输入学生姓名:”);
String name = sc.next();
System.out.println(“请输入学生年龄:”);
String age = sc.next();
System.out.println(“请输入学生生日:”);
String birthday = sc.next();
Student stu = new Student();
stu.setId(id);
stu.setName(name);
stu.setAge(age);
stu.setBirthday(birthday);
return stu;
}
}
StudentService类
public class StudentService {
// 创建StudentDao (库管)
private StudentDao studentDao = new StudentDao();
// 添加学生方法
public boolean addStudent(Student stu) {
// 2. 将学生对象, 传递给StudentDao 库管中的addStudent方法
// 3. 将返回的boolean类型结果, 返还给StudentController
return studentDao.addStudent(stu);
}
// 判断学号是否存在方法
public boolean isExists(String id) {
Student[] stus = studentDao.findAllStudent();
// 假设id在数组中不存在
boolean exists = false;
// 遍历数组, 获取每一个学生对象, 准备进行判断
for (int i = 0; i < stus.length; i++) {
Student student = stus[i];
if(student != null && student.getId().equals(id)){
exists = true;
break;
}
}
return exists;
}
// 查看学生方法
public Student[] findAllStudent() {
// 1. 调用库管对象的findAllStudent获取学生对象数组
Student[] allStudent = studentDao.findAllStudent();
// 2. 判断数组中是否有学生信息 (有: 返回地址, 没有: 返回null)
// 思路: 数组中只要存在一个不是null的元素, 那就代表有学生信息
boolean flag = false;
for (int i = 0; i < allStudent.length; i++) {
Student stu = allStudent[i];
if(stu != null){
flag = true;
break;
}
}
if(flag){
// 有信息
return allStudent;
}else{
// 没有信息
return null;
}
}
public void deleteStudentById(String delId) {
studentDao.deleteStudentById(delId);
}
public void updateStudent(String updateId, Student newStu) {
studentDao.updateStudent(updateId, newStu);
}
}
StudentDao类
public class StudentDao {
// 创建学生对象数组
private static Student[] stus = new Student[5];
// 添加学生方法
public boolean addStudent(Student stu) {
// 2. 添加学生到数组
//2.1 定义变量index为-1,假设数组已经全部存满,没有null的元素
int index = -1;
//2.2 遍历数组取出每一个元素,判断是否是null
for (int i = 0; i < stus.length; i++) {
Student student = stus[i];
if(student == null){
index = i;
//2.3 如果为null,让index变量记录当前索引位置,并使用break结束循环遍历
break;
}
}
// 3. 返回是否添加成功的boolean类型状态
if(index == -1){
// 装满了
return false;
}else{
// 没有装满, 正常添加, 返回true
stus[index] = stu;
return true;
}
}
// 查看学生方法
public Student[] findAllStudent() {
return stus;
}
public void deleteStudentById(String delId) {
// 1. 查找id在容器中所在的索引位置
int index = getIndex(delId);
// 2. 将该索引位置,使用null元素进行覆盖
stus[index] = null;
}
public int getIndex(String id){
int index = -1;
for (int i = 0; i < stus.length; i++) {
Student stu = stus[i];
if(stu != null && stu.getId().equals(id)){
index = i;
break;
}
}
return index;
}
public void updateStudent(String updateId, Student newStu) {
// 1. 查找updateId, 在容器中的索引位置
int index = getIndex(updateId);
// 2. 将该索引位置, 使用新的学生对象替换
stus[index] = newStu;
}
}
4.3老师管理系统
4.3.1需求说明
- 添加老师: 通过键盘录入老师信息(id,name,age,birthday)
使用数组存储老师信息,要求老师的id不能重复
-
删除老师: 通过键盘录入要删除老师的id值,将该老师从数组中移除,如果录入的id在数组中不存在,需要重新录入
-
修改老师: 通过键盘录入要修改老师的id值和修改后的老师信息
将数组中该老师的信息修改,如果录入的id在数组中不存在,需要重新录入
- 查询老师: 将数组中存储的所有老师的信息输出到控制台
4.3.2实现步骤
- 环境搭建实现步骤
| 包 | 存储的类 | 作用 |
| — | — | — |
| com.eternity.edu.info.manager.domain | Student.java Teacher.java | 封装学生信息 封装老师信息 |
| com.eternity.edu.info.manager.dao | StudentDao.java TeacherDao.java | 访问存储数据的数组,进行赠删改查(库管) |
| com.eternity.edu.info.manager.service | StudentService.java TeacherService.java | 业务的逻辑处理(业务员) |
| com.eternity.edu.info.manager.controller | StudentController.java TeacherController.java | 和用户打交道(客服接待) |
| com.eternity.edu.info.manager.entry | InfoManagerEntry.java | 程序的入口类,提供一个main方法 |
- 菜单搭建实现步骤
-
展示欢迎页面,用输出语句完成主界面的编写
-
获取用户的选择,用Scanner实现键盘录入数据
-
根据用户的选择执行对应的操作,用switch语句完成操作的选择
-
系统优化
-
把
updateTeacher
和deleteTeacherById
中录入老师id
代码抽取到一个方法(inputTeacherId
)中
该方法的主要作用就是录入老师的id,方法的返回值为String
类型
- 把
addTeacher
和updateTeacher
中录入老师信息的代码抽取到一个方法(inputTeacherInfo
)中
该方法的主要作用就是录入老师的信息,并封装为老师对象,方法的返回值为Teacher
类型
4.3.3代码实现
老师类
public class Teacher extends Person{
private String id;
private String name;
private String age;
private String birthday;
String address;
public Teacher() {
}
public Teacher(String id, String name, String age, String birthday) {
this.id = id;
this.name = name;
this.age = age;
this.birthday = birthday;
}
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 String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
}
TeacherController类
public class TeacherController {
private Scanner sc = new Scanner(System.in);
private TeacherService teacherService = new TeacherService();
public void start() {
teacherLoop:
while (true) {
System.out.println(“--------欢迎来到 <老师> 管理系统--------”);
System.out.println(“请输入您的选择: 1.添加老师 2.删除老师 3.修改老师 4.查看老师 5.退出”);
String choice = sc.next();
switch (choice) {
case “1”:
// System.out.println(“添加老师”);
addTeacher();
break;
case “2”:
// System.out.println(“删除老师”);
deleteTeacherById();
break;
case “3”:
// System.out.println(“修改老师”);
updateTeacher();
break;
case “4”:
// System.out.println(“查看老师”);
findAllTeacher();
break;
case “5”:
System.out.println(“感谢您使用老师管理系统, 再见!”);
break teacherLoop;
default:
System.out.println(“您的输入有误, 请重新输入”);
break;
}
}
}
public void updateTeacher() {
String id = inputTeacherId();
Teacher newTeacher = inputTeacherInfo(id);
// 调用业务员的修改方法
teacherService.updateTeacher(id,newTeacher);
System.out.println(“修改成功”);
}
public void deleteTeacherById() {
String id = inputTeacherId();
// 2. 调用业务员中的删除方法, 根据id, 删除老师
teacherService.deleteTeacherById(id);
// 3. 提示删除成功
System.out.println(“删除成功”);
}
public void findAllTeacher() {
// 1. 从业务员中, 获取老师对象数组
Teacher[] teachers = teacherService.findAllTeacher();
// 2. 判断数组中是否有元素
if (teachers == null) {
System.out.println(“查无信息, 请添加后重试”);
return;
}
// 3. 遍历数组, 取出元素, 并打印在控制台
System.out.println(“学号\t\t姓名\t年龄\t生日”);
for (int i = 0; i < teachers.length; i++) {
Teacher t = teachers[i];
if (t != null) {
System.out.println(t.getId() + “\t” + t.getName() + “\t” + t.getAge() + “\t\t” + t.getBirthday());
}
}
}
public void addTeacher() {
String id;
while (true) {
// 1. 接收不存在的老师id
System.out.println(“请输入老师id:”);
id = sc.next();
// 2. 判断id是否存在
boolean exists = teacherService.isExists(id);
最后我们该如何学习?
1、看视频进行系统学习
这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
另外,我自己也珍藏了好几套视频资料躺在网盘里,有需要的我也可以分享给你:
2、读源码,看实战笔记,学习大神思路
“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。
Spring源码深度解析:
Mybatis 3源码深度解析:
Redis学习笔记:
Spring Boot核心技术-笔记:
3、面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:
只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。
人生短暂,别稀里糊涂的活一辈子,不要将就。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
ts(id);
最后我们该如何学习?
1、看视频进行系统学习
这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
另外,我自己也珍藏了好几套视频资料躺在网盘里,有需要的我也可以分享给你:
[外链图片转存中…(img-bLhAFcql-1713661916589)]
2、读源码,看实战笔记,学习大神思路
“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。
Spring源码深度解析:
[外链图片转存中…(img-NMhZQo9W-1713661916590)]
Mybatis 3源码深度解析:
[外链图片转存中…(img-YxC9qCIa-1713661916590)]
Redis学习笔记:
[外链图片转存中…(img-LbRMVBbU-1713661916591)]
Spring Boot核心技术-笔记:
[外链图片转存中…(img-utRQK2tx-1713661916591)]
3、面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:
[外链图片转存中…(img-jrnbAeEH-1713661916592)]
只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。
人生短暂,别稀里糊涂的活一辈子,不要将就。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-5sWBHzS7-1713661916592)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!