当前位置: 首页 > news >正文

Java-学生管理系统[初阶]

这次我们来尝试使用Java实现一下"学生管理系统",顾名思义,就是实现一个能用来管理学生各种数据的系统。在后续学习中我们将对"学生管理系统"进行两种实现

📚 学生管理系统[初阶](不带模拟登录系统)

📚 学生管理系统[进阶](附带模拟登录系统)

在这篇文章学习实现"学生管理系统"之前,需要我们了解并学习过以下知识点:

📕 Java的输入输出

📕 Java的分支循环

📕 Java的数组

📕 Java的方法(定义 调用 重载)

📕 Java的初阶面向对象(类和对象 构造方法)

📕 Java的集合(基本使用)

一、学生管理系统[初阶]

在创建"学生管理系统"之前,我们需要知道这个系统要拥有哪些功能

① 在系统中添加学生

② 在系统中删除学生

③ 在系统中修改某学生信息

④ 对学生的信息进行查询(打印)

⑤ 退出学生管理系统

(注意:要求学生拥有"id","名字","年龄","成绩"四个属性)

① 创建学生类

那么既然是"学生"管理系统,我们自然要创建一个"学生类"用来代表学生:

对着"src"点击鼠标右键。

然后New一个JavaClass

取名为"Student"。

这样我们就可以在该文件中创建Student类啦

public class Student {private String id;private String name;private int age;private double score;
}

这里我们分享一个IDEA的小技巧

我们先按"NumLk"按键将键盘右侧的数字小键盘关闭,然后按住"ALT"+"INSERT"键:

点击Constructor: 

点击Shift全选中:

这样就会直接出现一个带参构造

但是创建了带参构造后,我们还得补充一个默认的无参构造才行,于是重复刚刚的步骤不选参数:

这样无参构造也完成啦~

然后我们接下来选择Getter and Setter

仍然全选:

这样Student的所有属性的get和set就都自动补全啦:

② 创建系统菜单

完成Student类的创建后,我们再回到Main文件中:

我们先写出一个基本的菜单

然后我们要知道,进行选择需要进行数据的输入,再分别判断是否为"1","2","3","4","5"来进行对应的操作,那么此时我们就可以使用switch语句

我们来运行一下

我们可以看到,明明我们想要的应该是重新选择而此时却结束了,那我们就可以在外面套用一层while循环

再次运行

虽然可以重复选择了,但好像...停不下来了?这是因为break就近原则:

我们可以看到:break离switch比while更近,所以break会优先跳出switch这个语句,从而导致了while一直循环。其实想解决这个问题也很简单,我们可以给while起个名字,然后让break指定跳出while就好了

再次调试:

这样就退出成功啦~

③ 对学生的信息进行查询(打印)

想要对学生的信息进行打印,我们就要确保有数据来存储学生的信息,并且能够随时进行存储,取出,删除。而进行此类工作,最最合适的也就是"集合"!!那么让我们现在创建一个学生类的集合

(注:String数组也能够实现该功能,但相较于"集合",代码量会多出一些,并且也没有"集合"便于理解,不过想尝试的小伙伴们也可以尝试一下,就当对String的用法训练了嘛~)

这样就创建好了~

然后我们进行"查询学生"的方法实现:

📌 要求

📕 如果集合中没有学生,则查询失败。

📕 如果集合中有学生,则显示学生信息。

📚 方法实现

    public static void print(ArrayList<Student> stu) {System.out.println("查询学生");if(stu.size() == 0){System.out.println("目前系统中暂无学生!");}for (int i = 0; i < stu.size(); i++) {Student s = stu.get(i);System.out.println("id:" +String.format("%-8s",s.getId())+"姓名:"+String.format("%-8s",s.getName()) +"年龄:"+String.format("%-8d",s.getAge()) +String.format("%-8.2f",s.getScore())+ "成绩:");}}

实现思路

📕 当传进方法的集合"stu"长度为0时,代表集合中没有学生,于是则不打印学生。

📕 当传进方法的集合"stu"长度大于0时,代表集合中有学生,于是对学生进行打印。我们使用for循环,每一次循环都将集合中对应的"学生"取出,然后对数据进行打印,直到循环结束。

