16.分类和static
1.案例驱动模式
1.1案例驱动模式概述 (理解)
通过我们已掌握的知识点,先实现一个案例,然后找出这个案例中,存在的一些问题,在通过新知识点解决问题
1.2案例驱动模式的好处 (理解)
解决重复代码过多的冗余,提高代码的复用性
解决业务逻辑聚集紧密导致的可读性差,提高代码的可读性
解决代码可维护性差,提高代码的维护性
今后写代码要达成的目标
- 复用性
- 可读性
- 维护性
通过新知识点解决
2.分类思想
2.1分类思想概述 (理解)
之前写的学生管理系统存在的问题:代码的维护性,可读性以及复用性是有些问题的
分工协作,专人干专事
2.2黑马信息管理系统 (理解)
Student类 标准学生类,封装键盘录入的学生信息(id , name , age , birthday)
StudentDao类 Dao : (Data Access Object 缩写) 用于访问存储数据的数组或集合
StudentService类 用来进行业务逻辑的处理(例如: 判断录入的id是否存在)
StudentController类 和用户打交道(接收用户需求,采集用户信息,打印数据到控制台)

3.分包思想
3.1分包思想概述 (理解)
如果将所有的类文件都放在同一个包下,不利于管理和后期维护,所以,对于不同功能的类文件,可以放在不同的包下进行管理
3.2包的概述 (记忆)
包
本质上就是文件夹
创建包
多级包之间使用 " . " 进行分割 多级包的定义规范:公司的网站地址翻转(去掉www) 比如:黑马程序员的网站址为www.itheima.com 后期我们所定义的包的结构就是:com.itheima.其他的包名
包的命名规则
字母都是小写
- 包的定义
- 使用package关键字定义包
- 格式:package包名;如果是多级包,中间用"."进行分割
- 一般情况下,我们不会手动的去给某一个类定义包,使用idea开发工具创建即可
3.3包的注意事项 (理解)
package语句必须是程序的第一条可执行的代码
package语句在一个java文件中只能有一个
如果没有package,默认表示无包名
3.4类与类之间的访问 (理解)
同一个包下的访问
不需要导包,直接使用即可
不同包下的访问
1.import 导包后访问
2.通过全类名(包名 + 类名)访问 应用场景:多个包下出现了相同的类名称,就可以使用这种访问进行区分
注意:import 、package 、class 三个关键字的摆放位置存在顺序关系
package 必须是程序的第一条可执行的代码
import 需要写在 package 下面
class 需要在 import 下面
4.黑马信息管理系统
4.1系统介绍 (理解)

4.2学生管理系统 (应用)
4.2.1需求说明
添加学生: 键盘录入学生信息(id,name,age,birthday)
使用数组存储学生信息,要求学生的id不能重复
删除学生: 键盘录入要删除学生的id值,将该学生从数组中移除,如果录入的id在数组中不存在,需要重新录入
修改学生: 键盘录入要修改学生的id值和修改后的学生信息
将数组中该学生的信息修改,如果录入的id在数组中不存在,需要重新录入
查询学生: 将数组中存储的所有学生的信息输出到控制台
使用分类思想,分包思想完成
4.2.2实现步骤
环境搭建实现步骤
包 存储的类 作用 com.itheima.edu.info.manager.domain Student.java 封装学生信息 com.itheima.edu.info.manager.dao StudentDao.java 访问存储数据的数组,进行赠删改查(库管) com.itheima.edu.info.manager.service StudentService.java 业务的逻辑处理(业务员) com.itheima.edu.info.manager.controller StudentController.java 和用户打交道(客服接待) com.itheima.edu.info.manager.entry InfoManagerEntry.java 程序的入口类,提供一个main方法 菜单搭建实现步骤
需求
黑马管理系统菜单搭建
- 思路:用输出语句完成主界面的编写
- 用Scanner实现键盘录入数据
- 用switch语句完成操作的选择
学生管理系统菜单搭建
- 注意:此处的退出,是回退到上级菜单,并不是将整个程序结束掉
实现步骤
展示欢迎页面,用输出语句完成主界面的编写
获取用户的选择,用Scanner实现键盘录入数据
根据用户的选择执行对应的操作,用switch语句完成操作的选择
添加功能实现步骤

添加功能优化:判断id是否存在

查询功能实现步骤

删除功能实现步骤

修改功能实现步骤

