全栈(Java+vue)实习面试题(含答案)
在广州一个小公司(BOSS标注是0-20人,薪资2-3k),直接面试没有笔试,一开始就直接拿着简历问,也没有自我介绍,问题是结合场景题和八股文、基础。废话不多说,直接分享面试题目个大家做参考。
1、能讲一下IOC吗?
IOC就是控制反转,这是一种设计模式,核心思想是将对象的创建、依赖注入和生命周期管理交给IOC容器负责。在传统的编码方式中,我们一般需要在类中手动创建依赖对象,通过硬编码方式来控制对象的实例化和管理,而在Spring中,Bean以及对象之间的依赖关系都交给IOC容器负责,降低了代码之间的耦合度,也提高了系统的灵活性;
spring中主要通过XML配置和注解配置的两种方式实现。
2、数据库三范式能说一下吗?
数据库的三范式是关系型数据库设计的基本原则,旨在减少数据冗余、提高数据的一致性,并确保数据依赖的合理性;
第一范式:字段具有原子性,就是每个字段不能再拆分。比如联系方式应该拆分为电话和地址两个独立的字段;
第二范式:在满足第一范式的基础上,消除部分依赖,就是非主键字段必须完全依赖主键中的各个字段(表中使用的是复合主键,主键包含多个字段)。比如订单明细表的主键是订单ID+产品ID,字段客户姓名仅依赖订单ID,可以将客户姓名移到以订单ID为主键的订单表中;
第三范式:在满足第一、二范式的基础上,消除传递依赖,就是非主键字段不能依赖其他非主键字段。比如学生表包含学号(主键)、学院、学院电话,其中学院电话依赖学院,而学院依赖学号,应拆分为学生表(学号、学院)和学院表(学院、学院电话)
这种规则约束减少了冗余、避免了跟新异常,但过度范式化可能导致多表关联查询、降低性能;
3、数据库的优化问题?
(1)表设计优化
- 选择合适的数据类型,尽量使用最小的数据类型(比如使用INT替代BIGINT,使用CHAR替代VARCHAR)来减少存储和查询成本;
- 分区表:对于数据量极大的表可以考虑分区表,将表按某些规则分割成多个小表,提高查询效率;
- 主从复制、读写分离:如果数据库读的操作比较多,为了避免写操作所造成的性能影响,可以采用读写分离的架构;
(2)索引优化:
- 创建适当的索引,避免过多的索引,查照索引的创建原则;
- 覆盖索引:使用索引覆盖查询,避免回表,调高效率;
(3)SQL语句优化:
- 尽量明确指定需要的列,避免使用SELECT *,以减少不必要的数据传输;
- SQL语句要避免造成索引失效的写法;
- 尽量用union all 替代 union ,union多了一次过滤,效率较低;
- 避免子查询,特别是当子查询返回大量数据时,可以考虑JOIN或WITH子句替代
索引创建原则和失效场景看这篇八股文:
https://blog.csdn.net/weixin_73144915/article/details/145535602?spm=1001.2014.3001.5501
4、知道多态吗,解释一下?
多态指同一个操作作用于不同对象时,可以有不同的实现方式。核心目的是提高代码的灵活性和可扩展性;多态的两种形式如下:
1、编译时多态(静态多态),实现方法重载,在编译时根据参数类型和个数确定调用哪个方法;
2、运行时多态(动态多态),通过接口/继承和方法重写来实行,在运行时根据对象的实际类型决定调用哪个方法;
5、hashMap和hashTable的区别?
HashMap和Hashtable都是Java中用于存储键值对的哈希表类,区别如下:
(1)线程安全:HashMap不是线程安全的,如果多个线程并发访问HahsMap,并且至少有一个线程做了修改,他必须通过外部同步来保证线程安全,否则可能会导致数据不一致的情况;而Hashtable是线程安全的,他的方法都被synchronized修饰,可以在多线程环境下安全的被访问;
(2)性能:HashMap性能通常优于Hashtable,特别是在单线程环境下;而Hashtable由于方法上都有同步锁,性能较差;
(3)Null值:HashMap允许一个null值(键唯一性)和多个null值;而Hashtable不允许出现null键或null值。
6、SpringMVC的核心是什么?
SpringMVC的核心是基于前端控制器模式的请求驱动设计,将前端控制器作为中央调度器,拦截请求将请求分发给对应的处理器,并协调视图解析、数据绑定等组件完成全流程处理。其核心设计理念是解耦、模块化、可扩展。核心流程如下:
1.发送请求:用户发送请求,被前端控制器拦截;
2.映射处理器:处理器映射器根据URL找到对应的Controller层和方法;
3.调用控制器:Controller执行业务逻辑,返回ModelAndView数据;
4.解析视图:视图解析器将视图名称转化为具体视图(如HTML页面);
5.渲染视图:将模型数据填充到视图中,生成最终响应给用户;
7、怎么解决超卖问题?
解决超卖问题的核心在于保证库存扣减的原子性和一致性,尤其是在高并发场景下。以下是分层的解决方案,涵盖技术实现和业务逻辑优化:
一、技术层面解决方案
1. 数据库锁机制
-
悲观锁(Pessimistic Lock)
在事务中通过SELECT ... FOR UPDATE锁定库存记录,防止其他事务修改。
BEGIN;
SELECT stock FROM products WHERE id=1 FOR UPDATE;
UPDATE products SET stock = stock - 1 WHERE id=1;
COMMIT;
-
缺点:性能较差,适用于低并发场景。
-
乐观锁(Optimistic Lock)
通过版本号或时间戳控制并发,仅当库存未被修改时才扣减。
UPDATE products
SET stock = stock - 1, version = version + 1
WHERE id=1 AND version = {current_version} AND stock > 0;
-
优点:性能高,适合高并发;缺点:需重试逻辑(如失败后提示用户重新下单)。
2. 分布式锁(Redis/ZooKeeper)
-
使用 Redis 的
SETNX或 RedLock 算法,确保同一时间只有一个请求能操作库存。
示例(Redis + Lua脚本保证原子性):
local key = "product_1_stock"
local decrement = 1
local stock = tonumber(redis.call('GET', key))
if stock >= decrement thenredis.call('DECRBY', key, decrement)return 1 -- 扣减成功
elsereturn 0 -- 库存不足
end
适用场景:分布式系统,需配合数据库最终一致性。
3. 缓存预扣库存(Redis + 异步队列)
步骤:
-
将库存预热到 Redis 中。
-
用户下单时,先通过
DECR扣减 Redis 库存。 -
若扣减成功,将订单信息发送到消息队列(如 Kafka、RabbitMQ),异步更新数据库。
-
若最终数据库更新失败,需回滚 Redis 库存(如通过 TTL 自动过期或补偿事务)。
优点:扛住瞬时高并发;缺点:需处理缓存与数据库的数据一致性。
8、Mybatis中XML和注解你是怎么使用的?
配合着使用,一些简单的SQL语句可以直接用注解来写,而复杂SQL、联表查询的用XML来写
9.如果利用用户ID恶意访问接口,怎么解决?
1. 采用 Token 进行身份验证
- 使用 JWT(JSON Web Token) 或 Session 机制 进行身份认证,确保用户必须先登录后才能访问接口。
- Token 绑定用户身份,服务器通过 Token 解析出用户 ID,而不是让前端传递用户 ID。
2. 避免前端传递用户 ID
- 服务器根据 Token 自动获取当前用户 ID,而不是让前端传递
userId参数。 - 示例:
@GetMapping("/user/profile")
public ResponseEntity<UserProfile> getUserProfile(@RequestAttribute("userId") Long userId) {UserProfile profile = userService.getProfileById(userId);return ResponseEntity.ok(profile);
}
这里 userId 是从 JWT 解析出来的,而不是从前端传递的参数。
3. 进行权限校验
- 后端校验数据归属权,即使用户传递
userId,也要检查该userId是否与当前登录用户匹配。 - 示例(Spring Boot 权限校验):
@GetMapping("/user/orders")
public ResponseEntity<List<Order>> getUserOrders(@RequestParam Long userId, @RequestAttribute("userId") Long currentUserId) {if (!userId.equals(currentUserId)) {throw new AccessDeniedException("非法访问");}return ResponseEntity.ok(orderService.getOrdersByUserId(userId));
}
这里 currentUserId 是从 Token 解析出来的,确保用户不能查询别人的订单。
4. 限制请求频率(防止暴力攻击)
- 使用 Rate Limiting(限流)机制,比如:
- Redis + 滑动窗口 进行限流
- Nginx 限流
- 使用 Spring Boot 的
Bucket4j或Guava RateLimiter
- 示例(Spring Boot 限流):
@RateLimiter(name = "user-api", fallbackMethod = "limitExceeded")
@GetMapping("/user/data")
public ResponseEntity<?> getUserData() {return ResponseEntity.ok("数据获取成功");
}public ResponseEntity<String> limitExceeded(Exception e) {return ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS).body("请求过于频繁,请稍后再试");
}
10.说一下类加载器?
JVM只会运行二进制文件,类加载器的作用就是将字节码文件加载到JVM中,转化为JVM可识别的数据结构,从而使Java程序能够运行启动。核心作用如下:
(1)动态加载:在程序运行时按需要加载类,而非一次性加载所有类;
(2)隔离性:不同类加载器可以加载不同来源的类,避免命名冲突(如Tomcat隔离Web应用);
(3)安全性:通过双亲委派机制,防止恶意修改核心类库代码;
相关文章:
全栈(Java+vue)实习面试题(含答案)
在广州一个小公司(BOSS标注是0-20人,薪资2-3k),直接面试没有笔试,一开始就直接拿着简历问,也没有自我介绍,问题是结合场景题和八股文、基础。废话不多说,直接分享面试题目个大家做参考。 1、能…...
SQL经典常用查询语句
1. 基础查询语句 1.1 查询表中所有数据 在SQL中,查询表中所有数据是最基本的操作之一。通过使用SELECT * FROM table_name;语句,可以获取指定表中的所有记录和列。例如,假设有一个名为employees的表,包含员工的基本信息…...
超详细:数据库的基本架构
MySQL基础架构 下面这个图是我给出的一个MySQL基础架构图,可以清楚的了解到SQL语句在MySQL的各个模块进行执行过程。 然后MySQL可以分为两个部分,一个是server层,另一个是存储引擎。 server层 Server层涵盖了MySQL的大多数核心服务功能&am…...
AI催化新一轮创业潮与创富潮:深圳在抢跑
作者:尺度商业大掌柜黄利明 2025年春节伊始至今,从DeepSeek R1开源模型持续引发全球围观,到腾讯混元Turbo S模型发布秀出了"秒回"绝活,再到国务院发布《新一代人工智能发展规划(2025-2030)》重磅…...
Docker 深度解析:适合零基础用户的详解
此博客涵盖 Docker 的基本概念和作用、架构和核心组件、与传统虚拟机的对比、安装与基本操作,以及在实际开发和运维中的应用场景。 首先,详细解释了 Docker 的基本概念,包括它的诞生背景、作用及其如何解决传统应用部署中的问题。然后&#…...
SpringBoot生成唯一ID的方式
1.为什么要生成唯一ID? 数据唯一性:每个记录都需要有一个独一无二的标识符来确保数据的唯一性。这可以避免重复的数据行,并有助于准确地查询、更新或删除特定的记录。 数据完整性:通过使用唯一ID,可以保证数据库中的数…...
FastGPT 源码:RRF、Rerank 相关代码
文章目录 FastGPT 源码:RRF、Rerank 相关代码1. RRF (Reciprocal Rank Fusion) 合并实现2. Rerank 二次排序实现3. 重排序的主要特点4. 整个搜索流程5. 这种方式的优势 FastGPT 源码:RRF、Rerank 相关代码 下边介绍 RRF 合并和 Rerank 二次排序的相关实…...
Android视频流畅播放要素
要让 Android 设备流畅播放视频,需根据设备性能(低端、中端、高端)和播放场景(本地播放、在线流媒体)动态调整视频参数。以下是针对不同设备的推荐配置方案: 一、通用推荐配置(平衡兼容性与流畅…...
Python:类型转换和深浅拷贝,可变与不可变对象
int():转换为一个整数,只能转换由纯数字组成的字符串 浮点型强转整型会去掉小数点及后面的数,只保留整数部分 #如果字符串中有数字和正负号以外的字符就会报错 float():整形转换为浮点型会自动添加一位小数 .0 如果字符串中有…...
vcredist_x64 资源文件分享
vcredist_x64 是 Microsoft Visual C Redistributable 的 64 位版本,用于在 64 位 Windows 系统上运行使用 Visual C 开发的应用程序。它包含了运行这些应用程序所需的运行时组件。 vcredist_x64 资源工具网盘下载链接:https://pan.quark.cn/s/ef56f838f…...
Linux:vim快捷键
Linux打开vim默认第一个模式是:命令模式! 命令模式快捷键操作: gg:光标快速定位到最开始 shift g G:光标快速定位到最结尾 n shift g n G:光标快速定位到第n行 shift 6 ^:当前行开始 …...
DeepSeek在MATLAB上的部署与应用
在科技飞速发展的当下,人工智能与编程语言的融合不断拓展着创新边界。DeepSeek作为一款备受瞩目的大语言模型,其在自然语言处理领域展现出强大的能力。而MATLAB,作为科学计算和工程领域广泛应用的专业软件,拥有丰富的工具包和高效…...
NAT 代理服务 内网穿透
🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 NAT 技术背景二:🔥 NAT IP 转换过程三:🔥 NAPT四:🔥 代理服务器🦋 正向…...
高级课第五次作业
首先配置交换机,路由器 LSW1配置 [SW1]vlan batch 10 20 30 40 [SW1]int g0/0/2 [SW1-GigabitEthernet0/0/2]port link-type access [SW1-GigabitEthernet0/0/2]port default vlan 10 [SW1]int g0/0/3 [SW1-GigabitEthernet0/0/3]port link-type access […...
51单片机编程学习笔记——动态数码管显示多个数字
大纲 视觉残留原理生理基础神经传导与处理 应用与视觉暂留相关的现象 频闪融合不好的实现好的效果 延伸 在《51单片机编程学习笔记——动态数码管》一文中,我们看到如何使用动态数码管显示数字。但是基于动态数码管设计的特点,每次只能显示1个数字。这就…...
金蝶ERP星空对接流程
1.金蝶ERP星空OPENAPI地址: 金蝶云星空开放平台 2.下载金蝶云星空的对应SDK包 金蝶云星空开放平台 3.引入SDK流程步骤 引入Kingdee.CDP.WebApi.SDK 右键项目添加引用,在打开的引用管理器中选择浏览页签,点击浏览按钮,找到从官…...
【随手笔记】利尔达NB模组
1.名称 移芯EC6263GPP 参数 指令备注 利尔达上电输出 [2025-03-04 10:24:21.379] I_AT_WAIT:i_len2 [2025-03-04 10:24:21.724] LI_AT_WAIT:i_len16 [2025-03-04 10:24:21.724] [2025-03-04 10:24:21.733] Lierda [2025-03-04 10:24:21.733] [2025-03-04 10:24:21.745] OK移…...
Vue3的核心语法【未完】
Vue3的核心语法 OptionsAPI与CompositionAPI Options API(选项式) 和 Composition API (组合式)是 Vue.js 中用于构建组件的两种不同方式。Options API Options API Options API 是 Vue 2 中的传统模式,并在 Vue 3…...
解决redis lettuce连接池经常出现连接拒绝(Connection refused)问题
一.软件环境 windows10、11系统、springboot2.x、redis 6 7 linux(centos)系统没有出现这问题,如果你是linux系统碰到的,本文也有一定大参考价值。 根本思路就是:tcp/ip连接的保活(keepalive)。 二.问题描述 在spr…...
C#进阶指南
C# 是一种功能强大的编程语言,其高级语法特性为开发者提供了更灵活、高效和简洁的编程方式。以下是一些常见的 C# 高级语法特性: 1. 委托(Delegate) 委托是一种类型安全的函数指针,用于封装方法的引用。它可以将方法作为参数传递,实现回调机制。 定义委托: csharp复制 …...
从DNS到TCP:DNS解析流程和浏览器输入域名访问流程
1 DNS 解析流程 1.1 什么是DNS域名解析 在生活中我们会经常遇到域名,比如说CSDN的域名www.csdn.net,百度的域名www.baidu.com,我们也会碰到IP,现在目前有的是IPV4,IPV6。那这两个有什么区别呢?IP地址是互联网上计算机…...
【MySQL、Oracle、SQLserver、postgresql】查询多条数据合并成一行
四大数据库多行合并为单行:函数详解与对比 一、MySQL**GROUP_CONCAT()** 函数说明:语法结构:参数解释:示例:注意事项: 二、Oracle**LISTAGG()** 函数说明:语法结构:参数解释…...
解锁Egg.js:从Node.js小白到Web开发高手的进阶之路
一、Egg.js 是什么 在当今的 Web 开发领域,Node.js 凭借其事件驱动、非阻塞 I/O 的模型,在构建高性能、可扩展的网络应用方面展现出独特的优势 ,受到了广大开发者的青睐。它让 JavaScript 不仅局限于前端,还能在服务器端大展身手&…...
JavaWeb后端基础(4)
这一篇就开始是做一个项目了,在项目里学习,我主要记录在学习过程中遇到的问题,以及一些知识点 Restful风格 一种软件架构风格 在REST风格的URL中,通过四种请求方式,来操作数据的增删改查。 GET : 查询 …...
软件试用 防破解 防软件调试(C# )
防破解&防软件调试 实现思路 这里采用C#语言为例: 获取网络北京时间:向百度发送 HTTP 请求,从响应头中提取日期时间信息,将其转换为本地时间。记录试用开始时间:首次运行软件时,将获取的百度北京时间作为试用开始时间,并加密存储在本地文件中。检查试用是否过期:每…...
【文献阅读】The Efficiency Spectrum of Large Language Models: An Algorithmic Survey
这篇文章发表于2024年4月 摘要 大语言模型(LLMs)的快速发展推动了多个领域的变革,重塑了通用人工智能的格局。然而,这些模型不断增长的计算和内存需求带来了巨大挑战,阻碍了学术研究和实际应用。为解决这些问题&…...
OpenGL ES -> GLSurfaceView纹理贴图
贴图 XML文件 <?xml version"1.0" encoding"utf-8"?> <com.example.myapplication.MyGLSurfaceViewxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height…...
FastGPT 源码:基于 LLM 实现 Rerank (含Prompt)
文章目录 基于 LLM 实现 Rerank函数定义预期输出实现说明使用建议完整 Prompt 基于 LLM 实现 Rerank 下边通过设计 Prompt 让 LLM 实现重排序的功能。 函数定义 class LLMReranker:def __init__(self, llm_client):self.llm llm_clientdef rerank(self, query: str, docume…...
DE2115实现4位全加器和3-8译码器(FPGA)
一、配置环境 1、Quartus 18.1安装教程 软件:Quartus版本:Quartus 18.1语言:英文大小:5.78G安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.0GHz 内存4G(或更高) 下载通道①百度网盘丨64位下载…...
大语言模型(LLM)如何赋能时间序列分析?
引言 近年来,大语言模型(LLM)在文本生成、推理和跨模态任务中展现了惊人能力。与此同时,时间序列分析作为工业、金融、物联网等领域的核心技术,长期依赖传统统计模型(如ARIMA)或深度学习模型&a…...
