技术复习问题

Java 相关问题

Java 的面向对象特性是什么?

:封装(隐藏实现细节,通过 getter/setter 访问数据)、继承(子类复用父类属性和方法)、多态(同一方法在不同子类中有不同实现,如方法重写)、抽象(定义抽象类和接口)。

==equals() 的区别?

== 比较对象内存地址是否相同;equals() 默认行为与 == 相同,但可被重写(如 String 类重写后比较内容是否相同)。

ArrayList 和 LinkedList 的区别?

  • ArrayList 基于动态数组,查询快(O(1)),增删慢(需移动元素);
  • LinkedList 基于双向链表,增删快(O(1)),查询慢(需遍历)。

HashMap 的工作原理?

:基于数组+链表/红黑树(Java 8+)。通过 key 的 hashCode() 计算桶位置,解决哈希冲突用链表,链表过长(默认8)转红黑树。

Java 多线程的实现方式?

  • 继承 Thread 类;
  • 实现 Runnable 接口;
  • 实现 Callable 接口(可返回结果);
  • 使用线程池(如 ExecutorService)。

synchronizedReentrantLock 的区别?

  • synchronized 是关键字,自动释放锁;
  • ReentrantLock 是类,需手动加锁/解锁,支持公平锁、可中断等待。

你选择Spring Boot框架的原因是什么?

解答:
Spring Boot 是一个基于Spring框架的快速开发框架,其核心优势包括:
零配置:通过约定大于配置(Convention over Configuration)减少XML配置,简化开发流程。
内嵌服务器:内置Tomcat等容器,无需手动部署,直接运行项目。
依赖管理:通过Maven/Gradle自动管理依赖,避免版本冲突。
自动配置:根据项目依赖自动配置组件,提升开发效率。
因此,选择Spring Boot能快速搭建项目并专注于业务逻辑实现。

JDBC连接数据库的四个必要参数是什么?