系统优化
把updateStudent和deleteStudentById中录入学生id代码抽取到一个方法(inputStudentId)中 该方法的主要作用就是录入学生的id,方法的返回值为String类型
把addStudent和updateStudent中录入学生信息的代码抽取到一个方法(inputStudentInfo)中 该方法的主要作用就是录入学生的信息,并封装为学生对象,方法的返回值为Student类型
5.static关键字
5.1static关键字概述 (理解)
static 关键字是静态的意思,是Java中的一个修饰符,可以修饰成员方法,成员变量
5.2static修饰的特点 (记忆)
被static修饰的成员,
被类的所有对象共享
是我们判断是否使用静态关键字的条件
随着类的加载而加载,优先于对象存在
对象需要类被加载后,才能创建
- 多了一种调用方式:
可以通过类名调用
也可以通过对象名调用、、 推荐使用类名调用
5.3static关键字注意事项 (理解)
静态是随着类的加载而加载,优先于对象存在
非静态需要在创建对象之后,才可以进行使用
静态方法只能访问静态的成员(成员变量,成员方法)
非静态方法可以访问静态的成员,也可以访问非静态的成员
静态方法中是没有this关键字
this:当前对象的引用 静态存在的时候,对象可能还没有被创建
4.2.3代码实现
学生类
package com.itheima.edu.info.manager.domain;
public class Student {
private String id;
private String name;
private String age;
private String birthday;
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类
package com.itheima.edu.info.manager.entry;
import com.itheima.edu.info.manager.controller.StudentController;
import java.util.Scanner;
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("老师管理");
break;
case "3":
System.out.println("感谢您的使用");
//退出当前正在运行的JVM虚拟机
System.exit(0);
break;
default:
System.out.println("您的输入有误,请重新输入");
break;
}
}
}
}
StudentController类
package com.itheima.edu.info.manager.controller; import com.itheima.edu.info.manager.domain.Student;
import com.itheima.edu.info.manager.service.StudentService; import java.util.Scanner; public class StudentController {
// 3. 将学生对象,传递给StudentService(业务员)中的addStudent方法
private StudentService studentService=new StudentService(); private Scanner sc=new Scanner(System.in);
//开启学生管理系统,并展示学生管理系统菜单
public void start() {
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();
//调用业务员中的deleteStudentById根据id,删除学生
studentService.deleteStudentById(delId);
//提示:删除成功
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\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() { 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); 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();
//2.将学生信息封装为学生对象
Student stu=new Student();
stu.setId(id);
stu.setName(name);
stu.setAge(age);
stu.setBirthday(birthday);
return stu;
}
}
StudentService类
package com.itheima.edu.info.manager.service; import com.itheima.edu.info.manager.dao.StudentDao;
import com.itheima.edu.info.manager.domain.Student; 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类
package com.itheima.edu.info.manager.dao;
import com.itheima.edu.info.manager.domain.Student;
public class StudentDao {
// 创建学生对象数组
private static Student[] stus=new Student[5];
public boolean addStudent(Student stu) {
// 添加学生方法 思路:将对象存入到数组中null元素对应的索引位置
// 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.itheima.edu.info.manager.domain Student.java Teacher.java 封装学生信息 封装老师信息 com.itheima.edu.info.manager.dao StudentDao.java TeacherDao.java 访问存储数据的数组,进行赠删改查(库管) com.itheima.edu.info.manager.service StudentService.java TeacherService.java 业务的逻辑处理(业务员) com.itheima.edu.info.manager.controller StudentController.java TeacherController.java 和用户打交道(客服接待) com.itheima.edu.info.manager.entry InfoManagerEntry.java 程序的入口类,提供一个main方法 菜单搭建实现步骤
展示欢迎页面,用输出语句完成主界面的编写
获取用户的选择,用Scanner实现键盘录入数据
根据用户的选择执行对应的操作,用switch语句完成操作的选择
添加功能实现步骤

查询功能实现步骤

删除功能实现步骤

修改功能实现步骤

系统优化
把updateTeacher和deleteTeacherById中录入老师id代码抽取到一个方法(inputTeacherId)中 该方法的主要作用就是录入老师的id,方法的返回值为String类型
把addTeacher和updateTeacher中录入老师信息的代码抽取到一个方法(inputTeacherInfo)中 该方法的主要作用就是录入老师的信息,并封装为老师对象,方法的返回值为Teacher类型
4.3.3代码实现
老师类
package com.itheima.edu.info.manager.domain;
public class Teacher {
private String id;
private String name;
private String age;
private String birthday;
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类
package com.itheima.edu.info.manager.controller; import com.itheima.edu.info.manager.domain.Student;
import com.itheima.edu.info.manager.domain.Teacher;
import com.itheima.edu.info.manager.service.TeacherService; import java.util.Scanner; 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 updateId = inputTeacherId();
Teacher newTeacher = inputTeacherInfo(updateId);
//调用业务员的修改方法
teacherService.updateTeacher(updateId,newTeacher);
System.out.println("修改成功");
} //删除老师
public void deleteTeacherById() {
String delId = inputTeacherId();
//调用业务员中的deleteStudentById根据i
//,删除老师
teacherService.deleteTeacherById(delId);
//提示:删除成功
System.out.println("删除成功");
} //查询老师
public void findAllTeacher() {
//1.从业务员中获取老师对象数组
Teacher[] teachers=teacherService.findAllTeacher();
//判断数组中是否有元素
if (teachers == null) {
System.out.println("查无信息,请添加后重试");
return;
} //3.遍历数组,获取学生信息,并打印在控制台
System.out.println("学号\t\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);
if (exists) {
System.out.println("id已被占用,请重新输入");
}else{
break;
}
}
Teacher t = inputTeacherInfo(id); //5.将封装好的老师对象,传递给TeacherService继续完成添加操作
boolean result=teacherService.addTeacher(t);
if (result ) {
System.out.println("添加成功");
}else{
System.out.println("添加失败");
} }
//录入老师id
public String inputTeacherId(){
String id;
while(true){
//键盘接收要删除的老师id
System.out.println("请输入id");
id=sc.next();
boolean exists = teacherService.isExists(id);
if (!exists ) {
System.out.println("您输入的id不存在,请重新输入:");
}else{
break;
}
}
return id;
}
//录入老师信息,封装为老师对象类型
public Teacher inputTeacherInfo(String id){
//3.接受老师的其他信息
System.out.println("请输入老师的姓名");
String name=sc.next();
System.out.println("请输入老师的年龄");
String age=sc.next();
System.out.println("请输入老师的生日");
String birthday=sc.next();
//封装为老师对象
Teacher t=new Teacher();
t.setId(id);
t.setName(name);
t.setAge(age);
t.setBirthday(birthday);
return t;
}
}
TeacherService类
package com.itheima.edu.info.manager.service; import com.itheima.edu.info.manager.dao.TeacherDao;
import com.itheima.edu.info.manager.domain.Teacher; public class TeacherService { //创建库管对象
private TeacherDao teacherDao=new TeacherDao();
public boolean addTeacher(Teacher t) {
return teacherDao.addTeacher(t);
} public boolean isExists(String id) {
//1.获取库管对象中的数组
Teacher[] teachers=teacherDao.findAllTeacher();
boolean exists=false;
//2.遍历数组,取出每一个元素,进行判断
for (int i = 0; i < teachers.length; i++) {
Teacher teacher=teachers[i];
if (teacher != null&&teacher.getId().equals(id)) {
exists=true;
break;
}
}
return exists;
} public Teacher[] findAllTeacher() {
Teacher[] allTeacher = teacherDao.findAllTeacher();
boolean flag=false;
for (int i = 0; i < allTeacher.length; i++) {
Teacher t=allTeacher[i];
if (t != null) {
flag=true;
break;
}
}
if (flag == true) {
return allTeacher;
}else{
return null;
}
} public void deleteTeacherById(String delId) {
teacherDao.deleteTeacherById(delId);
} public void updateTeacher(String updateId, Teacher newTeacher) {
teacherDao.updateTeacher(updateId,newTeacher);
}
}
TeacherDao类
package com.itheima.edu.info.manager.dao;
import com.itheima.edu.info.manager.domain.Teacher;
import java.awt.geom.Area;
public class TeacherDao {
//创建一个Teacher数组
private static Teacher[] teachers = new Teacher[5];
public boolean addTeacher(Teacher t) {
//需要把t对象 扔到数组里面去 ,扔到哪一个索引位置呢
int index = -1;
for (int i = 0; i < teachers.length; i++) {
Teacher teacher = teachers[i];
if (teacher == null) {
index = i;
break;
}
}
if (index == -1) {
return false;
} else {
teachers[index] = t;
return true;
}
}
public Teacher[] findAllTeacher() {
return teachers;
}
public void deleteTeacherById(String delId) {
int index = getIndex(delId);
//将该索引位置的元素使用null进行替换
teachers[index] = null;
}
//1.查询id在集合中的索引位置
public int getIndex(String id) {
int index = -1;
for (int i = 0; i < teachers.length; i++) {
Teacher t = teachers[i];
if (t != null && t.getId().equals(id)) {
index = i;
break;
}
}
return index;
}
public void updateTeacher(String updateId, Teacher newTeacher) {
int index = getIndex(updateId);
teachers[index] = newTeacher;
}
}
16.分类和static的更多相关文章
- 给ubuntu设置静态ip —— How to set static IP Address in Ubuntu Server 16.04
原文: http://www.configserverfirewall.com/ubuntu-linux/ubuntu-set-static-ip-address/ ----------------- ...
- static讲解
static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被stati ...
- 考查嵌入式C开发人员的最好的16道题
约定: 1) 下面的测试题中,认为所有必须的头文件都已经正确的包含了 2)数据类型 char 一个字节 1 byte int 两个字节 2 byte ( ...
- PHP无限极分类的几种方法
导读:项目开发,经常栏目要做到无限极分类,几种方法PHP无限极分类的几种方法 复制代码 代码如下:namespace Util;class Category{static public functio ...
- 无限极分类class
class Category { /** * 返回一维数组 * @static * @param array $cate 要递归的数组 * @param string $html 子级分类前要显示的缩 ...
- 在不同语言中static的用法
static (计算机高级语言) 编辑 像在VB,C#,C,C++,Java,PHP中我们可以看到static作为关键字和函数出现,在其他的高级计算机语言如FORTRAN.ALGOL.COBOL.BA ...
- iOS分类底层实现原理小记
摘要:iOS分类底层是怎么实现的?本文将分如下四个模块进行探究分类的结构体编译时的分类分类的加载总结本文使用的runtime源码版本是objc4-680文中类与分类代码如下//类@interfaceP ...
- 【Java并发编程】16、ReentrantReadWriteLock源码分析
一.前言 在分析了锁框架的其他类之后,下面进入锁框架中最后一个类ReentrantReadWriteLock的分析,它表示可重入读写锁,ReentrantReadWriteLock中包含了两种锁,读锁 ...
- 对2个hex(16进制)字符串进行异或操作
private static String hexXOR(String hex1, String hex2){ BigInteger i1 = new BigInteger(hex1, 16); Bi ...
随机推荐
- JPEG解码——(6)IDCT逆离散余弦变换
本篇是该系列的第六篇,承接上篇IZigZag变换,介绍接下来的一个步骤--逆离散余弦变换,即逆零偏置前的一个步骤. 该步骤比较偏理论,其业务是对IZigZag变换后的数据,再进一步的处理,使其恢复DC ...
- 工具 | Typora + PicGo-Core 自动上传图片到图床
0 前言 Markdown 是现在十分流行的标记式语言,在博客等很多场景中应用十分广泛.众所周知,Markdown 中的图片是以链接的形式存在的,不像 Word 等传统文本编辑器直接把图片嵌入文档中. ...
- mysql大于当前时间置顶并按升序排序,小于当前时间的置尾并按降序排序
现在用id来代替时间这样好测试 看一下测试表数据 执行按需求规则排序的sql SELECT * FROM number_generator ORDER BY id < 16 , IF(id &l ...
- MySQL提升笔记(1):MySQL逻辑架构
深入学习MySQL,从概览MySQL逻辑架构开始. 首先来看一下MySQL的逻辑架构图: MySQL逻辑架构大概可以分为三层: 客户端:最上层的服务并不是MySQL所独有的,大多数基于网络的客户端/服 ...
- 201871030127-王明强 实验二 个人项目—《D{0-1}背包问题 》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 (1)详细阅读<构建之法>学习并掌握PSP的具体流程(2)掌握背包问题,通过查阅相关资料,设计一个采用 ...
- oo第二单元——多线程魔鬼电梯
在初步认识了面向对象思想后,立刻进入了多线程的学习,本单元的难点主要是锁的理解,需要保证线程安全的同时防止死锁的发生,也要尽可能缩小锁的范围,提高性能.这一单元以电梯为载体,让我们从生活出发,从电梯运 ...
- Kubernetes 学习笔记-- kafka往couchdb里倒东西
首先吐槽下国内这些论坛的技术精神,不是我崇洋媚外,有些复读机烦不烦啊,别人的东西吃进去吐出来好玩么? 还有一些不懂装懂,这种最可恶,明明自己都不明白自己在写什么,还是往精华区发,简直离谱,知道自己多挣 ...
- 磁盘挖矿时代开启——GitHub 热点速览 v.21.16
作者:HelloGitHub-小鱼干 本周的 GitHub 热点非常经常,因为一贫如洗的小鱼干突然发现了发家致富之道:磁盘挖矿.chia-blockchain 是一个将磁盘作为计算资源的项目,简而言之 ...
- 次小生成树 详解及模板 (仅kruskal)
思路 关于次小生成树,首先求出最小生成树,然后枚举每条不在最小生成树上的边(在原本的节点上添加一个vis属性进行判断即可),并把这条边放到最小生成树上面,然后就一定会形成环,那么我们在这条环路中取出一 ...
- 并发编程之ThreadLocal
并发编程之ThreadLocal 前言 当多线程访问共享可变数据时,涉及到线程间同步的问题,并不是所有时候,都要用到共享数据,所以就需要线程封闭出场了. 数据都被封闭在各自的线程之中,就不需要同步,这 ...