文章目录
- 1. Linux 与 Docker
- Linux 基本指令
- VMware 安装 CentOS
- Docker 拉取镜像创建容器、部署 Spring Boot 项目
- 2. 关系型数据库 MySQL
- 数据库语法
- 多表关联查询
- 数据库索引
- 3. 事务与死锁
- 事务的隔离级别
- 死锁的原因和避免方法
- 4. 排序算法与数据结构
- 二分查找
- 快速排序
- 常见数据结构
- 5. Java 语言基础
- 面向对象编程思想
- 常用集合框架
- 6. 多线程并发知识
- 多线程的生命周期
- 线程创建的方式
- 线程池的原理和核心参数
- 7. Java 反射和注解编程
- Java 反射
- 注解编程
- 8. JVM 底层原理
- JVM 的生命周期
- 内存划分
- GC 算法
- 垃圾回收机制
- 双亲委派模型
- JVM 调优
- 9. Spring 框架与 MyBatis
- Spring IOC
- Spring AOP
- MVC 架构思想
- MyBatis 执行流程
- Spring Boot 整合 MyBatis、MyBatis-Plus 和 Redis
- 10. Redis 缓存
- Redis 数据类型
- 缓存持久化
- 缓存雪崩、缓存击穿、缓存穿透
- 11. 设计模式与原则
- 设计模式
- 设计原则
- 12. 项目管理工具
- Maven
- Git
- 13. ERP 与供应链管理
- ERP 企业管理软件
1. Linux 与 Docker
Linux 基本指令
Linux 作为开源操作系统,其指令是与系统交互的重要方式。ls
查看目录内容,系统会遍历指定目录下的所有文件和子目录,并将它们的信息显示出来。cd
切换目录时,系统会修改当前工作目录指针,指向新的目录。mkdir
创建新目录时,系统会在文件系统中分配相应的存储空间,并记录目录的元信息。
VMware 安装 CentOS
VMware 是一款虚拟机软件,它通过模拟计算机的硬件环境,让用户可以在一台物理机上同时运行多个不同的操作系统。安装 CentOS 时,VMware 会根据用户的配置为虚拟机分配内存、磁盘空间等资源,然后将 CentOS 系统安装到虚拟机的虚拟磁盘上。
Docker 拉取镜像创建容器、部署 Spring Boot 项目
Docker 是一种容器化技术,镜像相当于容器的模板,它包含了运行应用程序所需的所有文件、依赖和配置。当使用 docker pull
拉取镜像时,Docker 会从 Docker Hub 等镜像仓库下载镜像文件。创建容器时,Docker 会基于镜像创建一个独立的运行环境,容器之间相互隔离,互不影响。部署 Spring Boot 项目时,将项目打包成 Docker 镜像,然后创建并运行容器,就可以实现项目的快速部署和隔离运行。
2. 关系型数据库 MySQL
数据库语法
- DDL(数据定义语言):用于定义数据库、表、列等结构。例如
CREATE TABLE
语句,系统会根据语句中的定义在数据库中创建相应的表结构,包括表名、列名、数据类型、约束等。 - DML(数据操作语言):用于插入、更新和删除数据。
INSERT INTO
插入数据时,系统会将数据存储到指定表的相应列中。 - DQL(数据查询语言):用于查询数据。
SELECT * FROM
语句会从指定表中检索所有列的数据。 - DCL(数据控制语言):用于管理用户权限。
GRANT
语句会将指定的权限授予指定的用户或角色。
多表关联查询
当需要从多个表中获取相关数据时,就需要使用多表关联查询。例如,在学生表和成绩表中,通过学生 ID 关联,可以查询出每个学生的成绩信息。系统会根据关联条件将多个表中的数据进行匹配和组合,然后返回查询结果。
数据库索引
索引是一种数据结构,用于提高数据库查询的效率。B+ 树是 MySQL 中常用的索引结构,它将数据按照键值有序存储,通过树的结构可以快速定位到需要的数据。覆盖索引是指查询的列都在索引中,不需要回表查询,从而提高查询效率。联合索引是将多个列组合成一个索引,适用于经常同时查询多个列的场景。
3. 事务与死锁
事务的隔离级别
- 读未提交:一个事务可以读取另一个未提交事务的数据,可能会出现脏读问题,即读取到了其他事务回滚前的数据。
- 读已提交:一个事务只能读取另一个已提交事务的数据,避免了脏读问题,但可能会出现不可重复读问题,即同一个事务在不同时间读取到的数据不一致。
- 可重复读:在一个事务中,多次读取同一数据的结果是一致的,避免了不可重复读问题,但可能会出现幻读问题,即一个事务在读取数据时,另一个事务插入了新的数据,导致第一个事务再次读取时出现了新的数据。
- 串行化:事务串行执行,避免了所有并发问题,但会降低系统的并发性能。
死锁的原因和避免方法
死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种互相等待的现象。例如,事务 A 持有资源 X 并请求资源 Y,而事务 B 持有资源 Y 并请求资源 X,此时两个事务就会陷入死锁。避免死锁的方法包括合理安排事务执行顺序、减少事务持有资源的时间、使用锁超时机制等。
4. 排序算法与数据结构
二分查找
二分查找适用于有序数组,它的基本思想是将数组分成两部分,然后比较中间元素与目标元素的大小,如果中间元素等于目标元素,则查找成功;如果中间元素大于目标元素,则在左半部分继续查找;如果中间元素小于目标元素,则在右半部分继续查找。每次查找都能将查找范围缩小一半,因此时间复杂度为 O(log n)。
快速排序
快速排序是一种分治算法,它的基本思想是选择一个基准元素,将数组分成两部分,使得左边部分的元素都小于等于基准元素,右边部分的元素都大于等于基准元素,然后分别对左右两部分进行递归排序。快速排序的平均时间复杂度为 O(n log n)。
常见数据结构
- 数组:是一种连续存储的数据结构,通过下标可以快速访问数组中的元素,时间复杂度为 O(1)。
- 链表:是一种非连续存储的数据结构,每个节点包含数据和指向下一个节点的指针。链表的插入和删除操作效率较高,时间复杂度为 O(1),但访问元素的效率较低,时间复杂度为 O(n)。
- 栈:是一种后进先出(LIFO)的数据结构,只能在栈顶进行插入和删除操作。栈常用于实现函数调用栈、表达式求值等。
- 队列:是一种先进先出(FIFO)的数据结构,只能在队尾进行插入操作,在队头进行删除操作。队列常用于实现任务调度、消息队列等。
5. Java 语言基础
面向对象编程思想
- 封装:将数据和操作数据的方法封装在一个类中,对外提供统一的接口,隐藏内部实现细节,提高了代码的安全性和可维护性。
- 继承:允许一个类继承另一个类的属性和方法,子类可以扩展父类的功能,提高了代码的复用性。
- 多态:同一个方法可以根据对象的不同类型表现出不同的行为,通过方法重载和方法重写实现,提高了代码的灵活性和可扩展性。
常用集合框架
- ArrayList:是基于数组实现的动态数组,它可以自动扩容。当向 ArrayList 中添加元素时,如果数组容量不足,会创建一个更大的数组,并将原数组中的元素复制到新数组中。
- HashMap:是基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的某个位置,然后在该位置存储键值对。为了解决哈希冲突,HashMap 采用了链表或红黑树的方式。
6. 多线程并发知识
多线程的生命周期
多线程的生命周期包括新建、就绪、运行、阻塞和死亡五个状态。新建状态是指线程对象被创建但还没有调用 start()
方法;就绪状态是指线程已经准备好运行,等待获取 CPU 资源;运行状态是指线程正在执行;阻塞状态是指线程由于某些原因暂停执行,如等待 I/O 操作完成、等待锁等;死亡状态是指线程执行完毕或因异常终止。
线程创建的方式
- 继承
Thread
类:创建一个类继承Thread
类,并重写run()
方法,然后创建该类的对象并调用start()
方法启动线程。 - 实现
Runnable
接口:创建一个类实现Runnable
接口,并重写run()
方法,然后将该类的对象作为参数传递给Thread
类的构造函数,最后调用start()
方法启动线程。
线程池的原理和核心参数
线程池是一种管理线程的机制,它预先创建一定数量的线程,当有任务提交时,从线程池中获取一个空闲线程来执行任务。线程池的核心参数包括 corePoolSize
(核心线程数)、maximumPoolSize
(最大线程数)、keepAliveTime
(线程空闲时间)、workQueue
(任务队列)等。合理配置这些参数可以提高系统的性能和资源利用率。
7. Java 反射和注解编程
Java 反射
Java 反射是指在运行时动态获取类的信息并调用类的方法和属性的机制。通过反射,可以在运行时创建对象、调用方法、访问属性等。获取字节码对象的三种方式分别是 Class.forName()
、类名 .class
和对象 .getClass()
。Class.forName()
是通过类的全限定名在运行时动态加载类并获取字节码对象;类名 .class
是在编译时就确定了类的字节码对象;对象 .getClass()
是通过对象获取其所属类的字节码对象。
注解编程
注解是一种元数据,它可以为程序元素(类、方法、字段等)添加额外的信息。注解的生命周期包括 RetentionPolicy.SOURCE
(只在源码阶段保留)、RetentionPolicy.CLASS
(在编译阶段保留)和 RetentionPolicy.RUNTIME
(在运行时保留)。通过自定义注解并结合反射机制,可以实现一些特殊的功能,如自动配置、权限验证等。
8. JVM 底层原理
JVM 的生命周期
JVM 的生命周期包括启动、运行和结束三个阶段。启动阶段是指 JVM 加载并执行主类的 main()
方法;运行阶段是指 JVM 执行 Java 程序的过程;结束阶段是指 JVM 退出,可能是因为程序正常结束、出现异常或调用了 System.exit()
方法。
内存划分
- 堆:是 JVM 中最大的一块内存区域,用于存储对象实例。堆内存被划分为新生代和老年代,新生代又分为 Eden 区和两个 Survivor 区。
- 栈:每个线程都有自己的栈,用于存储局部变量、方法调用栈等信息。栈中的数据是线程私有的,随着线程的创建而创建,随着线程的结束而销毁。
- 方法区:用于存储类的信息、常量、静态变量等。在 JDK 1.8 之前,方法区也被称为永久代,JDK 1.8 之后,方法区被元空间取代。
GC 算法
- 标记 - 清除算法:首先标记出所有需要回收的对象,然后清除这些对象所占用的内存空间。该算法会产生内存碎片。
- 标记 - 整理算法:在标记出需要回收的对象后,将存活的对象向一端移动,然后清除边界以外的内存空间,避免了内存碎片的产生。
- 复制算法:将内存分为大小相等的两块,每次只使用其中一块。当这块内存用完后,将存活的对象复制到另一块内存中,然后清除原来的内存空间。该算法的效率较高,但会浪费一半的内存空间。
垃圾回收机制
垃圾回收机制是 JVM 自动管理内存的一种机制,它会定期检测并回收不再使用的对象所占用的内存空间。常见的垃圾回收器有 Serial 回收器、Parallel 回收器、CMS 回收器和 G1 回收器等。
双亲委派模型
双亲委派模型是 JVM 类加载的一种机制,它规定了类加载器在加载类时,首先会将加载请求委托给父类加载器,如果父类加载器无法加载该类,才会由当前类加载器自己加载。这种机制保证了类加载的安全性和唯一性,避免了不同类加载器加载同一个类的问题。
JVM 调优
JVM 调优是指通过调整 JVM 的参数,如堆内存大小、垃圾回收器类型等,来提高系统的性能和稳定性。例如,适当增大堆内存大小可以减少垃圾回收的频率,提高系统的响应速度。
9. Spring 框架与 MyBatis
Spring IOC
Spring IOC(控制反转)是 Spring 框架的核心特性之一,它通过容器来管理对象的创建和依赖注入。在传统的编程方式中,对象的创建和依赖关系的管理由程序员手动完成,而在 Spring IOC 中,这些工作由 Spring 容器负责。通过配置文件或注解的方式,将对象的创建和依赖关系告诉 Spring 容器,容器会在需要时自动创建对象并注入依赖,降低了代码的耦合度。
Spring AOP
Spring AOP(面向切面编程)是 Spring 框架的另一个重要特性,它允许在不修改原有代码的情况下,对程序的某些功能进行增强。AOP 通过将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,以切面的形式进行统一管理。在 Spring 中,AOP 主要通过代理模式实现,有基于 JDK 动态代理和 CGLIB 代理两种方式。
MVC 架构思想
MVC(Model-View-Controller)是一种软件设计模式,它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。模型负责处理业务逻辑和数据;视图负责展示数据;控制器负责接收用户的请求,调用模型进行处理,并将处理结果返回给视图进行展示。这种架构模式使得代码的结构更加清晰,易于维护和扩展。
MyBatis 执行流程
MyBatis 是一个持久层框架,它的执行流程大致如下:首先,通过配置文件或注解的方式定义 SQL 语句;然后,创建 SqlSessionFactory 对象,该对象用于创建 SqlSession 对象;接着,通过 SqlSession 对象执行 SQL 语句,获取结果集;最后,关闭 SqlSession 对象。
Spring Boot 整合 MyBatis、MyBatis-Plus 和 Redis
Spring Boot 是一个快速开发框架,它可以方便地整合其他框架。整合 MyBatis 时,需要配置数据源、Mapper 接口和 SQL 映射文件;整合 MyBatis-Plus 时,可以利用 MyBatis-Plus 提供的强大功能,如自动生成 CRUD 方法、分页查询等;整合 Redis 时,需要配置 Redis 连接信息,并使用 RedisTemplate 或 StringRedisTemplate 操作 Redis 缓存。
10. Redis 缓存
Redis 数据类型
- 字符串:是最基本的数据类型,可以存储任意类型的数据,如数字、字符串等。
- 哈希:用于存储键值对的集合,适合存储对象信息。
- 列表:是一个有序的字符串列表,可以在列表的两端进行插入和删除操作,常用于实现消息队列。
- 集合:是一个无序的字符串集合,不允许有重复元素,支持交集、并集、差集等操作。
- 有序集合:是一个有序的字符串集合,每个元素都有一个分数,通过分数进行排序,常用于实现排行榜等功能。
缓存持久化
Redis 提供了两种持久化方式:RDB(Redis Database)和 AOF(Append Only File)。RDB 是将 Redis 在某个时间点的数据快照保存到磁盘上,优点是文件体积小,恢复速度快;缺点是可能会丢失最后一次快照之后的数据。AOF 是将 Redis 的写操作以日志的形式追加到文件中,优点是数据安全性高,几乎不会丢失数据;缺点是文件体积大,恢复速度慢。
缓存雪崩、缓存击穿、缓存穿透
- 缓存雪崩:是指大量缓存同时失效,导致大量请求直接访问数据库,造成数据库压力过大甚至崩溃。可以通过设置不同的过期时间、使用多级缓存等方式避免缓存雪崩。
- 缓存击穿:是指某个热点缓存失效,导致大量请求直接访问数据库。可以通过使用互斥锁、设置永不过期等方式解决缓存击穿问题。
- 缓存穿透:是指请求的数据在缓存和数据库中都不存在,导致大量请求直接访问数据库。可以通过布隆过滤器、缓存空值等方式避免缓存穿透。
11. 设计模式与原则
设计模式
- 单例模式:保证一个类只有一个实例,并提供一个全局访问点。常见的实现方式有饿汉式、懒汉式、双重检查锁定等。
- 桥接模式:将抽象部分与实现部分分离,使它们可以独立变化。例如,不同颜色和形状的图形组合,颜色和形状可以独立变化。
- 工厂模式:定义一个创建对象的接口,让子类决定实例化哪个类。简单工厂模式通过一个工厂类创建不同类型的对象;工厂方法模式将创建对象的逻辑延迟到子类中实现。
- 策略模式:定义一系列算法,并将每个算法封装起来,使它们可以相互替换。例如,电商系统中不同的促销策略可以通过策略模式实现。
设计原则
- 单一职责原则:一个类应该只有一个引起它变化的原因,即一个类只负责一项职责。这样可以提高类的内聚性,降低类之间的耦合度。
- 开闭原则:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。通过使用抽象和多态等技术,可以在不修改原有代码的情况下扩展系统的功能。
12. 项目管理工具
Maven
Maven 是一个项目管理和构建工具,它通过 pom.xml
文件管理项目的依赖、编译、打包等。在 pom.xml
文件中,可以定义项目的坐标、依赖库、插件等信息。Maven 会根据这些信息自动下载所需的依赖库,并执行相应的构建任务,如编译、测试、打包等。
Git
Git 是一种分布式版本控制系统,它可以记录项目的历史变更,方便团队成员之间的协作开发。通过 git clone
可以克隆远程仓库到本地;使用 git add
将修改的文件添加到暂存区;使用 git commit
将暂存区的文件提交到本地仓库;使用 git push
将本地仓库的变更推送到远程仓库;使用 git pull
从远程仓库拉取最新的变更。
13. ERP 与供应链管理
ERP 企业管理软件
ERP(Enterprise Resource Planning)是