解答:
Driver Class(数据库驱动,如MySQL的com.mysql.cj.jdbc.Driver)。
URL(数据库连接地址,如jdbc:mysql://localhost:3306/db_name)。
Username(数据库用户名)。
Password(数据库密码)。

简述Java中try…catch…finally的执行顺序?

解答:
try代码块先执行。
如果抛出异常且匹配catch,则执行对应的catch块。
如果没有异常或未被捕获的异常,则跳过catch。
无论是否发生异常,finally块都会执行(用于释放资源)。

Spring框架的核心功能是什么?

解答:
Spring框架的核心功能包括:
IoC(控制反转):通过容器管理对象的生命周期和依赖关系。
AOP(面向切面编程):解耦业务逻辑与横切关注点(如日志、事务)。
声明式事务管理:简化事务的处理(如@Transactional注解)。

什么是MVC设计模式?在你的项目中如何体现?

解答:
MVC是Model-View-Controller的缩写,分别代表:
Model:数据模型和业务逻辑(如Java中的Service层和实体类)。
View:用户界面(如前端的HTML/Vue模板)。
Controller:处理请求和响应(如Spring Boot的Controller层)。
项目体现:
用户请求由Controller接收(如@RestController)。
Controller调用Service层处理业务逻辑。
Service调用DAO层(如MyBatis)操作数据库。
结果返回给View渲染。

SSM框架是什么?为什么选择它?

解答:
SSM是Spring、Spring MVC、MyBatis的整合框架:
Spring:管理依赖注入和事务。
Spring MVC:处理请求分发和视图渲染。
MyBatis:简化数据库操作(ORM)。
选择原因:
解耦合,提高代码可维护性。
支持AOP(如日志、权限拦截)。
适合中小型项目的快速开发。


MySQL 相关问题

什么是事务的 ACID 特性?

  • 原子性(Atomicity):事务要么全执行,要么全不执行;
  • 一致性(Consistency):事务前后数据状态一致;
  • 隔离性(Isolation):事务间操作互不干扰;
  • 持久性(Durability):事务提交后数据永久保存。

索引的作用?优缺点?

  • 作用:加速查询;
  • 优点:提高查询效率;
  • 缺点:占用存储空间,降低增删改速度(需维护索引)。

MySQL 的 InnoDB 和 MyISAM 区别?

  • InnoDB:支持事务、行级锁、外键,适合频繁写操作;
  • MyISAM:不支持事务,表级锁,查询快,适合读多写少场景。

如何优化慢查询?

  • 使用 EXPLAIN 分析 SQL 执行计划;
  • 为 WHERE 条件字段加索引;
  • 避免 SELECT *,减少不必要字段查询;
  • 优化 SQL 语句(如避免子查询嵌套过深)。

什么是脏读、不可重复读、幻读?

  • 脏读:读到其他事务未提交的数据;
  • 不可重复读:同一事务内多次读取同一数据结果不同(数据被修改);
  • 幻读:同一事务内多次查询结果集不同(数据被新增或删除)。

主键和外键的作用及区别是什么?

解答:
主键(Primary Key):唯一标识表中的一行记录,不能为空且唯一。
外键(Foreign Key):用于建立表与表之间的关联,引用另一个表的主键。
区别:主键是表的唯一标识,外键是表间关联的约束。

索引的作用和缺点是什么?

解答:
作用:加快数据检索速度,通过B+树结构快速定位数据。
缺点:
增加存储空间(索引本身占用空间)。
降低写操作(INSERT/UPDATE/DELETE)的效率,因为需要维护索引结构。

数据库第三范式(3NF)的定义是什么?

解答:
第一范式(1NF):每个字段不可再分,数据原子性。
第二范式(2NF):在1NF基础上,非主键字段完全依赖主键。
第三范式(3NF):在2NF基础上,非主键字段之间无依赖(消除传递依赖)。

数据库设计分为哪几个步骤?

解答:
需求分析:明确系统需要存储的数据(如用户、订单)。
概念设计:用E-R图表示实体及关系(如用户与订单的1对多关系)。
逻辑设计:将E-R图转化为表结构(定义主键、外键)。
物理设计:优化索引、分区等存储结构。
实施与测试:创建表并验证数据完整性。

如何实现分页查询?

解答:
前端:传递当前页码和每页条数(如page=1&size=10)。
后端:使用LIMIT和OFFSET(如MySQL的LIMIT 10 OFFSET 0)。
MyBatis:通过RowBounds或动态SQL拼接分页参数。
优化:避免全表扫描,对查询字段加索引。

什么是事务的隔离级别?如何设置?

解答:
隔离级别:
READ UNCOMMITTED:最低隔离级别,允许脏读。
READ COMMITTED:只能读已提交数据(Oracle默认)。
REPEATABLE READ:MySQL默认,可避免脏读和不可重复读。
SERIALIZABLE:最高隔离级别,完全串行化。
设置方式:
通过@Transactional(isolation = Isolation.READ_COMMITTED)注解。
在数据源配置中全局设置(如spring.datasource.isolation)。


JavaScript 相关问题

letvarconst 的区别?

  • var:函数作用域,可重复声明,存在变量提升;
  • let:块级作用域,不可重复声明;
  • const:块级作用域,声明常量(值不可变,对象属性可变)。

闭包是什么?有什么作用?

  • 定义:函数内部返回另一个函数,并保留外层函数的变量引用;
  • 作用:实现私有变量、模块化、避免全局污染。

事件循环(Event Loop)机制?

  • JavaScript 是单线程,通过事件循环处理异步任务;
  • 同步任务在主线程执行,异步任务(如 setTimeout、Promise)进入任务队列,主线程空闲时轮询队列执行。

ES6 的箭头函数和普通函数区别?

  • 箭头函数没有自己的 this,继承外层作用域的 this
  • 不能用作构造函数(无 prototype 属性);
  • 没有 arguments 对象,可用剩余参数(...args)代替。

JavaScript的作用域有哪些?如何实现变量作用域?

解答:
全局作用域:在函数外部声明的变量。
函数作用域:在函数内部声明的变量(var声明)。
块级作用域:ES6新增的let和const在{}内定义的变量。
词法作用域:作用域由代码位置决定,而非运行时(如闭包)。

如何实现深拷贝?

方法1:JSON.parse(JSON.stringify(obj))(不支持函数、循环引用);
方法2:递归遍历对象属性,逐个复制。

如何实现轮播图动态切换?

解答:
前端:使用JavaScript定时器(setInterval)切换图片:
样式:通过CSS动画(transition)平滑切换。


综合问题

GET 和 POST 的区别?

  • GET 参数在 URL 中,长度有限,可缓存;
  • POST 参数在请求体中,支持大数据,更安全(非绝对)。

Cookie 和 Session 的区别?

  • Cookie:存储在客户端,大小受限(4KB);
  • Session:存储在服务端,依赖 Session ID(通常通过 Cookie 传递)。

你的系统用了什么技术栈?为什么选择这些技术?

  • 解答:
  • 前端:Vue.js/React(响应式、组件化开发)。
  • 后端:Spring Boot(快速开发、依赖管理)。
  • 数据库:MySQL(关系型数据库,支持高并发)。
  • 框架选择原因:结合项目需求(如轻量级、易维护性)。

某个功能(如登录)是如何实现的?

解答:
流程:用户输入用户名/密码 → 前端验证 → 发送POST请求到后端 → 后端验证数据库 → 返回Token → 前端存储Token并跳转页面。
技术点:Spring Security(权限校验)、JWT(Token生成)、MyBatis(数据库查询)。

前后端如何实现数据交互?

解答:
协议:HTTP/HTTPS,使用RESTful API规范(GET/POST/PUT/DELETE)。
数据格式:JSON(如Spring Boot的@RequestBody和@ResponseBody)。
框架:
前端:Axios或Fetch发送请求,Vue/React处理响应。
后端:Spring MVC的@RestController接收并返回数据。

如何实现用户登录和权限控制?

解答:
登录:
用户提交用户名/密码。
后端验证并生成JWT Token(或Session)。
前端存储Token并在后续请求头中携带(如Authorization: Bearer ${token})。
权限控制:
Spring Security:通过@PreAuthorize或@RolesAllowed注解限制接口访问。
RBAC模型:角色-权限映射(如管理员可删除,普通用户仅查看)。

如何实现动态验证码?

解答:
生成验证码:使用Java的Random生成随机字符串,结合图形库(如Kaptcha)生成图片。
存储验证:将验证码存入Session(如session.setAttribute(“code”, code))。
刷新机制:每次点击刷新验证码时,URL添加时间戳(如src=“/captcha.jpg?time=123456”)。

什么是ER图?如何设计?

解答:
ER图(实体-关系图)用于描述数据库实体及关系:
实体:用矩形表示(如用户、订单)。
属性:用椭圆表示(如用户ID、姓名)。
关系:用菱形表示(如“用户”与“订单”的一对多关系)。
设计步骤:
确定核心实体。
定义属性和主键。
通过外键关联实体。

什么是用例图?举例说明。

解答:
用例图描述系统参与者(Actor)与功能(用例)的关系:
Actor:用户、管理员等系统外部角色。
用例:系统提供的功能(如“用户登录”“管理员发布公告”)。
关系:Actor → 关联 → 用例,用例间可有包含或扩展关系。
示例:
管理员发布商品 → 商品管理用例。
用户浏览商品 → 商品查询用例。

系统设计分为哪几个阶段?每个阶段的任务是什么?

解答:
需求分析阶段:明确用户需求(如功能、性能、安全性)。
系统设计阶段:
概要设计:划分模块(如前端、后端、数据库),确定技术栈。
详细设计:设计数据库表结构、接口协议、类图等。
开发实现阶段:编码、单元测试、模块集成。
测试阶段:功能测试、性能测试、安全测试。
部署与维护阶段:上线部署、监控日志、修复漏洞。

为什么选择前后端分离架构?

解答:
解耦合:前后端独立开发和部署,降低耦合度。
高效开发:前端使用Vue/React快速迭代界面,后端专注业务逻辑。
复用性:后端API可被多端(Web、App)调用。
技术栈灵活性:前端用JavaScript框架,后端用Java,各取所长。

如何实现模块化设计?

解答:
分层设计:将系统分为Controller、Service、DAO层。
接口隔离:每个模块暴露清晰的接口(如Service层定义方法)。
依赖注入:通过Spring的@Autowired管理组件依赖。

你做了哪些测试?如何保证系统质量?

解答:
单元测试:用JUnit测试Service层方法(如@Test验证计算逻辑)。
集成测试:用Postman测试接口(如用户登录、数据查询)。

如何处理跨域请求?

解答:
后端配置:在Spring Boot中添加@CrossOrigin注解或全局配置CORS
Nginx代理:通过反向代理解决跨域(如配置proxy_pass)。

如何实现文件上传功能?

解答:
前端:使用选择文件,通过Axios发送FormData:
后端:Spring Boot接收文件并保存到服务器:

如何实现模糊查询?

解答:
SQL:使用LIKE语句(如WHERE name LIKE %keyword%)。
MyBatis动态SQL:

如何防止重复提交表单?

解答:
前端:提交后禁用按钮(disabled)或设置防重令牌(Token)。
后端:使用Redis存储请求唯一标识(如userId + timestamp),超时后失效。

如何实现角色权限控制?

解答:
数据库设计:
user表关联role表(多对多关系)。
permission表存储权限码(如USER:CREATE)。
前端控制:根据角色动态渲染菜单(如Vue的v-if条件判断)。

如何实现数据脱敏?

解答:
敏感字段:如手机号显示为1385678。
MyBatis拦截器:在查询时动态修改SQL(如REPLACE(phone, SUBSTRING(phone,4,4), ''))。
后端处理:在返回结果前用工具类脱敏(如StringUtils.maskPhone)。