编程语言相关:
1.请简述 Java 中接口和抽象类的主要区别。
- 抽象类可以有构造方法,接口不能有构造方法。
- 抽象类中可以有普通成员变量,接口中只能有常量(默认
public static final
)。 - 抽象类中可以有非抽象方法,接口在 Java 8 前只能有抽象方法,Java 8 后可以有默认方法(
default
修饰)和静态方法,Java 9 后还可以有私有方法。 - 一个类只能继承一个抽象类,但可以实现多个接口。
2.简单说明 HTML、CSS、JavaScript 在网页开发中的各自作用,以及它们之间的配合关系。
- HTML:负责网页的结构,定义页面中的各种元素(如标题、段落、图片、链接等),是网页的骨架。
- CSS:负责网页的表现,控制元素的样式(如颜色、字体、布局、间距等),让网页更美观。
- JavaScript:负责网页的行为,实现网页的交互功能(如表单验证、动态内容更新、事件响应等),让网页更具活力。
- 配合关系:HTML 搭建基础结构,CSS 对结构进行美化修饰,JavaScript 则基于 HTML 和 CSS 构建的页面,添加交互逻辑,三者协同工作,构建出完整的网页。
3.解释 Maven 中坐标(GroupId、ArtifactId、Version)的作用,以及 Maven 是如何解决依赖冲突问题的。
- 坐标作用:
GroupId
标识项目所属的组织或团体;ArtifactId
是项目自身的唯一标识;Version
表示项目的版本。通过这三个坐标,Maven 能唯一确定一个依赖库。 - 依赖冲突解决:Maven 通过依赖调解(Dependency Mediation)来解决冲突,遵循 “路径最近者优先” 和 “第一声明者优先” 原则。也可通过
<exclusions>
标签排除传递依赖中不需要的版本,或使用<dependencyManagement>
统一管理依赖版本
4.对比Maven 和 Gradle,说说它们各自的优势和适用场景。
- Maven:
- 优势:拥有成熟的生态系统,插件丰富且稳定;项目结构规范,约定大于配置,学习成本相对较低;依赖管理成熟,冲突解决机制完善。
- 适用场景:传统 Java 项目,尤其是企业级应用,团队更倾向于稳定、规范的构建工具时。
- Gradle:
- 优势:构建脚本使用 Groovy 或 Kotlin 编写,灵活且表达能力强;支持增量构建,构建速度快;对多项目构建支持更优,能更高效地处理大型项目。
- 适用场景:大型多模块项目,特别是 Android 项目(Android 官方推荐使用 Gradle),以及追求构建灵活性和速度的项目。
后端开发相关:
1.Spring Boot 的自动配置原理是什么? starters 依赖是如何工作的?
- 自动配置原理:Spring Boot 的自动配置基于
@EnableAutoConfiguration
注解,该注解会导入AutoConfigurationImportSelector
类,它会扫描META-INF/spring.factories
文件,加载其中配置的自动配置类。自动配置类通过条件注解(如@ConditionalOnClass
、@ConditionalOnBean
等)来判断是否生效,从而实现按需自动配置。 - starters 依赖工作方式:starters 是一组依赖的集合,它将某个功能相关的依赖打包在一起,方便开发者引入。例如
spring-boot-starter-web
包含了 Web 开发所需的 Spring MVC、Tomcat 等依赖。当引入某个 starter 时,Spring Boot 会根据 starter 中的依赖和自动配置类,自动配置相关功能。
2.如何在 Spring Boot 中通过 application.yml
或 properties
文件配置多环境(开发、测试、生产)参数?请举例说明。
在src/main/resources
下创建application.yml
(主配置文件),以及application-dev.yml
(开发环境)、application-test.yml
(测试环境)、application-prod.yml
(生产环境)。主配置文件application.yml
中指定激活的环境:
spring:
profiles:
active: dev
然后在各环境配置文件中配置不同参数,如application-dev.yml
中配置开发环境的数据库连接:
spring:
datasource:
url: jdbc:mysql://localhost:3306/dev_db
username: dev_user
password: dev_pass
application-prod.yml
中配置生产环境的数据库连接:
spring:
datasource:
url: jdbc:mysql://prod-host:3306/prod_db
username: prod_user
password: prod_pass
3.你在项目中是如何优化 Spring Boot 项目启动时间和减少环境切换问题的?具体做了哪些配置调整?
- 缩短启动时间:通过分析项目依赖,排除不必要的自动配置(使用
@SpringBootApplication(exclude = {...})
);优化依赖,使用轻量级的组件替换重组件(如用 Undertow 替换 Tomcat);利用 Spring Boot 的分层构建和缓存机制,加速构建和启动。 - 减少环境切换问题:通过
@Profile
注解对不同环境的 Bean 进行隔离;使用配置中心(如 Nacos、Consul)统一管理配置,减少本地配置文件的维护,避免环境切换时的配置错误。
4.结合MyBatis SpringBoot 开发时,Mapper 接口和 XML 映射文件是如何关联的?请描述实现数据库 CRUD 操作的大致流程。
- 关联方式:Mapper 接口上使用
@Mapper
或在配置类上使用@MapperScan
扫描 Mapper 接口所在包。XML 映射文件中,通过namespace
属性指定对应的 Mapper 接口全限定名,SQL 语句的id
与 Mapper 接口中的方法名一致,从而实现关联。 - CRUD 流程:定义 Mapper 接口,声明 CRUD 方法;在 XML 映射文件中编写对应的 SQL 语句(如
<select>
、<insert>
、<update>
、<delete>
);在 Service 层注入 Mapper 接口,调用相应方法,MyBatis 会自动执行 XML 中的 SQL 语句,完成数据库的 CRUD 操作。
前端工具相关:
1.请列举几个 HTML5 中的语义化标签,并说明使用它们的好处。
- 语义化标签:
<header>
(页面或区块的页眉)、<nav>
(导航栏)、<article>
(独立的文章或内容块)、<section>
(文档中的节)、<footer>
(页面或区块的页脚)等。 - 好处:提高代码的可读性和可维护性;有利于搜索引擎优化(SEO),搜索引擎能更好地理解页面结构,提升页面排名;提升无障碍访问性,辅助技术(如屏幕阅读器)能更准确地解读页面内容。
2.解释 JavaScript 中箭头函数与普通函数的区别,以及 Promise、async/await 的作用和使用场景。
- 箭头函数与普通函数区别:箭头函数没有自己的
this
,它的this
指向定义时所在的作用域;箭头函数不能作为构造函数(不能用new
调用);箭头函数没有arguments
对象(可使用剩余参数...args
代替)。 - Promise 作用和场景:用于解决异步操作的回调地狱问题,将异步操作以同步的方式表达出来。场景:处理 Ajax 请求、文件读写、定时器等异步操作。
- async/await 作用和场景:是 Promise 的语法糖,让异步代码更像同步代码,更易读。场景:在需要按顺序执行多个异步操作时,如先获取数据 A,再根据数据 A 获取数据 B。
3.描述一下 Vue.js 组件的生命周期,并说明在哪些生命周期钩子中适合进行数据请求等操作。
- 生命周期:创建阶段(
beforeCreate
、created
)、挂载阶段(beforeMount
、mounted
)、更新阶段(beforeUpdate
、updated
)、销毁阶段(beforeDestroy
、destroyed
)。 - 数据请求时机:通常在
created
钩子中进行数据请求,因为此时组件实例已经创建,能访问到data
和methods
,但 DOM 还未挂载,适合提前获取数据;也可在mounted
钩子中请求,此时 DOM 已挂载,可操作 DOM 相关的请求。
4.如何在 Vue 项目中使用 Vue Router 配置动态路由、嵌套路由以及路由守卫(如登录拦截)?
- 动态路由:在路由配置中使用
:param
形式定义动态参数,如{ path: '/user/:id', component: User }
。在组件中通过$route.params.id
获取参数。 - 嵌套路由:在路由配置中,使用
children
属性定义子路由,如:
{
path: '/parent',
component: Parent,
children: [
{ path: 'child', component: Child }
]
}
在父组件模板中使用<router-view>
渲染子组件。
- 路由守卫(登录拦截):可使用全局前置守卫
router.beforeEach((to, from, next) => {})
,在其中判断用户是否登录,若未登录且要访问需要登录的页面,就跳转到登录页,否则执行next()
放行。
云服务相关:
1.请说明 docker pull
和 docker run
命令的作用,以及如何通过这两个命令拉取并启动 Nginx 镜像。
docker pull
作用:从 Docker 镜像仓库(默认 Docker Hub)拉取指定的镜像到本地。
docker run
作用:基于指定的镜像创建并启动一个容器。
启动 Nginx 示例:
拉取 Nginx 镜像:docker pull nginx
。
启动 Nginx 容器:docker run -d -p 80:80 nginx
(-d
表示后台运行,-p 80:80
表示将容器的 80 端口映射到主机的 80 端口)。
2.列举几个常用的 Docker 容器日常运维命令,并说明它们的用途。
docker ps
:查看正在运行的容器。docker ps -a
:查看所有容器(包括已停止的)。docker start/stop/restart 容器ID/容器名
:启动、停止、重启容器。docker logs 容器ID/容器名
:查看容器的日志。docker exec -it 容器ID/容器名 /bin/bash
:进入容器的交互式终端。docker rm 容器ID/容器名
:删除容器(需先停止容器)。docker rmi 镜像ID/镜像名
:删除镜像。
AI 工具相关:
1.你使用过 codebuddy、cursor、Cloudcode、augument 这些 AI 大模型工具中的哪些?请分享一下在实际开发中使用它们的体验和帮助。
以使用codebuddy
为例,在实际开发中,当编写复杂的算法代码或不熟悉的框架代码时,可将需求描述输入codebuddy
,它能快速生成初步的代码框架,节省编码时间;在调试代码遇到问题时,也可将错误信息和相关代码片段提交给codebuddy
,它能辅助分析问题原因并提供解决方案思路。不同的 AI 大模型工具在代码补全、错误排查、文档生成等方面各有特点,能从不同维度提升开发效率。
数据库操作相关:
1.什么是数据库索引?它有什么作用?在什么情况下需要优化索引?
- 作用:索引是对数据库表中一列或多列的值进行排序的一种结构,能加快数据的查询速度,就像书籍的目录一样,帮助数据库快速定位到所需数据。
- 优化时机:当查询操作频繁,且查询的列是经常作为查询条件(如
WHERE
子句中的列)时;当表中的数据量较大,且查询需要扫描大量数据时;当插入、更新、删除操作相对较少,查询操作占比较大时。
2.请解释数据库事务的 ACID 特性,以及在 SQL 中如何处理事务。
- ACID 特性:
- 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么全部执行,要么全部不执行。
- 一致性(Consistency):事务执行前后,数据库的完整性约束没有被破坏,数据处于一致状态。
- 隔离性(Isolation):多个事务并发执行时,一个事务的执行不能被其他事务干扰。
- 持久性(Durability):一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,接下来的其他操作或故障不应该对其执行结果有任何影响。
3.简单说明关系型数据库和 NoSQL 数据库(如 Redis)的区别,以及 Redis 的典型使用场景。
- 区别:
- 数据结构:关系型数据库采用结构化的数据(二维表),NoSQL 数据库(如 Redis)支持多种非结构化数据结构(如字符串、哈希、列表、集合、有序集合等)。
- Schema 约束:关系型数据库有严格的 Schema 约束,NoSQL 数据库 Schema 灵活,可动态添加字段。
- 事务支持:关系型数据库对事务支持更完善(遵循 ACID),Redis 等部分 NoSQL 数据库对事务的支持相对简单(Redis 事务保证原子性,但不保证隔离性等)。
- 扩展性:关系型数据库水平扩展性较差,NoSQL 数据库通常具有更好的水平扩展性。
- Redis 典型场景:缓存(将热点数据缓存起来,减轻数据库压力);会话存储(存储用户会话信息,实现分布式系统中的会话共享);消息队列(简单的消息发布与订阅);排行榜(利用有序集合实现实时排行榜);计数器(如文章阅读量、点赞数的计数)
性能调优相关:
1.什么是 JVM 性能调优?请列举几个常见的 JVM 性能分析工具,并说明它们的用途。
- JVM 性能调优:通过调整 JVM 的堆内存大小(
-Xms
初始堆大小、-Xmx
最大堆大小)、新生代和老年代的比例、垃圾收集器(如选择 G1、ZGC 等高性能收集器)、JIT 编译参数等,优化 JVM 的内存使用和垃圾回收效率,从而提升应用性能。 - 常用性能分析工具:
- JConsole:基于 JMX 的可视化监控工具,可监控内存、线程、类加载等情况。
- VisualVM:功能强大的多合一性能分析工具,可进行内存分析、线程分析、CPU 分析、生成堆转储快照等。
- JProfiler:商业级性能分析工具,能深入分析内存泄漏、线程问题、方法执行性能等。
- GC 日志分析工具(如 GCViewer):用于分析 JVM 的垃圾收集日志,帮助优化垃圾收集器配置。
2.在 JVM 性能调优过程中,通常会关注哪些指标?
- 内存相关:堆内存使用情况(新生代、老年代的使用率)、非堆内存使用情况、内存泄漏情况(通过堆转储分析)。
- 垃圾回收相关:垃圾收集的频率、每次垃圾收集的时间、垃圾收集器的停顿时间(STW 时间)。
- 线程相关:线程数量、线程状态(如阻塞线程数)、线程死锁情况。
- CPU 相关:CPU 使用率、方法的 CPU 占用率(热点方法)。
- 类加载相关:类加载的数量、类加载时间。