(待会儿完成"在系统中添加学生"方法后,与该功能一起演示~) 

在系统中添加学生

完成最简单的查询功能后,我们来完成稍微复杂一点"添加学生"功能:

📌 要求

📕 传入的 id 必须唯一 (如果有重复则传输失败)

📚 方法实现

通过要求我们可以得知,要完成此方法我们还需要知道传入id是否唯一,那么我们在写该方法前,先写出另一个用于实现"判断方法是否唯一"的方法

    public static int findnum(ArrayList<Student> stu,String id1) {for (int i = 0; i < stu.size(); i++) {Student s = stu.get(i);if(s.getId().equals(id1)){return i;}}return -1;}

思路:我们将集合"id1"都传入方法"findnum"中,遍历集合中的"学生类"

如果"id"与"id1"重复的,就说明此学生已存在,返回"i",添加失败。

如果没有"id"与"id1"重复的,就说明此学生未存在,返回"-1",添加成功。

(注意,查找id时使用的不是 " == ",而是" equals() ",这是因为对于String类进行比较时,只有同为初始化时才能够成功比较,如果String是new出来的,那么就无法进行比较。因为" == "比较String时,本质是比较地址,而" equals() "比较的才是内容)。

📌 注意:此方法非常重要!!!

因为后续我们在完成"在系统中修改某学生信息"方法时,还需要获取"对应学生的下标"才能够修改,而此方法不仅能够通过返回值的正负确定学生是否存在,还能够直接返回学生对应的下标

那么接下来,我们完成"在系统中添加学生"方法:

    public static void add(ArrayList<Student> stu) {System.out.println("添加学生");Scanner in = new Scanner(System.in);while (true) {System.out.println("请输入学生id:");String id1 = in.next();if(findnum(stu,id1) >= 0){System.out.println("该学生已经存在,请重新输入");continue;}System.out.println("请输入学生姓名:");String name1 = in.next();System.out.println("请输入学生年龄:");int age1 = in.nextInt();System.out.println("请输入学生成绩:");double score1 = in.nextDouble();Student s = new Student(id1,name1,age1,score1);stu.add(s);System.out.println("学生添加成功");break;}}

实现思路

📕 首先输入学生id,并通过"finenum"方法传回的值来确认该学生是否存在于"集合"中。

📕 (如果返回值 >=0 代表在"集合"中通过"id"找到了该学生,则添加失败,重新输入id)

📕 (如果返回值 <0 代表在"集合"中没能通过"id"找到该学生,则添加成功,继续输入剩余数据)

📕 创建一个临时使用的"学生"将新数据传递给"学生",再通过学生添加到集合中

那么写了这么久~让我们调试一下,看看我们的"学生管理系统"现在的两个功能是否有误吧~

当我们输入错误时,能够成功的循环进行再次输入。

当没有学生的时候,查询学生能正确显示。

那么接下来我们对"添加学生""信息查询"进行检测:

我们可以看到,查询学生和添加学生的功能是无误滴~

至此,两种方法成功~

⑤ 在系统中删除学生

📌 要求

📕 若id存在则进行删除

📕 若id不存在,则不删除,重新输入。

📚 方法实现

    public static void delete(ArrayList<Student> stu) {Scanner in = new Scanner(System.in);System.out.println("删除学生");while (true) {System.out.println("请输入学生id:");String id1 = in.next();int num = findnum(stu,id1);if(num >= 0){System.out.println("删除成功!");stu.remove(num);break;}else if(num < 0){System.out.println("未找到该学生,请重新输入");}}}

实现思路

📕 通过之前创建的"findnum"方法来确认是否存在该"学生"。

📕 (如果返回值 >=0 代表在"集合"中通过"id"找到了该学生,则删除成功)

📕 (如果返回值 <0 代表在"集合"中没能通过"id"找到该学生,则删除失败)

我们可以看到,删除方法也是没有问题的~

⑥ 在系统中修改某学生信息

接下来就要进行"学生管理系统[初阶]"中,四个功能中最难的一个功能的实现啦~不怕不怕,也没"最难"那么可怕啦~"难"这种词语,还是留着下一次做进阶版时再说也不迟~

📌 要求

📕 如果id存在,则进行新数据的传入

     (新数据的传入需要保证,新的 id 不与集合中现有其他学生 id 重复)

