面试知识点2
- 互联网
- 2025-08-25 12:06:01

文章目录 1. Linux 与 DockerLinux 基本指令VMware 安装 CentOSDocker 拉取镜像创建容器、部署 Spring Boot 项目 2. 关系型数据库 MySQL数据库语法多表关联查询数据库索引 3. 事务与死锁事务的隔离级别死锁的原因和避免方法 4. 排序算法与数据结构二分查找快速排序常见数据结构 5. Java 语言基础面向对象编程思想常用集合框架 6. 多线程并发知识多线程的生命周期线程创建的方式线程池的原理和核心参数 7. Java 反射和注解编程Java 反射注解编程 8. JVM 底层原理JVM 的生命周期内存划分GC 算法垃圾回收机制双亲委派模型JVM 调优 9. Spring 框架与 MyBatisSpring IOCSpring AOPMVC 架构思想MyBatis 执行流程Spring Boot 整合 MyBatis、MyBatis-Plus 和 Redis 10. Redis 缓存Redis 数据类型缓存持久化缓存雪崩、缓存击穿、缓存穿透 11. 设计模式与原则设计模式设计原则 12. 项目管理工具MavenGit 13. ERP 与供应链管理ERP 企业管理软件 1. Linux 与 Docker Linux 基本指令
Linux 作为开源操作系统,其指令是与系统交互的重要方式。ls 查看目录内容,系统会遍历指定目录下的所有文件和子目录,并将它们的信息显示出来。cd 切换目录时,系统会修改当前工作目录指针,指向新的目录。mkdir 创建新目录时,系统会在文件系统中分配相应的存储空间,并记录目录的元信息。
VMware 安装 CentOSVMware 是一款虚拟机软件,它通过模拟计算机的硬件环境,让用户可以在一台物理机上同时运行多个不同的操作系统。安装 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 IOCSpring IOC(控制反转)是 Spring 框架的核心特性之一,它通过容器来管理对象的创建和依赖注入。在传统的编程方式中,对象的创建和依赖关系的管理由程序员手动完成,而在 Spring IOC 中,这些工作由 Spring 容器负责。通过配置文件或注解的方式,将对象的创建和依赖关系告诉 Spring 容器,容器会在需要时自动创建对象并注入依赖,降低了代码的耦合度。
Spring AOPSpring 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 和 RedisSpring 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. 项目管理工具 MavenMaven 是一个项目管理和构建工具,它通过 pom.xml 文件管理项目的依赖、编译、打包等。在 pom.xml 文件中,可以定义项目的坐标、依赖库、插件等信息。Maven 会根据这些信息自动下载所需的依赖库,并执行相应的构建任务,如编译、测试、打包等。
GitGit 是一种分布式版本控制系统,它可以记录项目的历史变更,方便团队成员之间的协作开发。通过 git clone 可以克隆远程仓库到本地;使用 git add 将修改的文件添加到暂存区;使用 git commit 将暂存区的文件提交到本地仓库;使用 git push 将本地仓库的变更推送到远程仓库;使用 git pull 从远程仓库拉取最新的变更。
13. ERP 与供应链管理 ERP 企业管理软件ERP(Enterprise Resource Planning)是
上一篇
宠物行业研究系列报告
下一篇
知识库-搜索知识接口