📕 如果id不存在,则重新输入

📚 方法实现

    public static void revise(ArrayList<Student> stu){Scanner in = new Scanner(System.in);System.out.println("修改学生");while(true){System.out.println("请输入学生id:");String id1 = in.next();int num = findnum(stu,id1);if(num < 0){System.out.println("未找到此id的学生,请重新输入:");}else{System.out.println("请输入学生新的id:");String id2 = in.next();int num1 = findnum(stu,id2);if(num1 >= 0) {System.out.println("此id已经拥有,请重新输入:");}else{System.out.println("请输入学生新的姓名:");String name1 = in.next();System.out.println("请输入学生新的年龄:");int age1 = in.nextInt();System.out.println("请输入学生新的成绩:");double score1 = in.nextDouble();Student s = new Student(id2,name1,age1,score1);stu.set(num,s);System.out.println("学生修改成功");break;}}}}

实现思路

📕 先输入学生id,然后仍然是使用findnum方法来查找是否存在该学生:

📕 (如果返回值 >=0 代表在"集合"中通过"id"找到了该学生,则进行新数据的输入):

      (输入新的id,再用findnum进行查找,如果能找到该id,则告知"此id重复,请重新输入")

      (如果找不到该id,则此id为新学生id,然后继续修改其余数据)

📕 (如果返回值 <0 代表在"集合"中没能通过"id"找到该学生,则修改失败,重新输入)

那么最后让我们调试一下吧~:

没有任何滴失误~

那么关于"学生管理系统[初阶]"就完成啦~如果有哪里讲解的不够清楚,或者有的地方还能再加改进,还请各位在评论区多多指出。而关于"学生管理系统[进阶](模拟登录)"我们将在下一篇文章中进行讲解,大家敬请期待啦~

双手奉上源码!!!:

Student.java

public class Student {private String id;private String name;private int age;private double score;public Student(String id, String name, int age, double score) {this.id = id;this.name = name;this.age = age;this.score = score;}public Student() {}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 double getScore() {return score;}public void setScore(double score) {this.score = score;}
}

Main.java

import java.sql.SQLOutput;
import java.util.*;
import java.util.stream.StreamSupport;
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);ArrayList<Student> stu = new ArrayList<>();outside :while (true) {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("请输入你的选择:");String num = in.next();switch (num){case "1" -> add(stu);case "2" -> delete(stu);case "3" -> revise(stu);case "4" -> print(stu);case "5" -> {System.out.println("退出学生管理系统");break outside;}default -> System.out.println("输入错误,请重新选择");}}}public static void add(ArrayList<Student> stu) {System.out.println("添加学生");Scanner in = new Scanner(System.in);while (true) {System.out.println("请输入学生id:");String id1 = in.next();if(findnum(stu,id1) >= 0){System.out.println("该学生已经存在,请重新输入");continue;}System.out.println("请输入学生姓名:");String name1 = in.next();System.out.println("请输入学生年龄:");int age1 = in.nextInt();System.out.println("请输入学生成绩:");double score1 = in.nextDouble();Student s = new Student(id1,name1,age1,score1);stu.add(s);System.out.println("学生添加成功");break;}}public static void delete(ArrayList<Student> stu) {Scanner in = new Scanner(System.in);System.out.println("删除学生");while (true) {System.out.println("请输入学生id:");String id1 = in.next();int num = findnum(stu,id1);if(num >= 0){System.out.println("删除成功!");stu.remove(num);break;}else if(num < 0){System.out.println("未找到该学生,请重新输入");}}}public static void revise(ArrayList<Student> stu){Scanner in = new Scanner(System.in);System.out.println("修改学生");while(true){System.out.println("请输入学生id:");String id1 = in.next();int num = findnum(stu,id1);if(num < 0){System.out.println("未找到此id的学生,请重新输入:");}else{System.out.println("请输入学生新的id:");String id2 = in.next();int num1 = findnum(stu,id2);if(num1 >= 0) {System.out.println("此id已经拥有,请重新输入:");}else{System.out.println("请输入学生新的姓名:");String name1 = in.next();System.out.println("请输入学生新的年龄:");int age1 = in.nextInt();System.out.println("请输入学生新的成绩:");double score1 = in.nextDouble();Student s = new Student(id2,name1,age1,score1);stu.set(num,s);System.out.println("学生修改成功");break;}}}}public static void print(ArrayList<Student> stu) {System.out.println("查询学生");if(stu.size() == 0){System.out.println("目前系统中暂无学生!");}for (int i = 0; i < stu.size(); i++) {Student s = stu.get(i);System.out.println("id:" +String.format("%-8s",s.getId())+"姓名:"+String.format("%-8s",s.getName()) +"年龄:"+String.format("%-8d",s.getAge()) +"成绩:"+String.format("%-8.2f",s.getScore()));}}public static int findnum(ArrayList<Student> stu,String id1) {for (int i = 0; i < stu.size(); i++) {Student s = stu.get(i);if(s.getId().equals(id1)){return i;}}return -1;}
}

相关文章:

Java-学生管理系统[初阶]

这次我们来尝试使用Java实现一下"学生管理系统"&#xff0c;顾名思义&#xff0c;就是实现一个能用来管理学生各种数据的系统。在后续学习中我们将对"学生管理系统"进行两种实现&#xff1a; &#x1f4da; 学生管理系统[初阶](不带模拟登录系统) &#…...

微信小程序 详情图片预览功能实现详解

详情图片预览功能实现详解 在开发微信小程序时&#xff0c;我们经常需要实现点击商品图片进行全屏预览的功能。这不仅提升了用户体验&#xff0c;还允许用户进行保存图片、发送给朋友等操作。本文将详细介绍如何实现这一功能。 思路分析 当用户在商品详情页点击图片时&#…...

LeetCode 48 Rotate Image 解题思路和python代码

题目&#xff1a; You are given an n x n 2D matrix representing an image, rotate the image by 90 degrees (clockwise). You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and …...

余承东直播论道智能驾驶:激光雷达不可或缺,华为ADS 3.0引领安全创新

华为余承东:激光雷达,智能驾驶安全性的关键 9月29日,华为消费者业务集团CEO余承东在一场引人注目的直播中,与知名主持人马东就智能驾驶技术的最新进展进行了深入交流。在这场直播中,余承东针对激光雷达在智能驾驶中的必要性问题,发表了明确且深刻的观点,引发了业界和公众…...

51WORLD携手浙江科技大学,打造智慧校园新标杆

当前&#xff0c;国家教育数字化战略行动扎实推进&#xff0c;高等教育数字化转型步伐加快。 紧抓数字教育发展战略机遇&#xff0c;浙江科技大学联合51WORLD、正方软件股份有限公司&#xff08;简称&#xff1a;正方软件&#xff09;&#xff0c;共同研发打造浙科大孪生数智校…...

SAP SD学习笔记09 - 受注传票中的不完全Log 和 Business Partner(取引先机能)

好久没写SD了&#xff0c;今天继续写。 上一章讲了SD的如下知识 - SD的售前的流程&#xff08;引合和見積&#xff08;询价和报价&#xff09;&#xff09; - 数据流的概念&#xff0c;主要就是后传票可以参照前传票&#xff0c;以实现数据的流动&#xff0c;减少输入 - Co…...

【ROS2】里程计(odometry)数据计算、发布

1、里程计消息 1.1 Odometry消息 消息描述:nav_msgs::msg::Odometry 是ROS2中用发布里程计信息的消息,包括:线速度、角速度、位置和朝向 消息路径:/opt/ros/humble/share/nav_msgs/msg/Odometry.msg 消息内容: # 包含父ID std_msgs/Header header# 子ID,即姿势所在的坐…...

AcWing 187 导弹防御系统 暴搜

代码 #include <bits/stdc.h> #define int long long using namespace std;const int N 200010, mod 1e9 7;int n, m, k, x, y, z, ans, t, depth; int w[N], f[N]; int up[N], down[N];bool dfs(int depth, int u, int su, int sd) {if (su sd > depth) return …...

SpringSecurity(三)——自定义优化器

在SpringSecurity中&#xff0c;如果我们在认证或者授权的过程中出现了异常会被ExceptionTranslationFilter捕 获到。在ExceptionTranslationFilter中会去判断是认证失败还是授权失败出现的异常。 一、自定义验证异常类 创建exception包&#xff0c;在exception包下创建自定义…...

STM32通用定时器TIM3的PWM输出实验配置步骤

通用定时器 PWM 输出实验 本小节我们来学习使用通用定时器的 PWM 输出模式。 脉冲宽度调制(PWM)&#xff0c;是英文“Pulse Width Modulation”的缩写&#xff0c;简称脉宽调制&#xff0c;是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。我们可以让定时…...

device tree 预研

linux kernel 引入 dts 的背景 http://www.wowotech.net/linux_kenrel/why-dt.html 什么是 device tree ​ device tree 是一种描述硬件资源的数据结构。device tree 可以描述的信息包括 cpu 的数量和类别、内存基地址和大小、clock 控制器和 clock 使用情况、外设基地址以及…...

英伟达股价分析:英伟达股价能否上涨到150美元,接下来该如何操作?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经​ 猛兽财经核心观点&#xff1a; &#xff08;1&#xff09;华尔街投行Oppenheimer已将英伟达的目标价上调到了150美元。 &#xff08;2&#xff09;产品方面的最新进展和合作伙伴关系进一步提升了英伟达的市场地位。 &…...

Rust 快速入门(一)

Rust安装信息解释 cargo&#xff1a;Rust的编译管理器、包管理器、通用工具。可以用Cargo启动新的项目&#xff0c;构建和运行程序&#xff0c;并管理代码所依赖的所有外部库。 Rustc&#xff1a;Rust的编译器。通常Cargo会替我们调用此编译器。 Rustdoc&#xff1a;是Rust的…...

java 程序在服务器出现时区错误问题(使用Date,LocalDateTime,ZonedDateTime都不正确)

排查 查询系统时区信息 timedatectl status打印java的时区信息 import java.util.TimeZone;public class CheckTimeZone {public static void main(String[] args) {TimeZone defaultTimeZone TimeZone.getDefault();System.out.println("Default TimeZone ID: "…...

Kotlin 语言的协程是什么?

目录 1. 什么是协程 2. 协程的基本概念 3. 如何使用协程 3.1. 引入依赖 3.2. 启动协程 3.3. 使用挂起函数 4. 结构化并发 5. 处理异常 6. 总结 Kotlin 的协程是一种轻量级的线程&#xff0c;可以用于简化异步编程。它允许你以顺序的方式编写异步代码&#xff0c;从而提…...

uniapp 游戏 - 使用 uniapp 实现的扫雷游戏

0. 思路 1. 效果图 2. 游戏规则 扫雷的规则很简单。盘面上有许多方格,方格中随机分布着一些雷。你的目标是避开雷,打开其他所有格子。一个非雷格中的数字表示其相邻 8 格子中的雷数,你可以利用这个信息推导出安全格和雷的位置。你可以用右键在你认为是雷的地方插旗(称为标…...

LeetCode组合总和

题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被…...

MATLAB - 机械臂手眼标定(眼在手内) - 估计安装在机器人上的移动相机的姿态

系列文章目录 前言 本示例展示了如何为装有手眼构型摄像头的机械臂或机械手执行和验证手眼校准。 一、概述 执行手眼校准有助于操作配备末端执行器&#xff08;简称 “手”&#xff09;的机械臂&#xff0c;该末端执行器依赖于摄像头提供的视觉数据。一旦完成了眼在手外的校准&…...

【Unity】TextMeshPro 3.0.9无法显示emoji表情问题

需要下载TextMeshPro 3.2.x-pre.xxx版本&#xff0c;重新生成Sprite Asset文件解决 注意&#xff1a;若Package Manager没有搜到pre版本&#xff0c;那么可以去github下载到本地&#xff0c;再解压后&#xff0c;将文件夹移动到工程Packages文件夹下&#xff0c;然后打开Packa…...

金九银十软件测试面试题(800道)

今年你的目标是拿下大厂offer&#xff1f;还是多少万年薪&#xff1f;其实这些都离不开日积月累的过程。 为此我特意整理出一份&#xff08;超详细笔记/面试题&#xff09;它几乎涵盖了所有的测试开发技术栈&#xff0c;非常珍贵&#xff0c;人手一份 肝完进大厂 妥妥的&#…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...