【深圳五兴科技】Java后端面经

本文目录

  • 写在前面
  • 试题总览
  • 1、java集合
  • 2、创建线程的方式
  • 3、对spring的理解
  • 4、Spring Boot 和传统 Spring 框架的一些区别
  • 5、springboot如何解决循环依赖
  • 6、对mybatis的理解
  • 7、缓存三兄弟
  • 8、接口响应慢的处理思路
  • 9、http的状态码

写在前面

关于这个专栏:
本专栏记录一些互联网大厂、小厂的面试实录!包含校招、社招!
内容主要来源:博主面试总结以及博主从牛客网等平台摘录
专栏地址:2023Java面试实录

试题总览

在这里插入图片描述

1、java集合

Java集合框架提供了一组用于存储和操作数据的接口和类。以下是Java集合框架中最常用的一些集合类型:
List(列表):有序、可重复的集合,常用的实现类有ArrayList和LinkedList。
Set(集合):无序、不可重复的集合,常用的实现类有HashSet和TreeSet。
Map(映射):键值对的集合,每个键唯一,常用的实现类有HashMap和TreeMap。
Queue(队列):先进先出(FIFO)的集合,常用的实现类有LinkedList和PriorityQueue。
Stack(栈):后进先出(LIFO)的集合,常用的实现类是Stack。
Deque(双端队列):既可以作为队列使用,也可以作为栈使用的集合,常用的实现类是ArrayDeque。
除了以上常用的集合类型,Java还提供了一些其他的集合类,如BitSet、Vector等,以满足不同的需求

2、创建线程的方式

在 Java 中,创建线程的方式主要有以下几种:

1、继承 Thread 类:定义一个类继承自 Thread 类,并重写其 run() 方法来定义线程执行的任务。然后创建该类的实例并调用 start() 方法启动线程

class MyThread extends Thread {public void run() {// 线程执行的任务}
}
MyThread thread = new MyThread();
thread.start();

2、实现 Runnable 接口:定义一个实现了 Runnable 接口的类,实现接口中的 run() 方法来定义线程执行的任务。然后将该实现类的实例传递给 Thread 类的构造函数,并调用 start() 方法启动线程。

class MyRunnable implements Runnable {public void run() {// 线程执行的任务}
}MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();

3、使用匿名内部类:可以通过匿名内部类的方式实现 Runnable 接口,简化代码编写。

Runnable myRunnable = new Runnable() {public void run() {// 线程执行的任务}
};Thread thread = new Thread(myRunnable);
thread.start();

4、使用 Lambda 表达式:Java 8 引入的 Lambda 表达式可以进一步简化线程创建的代码。

Runnable myRunnable = () -> {// 线程执行的任务
};Thread thread = new Thread(myRunnable);
thread.start();

3、对spring的理解

Spring 是一个开源的轻量级框架,它为构建企业级应用程序提供了全面的基础设施支持。以下是对 Spring 框架的一些理解:
IoC(控制反转):Spring 提供了 IoC 容器,通过依赖注入的方式管理组件之间的依赖关系,降低了组件之间的耦合度,使得代码更加灵活、可维护、可测试。
AOP(面向切面编程):Spring 支持 AOP 编程,通过切面(Aspect)将横切逻辑(如日志记录、事务管理等)与核心业务逻辑分离,提高了代码的模块化和可重用性。
声明式事务管理:Spring 提供了声明式事务管理的支持,简化了事务管理的配置,使开发者能够专注于业务逻辑的实现,而不必过多关注事务管理的细节。
模块化设计:Spring 框架被设计成由多个独立的模块组成,开发者可以根据需要选择合适的模块来使用,例如 Spring Core、Spring MVC、Spring Data 等,使得开发更加灵活和轻量级。
简化开发:Spring 提供了大量的现成解决方案和模板,并且支持各种技术整合,如与 ORM 框架(如 Hibernate、MyBatis)的集成、与消息队列(如 ActiveMQ、RabbitMQ)的集成等,可以大大简化企业应用的开发过程。
总的来说,Spring 框架通过提供一套全面的功能和良好的设计思想,帮助开发者快速构建可扩展、高效、易维护的企业级应用程序。

4、Spring Boot 和传统 Spring 框架的一些区别

Spring Boot 是基于 Spring 框架的一个开发框架,它旨在简化基于 Spring 的应用程序的配置和部署。下面是 Spring Boot 和传统 Spring 框架的一些区别:
自动配置: Spring Boot 通过使用自动配置(auto-configuration)的机制,根据应用程序的依赖和配置,自动配置 Spring 相关的组件和功能。而传统的 Spring 框架需要手动配置大量的 XML 或 Java 配置文件。
起步依赖: Spring Boot 引入了起步依赖(Starter Dependencies)的概念,它是一种预配置的依赖项集合,可以简化项目的依赖管理。通过引入相关的起步依赖,开发者无需手动添加和管理每个单独的依赖项。
嵌入式服务器: Spring Boot 默认内嵌了常用的 Web 服务器,如 Tomcat、Jetty 或 Undertow,开发者无需手动配置或部署额外的服务器。
简化的配置: Spring Boot 使用约定优于配置的原则,提供了默认的配置,使得开发者能够快速启动应用程序。同时,Spring Boot 支持外部化配置,可以通过属性文件、环境变量等方式灵活配置应用程序。
健康检查和监控: Spring Boot 提供了健康检查和监控的功能,通过访问特定的端点(如/actuator/health)可以获取应用程序的运行状态、性能指标等信息。
总的来说,Spring Boot 提供了一种更简化、更快速的开发方式,使得基于 Spring 的应用程序的开发、配置和部署更加高效和便捷。它适用于构建独立的、可扩展的、自包含的应用程序,而传统的 Spring 框架则更适用于需要更精细控制和配置的复杂应用程序。

5、springboot如何解决循环依赖

在 Spring Boot 中,处理循环依赖(circular dependency)的方式与传统的 Spring 框架是一致的。Spring 框架本身提供了解决循环依赖的机制,而 Spring Boot 作为基于 Spring 的快速开发框架,并未改变这一机制。
通常情况下,Spring 解决循环依赖的方式是利用三级缓存(three-level cache):

第一级缓存:Spring 在创建 bean 实例时,将正在创建的 bean 放入一个缓存中,以便后续引用。
第二级缓存:如果在创建 bean 的过程中遇到循环依赖,Spring 将创建一个包装过的代理对象作为占位符,同时将未完成创建的 bean 放入第二级缓存中。
第三级缓存:当出现循环依赖时,Spring 会尝试从第二级缓存中获取代理对象,然后通过调用代理对象的方法来完成对另一个 bean 的注入。

通过这种方式,Spring 能够在遇到循环依赖时,仍然能够正常创建和管理 bean 实例。

6、对mybatis的理解

MyBatis 是一个优秀的持久层框架,它将 SQL 语句和 Java 代码进行分离,通过 XML 文件或注解来配置 SQL 映射关系,从而简化了数据库操作的编写和维护。以下是对 MyBatis 的一些理解:
SQL 与 Java 之间的分离:MyBatis 采用了将 SQL 语句与 Java 代码进行分离的方式,通过编写 XML 文件或使用注解来定义 SQL 映射关系,使得开发者能够更清晰地管理 SQL 语句,减少了 Java 代码中硬编码 SQL 的情况。
灵活的映射配置:MyBatis 支持灵活的映射配置,可以通过 XML 文件或注解来定义对象与数据库表之间的映射关系,包括字段映射、关联关系、结果集映射等,同时还支持动态 SQL,可以根据条件动态生成 SQL 语句。
高度可定制化:MyBatis 提供了丰富的配置选项和插件机制,可以对其行为进行高度定制,例如配置缓存、执行器、日志输出等,同时还可以编写自定义插件来扩展 MyBatis 的功能。
优秀的性能:MyBatis 使用 JDBC 进行底层数据库操作,性能较高,同时提供了缓存机制和延迟加载等功能,可以有效提升查询效率,并且避免了 ORM 框架的性能问题。
轻量级框架:相比于其他 ORM 框架,MyBatis 是一个轻量级的框架,学习曲线较低,使用简单,适合对 SQL 有较好掌握的开发者使用,同时也支持与 Spring 等主流框架集成。
总的来说,MyBatis 是一个功能强大、灵活可定制、性能优秀的持久层框架,适用于需要灵活控制 SQL 语句和数据库操作的项目,能够帮助开发者提高开发效率,同时保持良好的性能表现。

7、缓存三兄弟

"缓存三兄弟"通常指的是缓存击穿、缓存雪崩和缓存穿透,它们是在使用缓存时可能会遇到的一些常见问题。
缓存击穿
问题描述:指的是在某个时间点,某个热点数据突然失效,此时大量请求并发访问这个热点数据,导致所有请求都直接访问数据库,造成数据库压力剧增。
解决方法:可以在缓存中设置热点数据的过期时间,或者使用互斥锁(如分布式锁)来避免多个线程同时访问数据库。
缓存雪崩:
问题描述:指的是缓存中大量数据同时失效,导致大量请求直接访问数据库,类似于缓存击穿,但是影响范围更广,可能涉及多个缓存键值对。
解决方法:可以给缓存数据设置不同的过期时间,采用多级缓存策略,或者使用熔断机制来保护数据库。
缓存穿透:
问题描述:指的是恶意请求访问不存在的数据,由于缓存没有命中,请求直接访问数据库,这种请求可能是攻击性的,也可能是由于程序错误导致的。
解决方法:可以在缓存中设置空对象占位,或者使用布隆过滤器等技术来拦截无效请求,另外也可以对请求参数进行校验来过滤无效请求。
解决缓存问题需要综合考虑缓存的设计、失效策略、并发控制等多个方面,通常需要结合具体的业务场景和系统架构来进行调整和优化。

8、接口响应慢的处理思路

理接口响应慢的问题需要综合考虑系统性能、网络延迟、数据库查询等多个方面,以下是一些处理思路:
性能监控和日志分析:
首先,需要对系统进行性能监控和日志分析,通过监控工具和日志记录系统的响应时间、CPU 使用率、内存占用情况等,定位慢响应问题所在。
优化数据库查询:
如果接口涉及数据库查询,可以通过索引优化、SQL 优化、分库分表等方式来提升数据库查询效率。
并发处理和线程池:
对于需要大量并发处理的接口,可以采用线程池来管理并发请求,避免因为线程创建和销毁带来的性能损耗。
缓存优化:
对于需要频繁访问的数据,可以考虑增加缓存层,减少对数据库的访问,提高数据读取速度。
网络优化:
如果接口涉及跨网络通讯,可以通过优化网络拓扑结构、使用 CDN 等方式来提高网络传输效率。
降级和限流:
当接口响应慢时,可以考虑实施降级策略,返回默认数据或者提示信息,避免影响整个系统的稳定性;另外也可以考虑实施限流策略,控制并发访问量,避免系统过载。
技术选型优化:
对于某些核心接口,可以考虑优化底层技术选型,例如更高效的框架、更适合的数据库等。
代码优化:
在代码层面,可以通过优化算法、减少不必要的计算、减少内存使用等方式来提高接口响应速度。

9、http的状态码

HTTP 协议定义了多种状态码,用于表示客户端请求的处理结果。以下是一些常见的 HTTP 状态码及其含义:

1xx 信息性状态码:

100 Continue:服务器已经收到请求头,并且客户端应该继续发送请求体。
101 Switching Protocols:服务器正在切换协议,例如切换到 WebSocket。

2xx 成功状态码:

200 OK:请求成功。
201 Created:请求已创建新资源。
204 No Content:服务器成功处理请求,但不返回任何内容。

3xx 重定向状态码:

301 Moved Permanently:永久重定向。
302 Found:临时重定向。
304 Not Modified:资源未修改,可使用缓存的版本。

4xx 客户端错误状态码:

400 Bad Request:请求无效。
401 Unauthorized:未授权。
403 Forbidden:禁止访问。
404 Not Found:资源未找到。

5xx 服务器错误状态码:

500 Internal Server Error:服务器内部错误。
502 Bad Gateway:网关错误。
503 Service Unavailable:服务不可用。
504 Gateway Timeout:网关超时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/721344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【轮式平衡机器人】——TMS320F28069片内外设之Timer_IT(补:CCS程序烧录方法)

引入 Timer_IT 指的是 TMS320F28069 的定时器中断功能。在微控制器或数字信号控制器中,定时器是一个非常重要的外设,它可以用来产生固定时间间隔的中断,或者用来精确计算时间。 Timer_IT 的主要特点如下: 定时功能:…

React报错 之 Objects are not valid as a React child

原文链接: 1、React报错之Objects are not valid as a React child 2、Objects are not valid as a React child error [Solved] 作者:Borislav Hadzhiev 以下文中涉及到的链接均来自于该作者,他写了很多相关的文章,可以多看看他的…

综合素质保分卷一

10.根据《中华人民共和国预防未成年人犯罪法》的规定,强子多次实施了严重危害社会的行为后,经 由专门教育指导委员会评估同意,( D)会同公安机关可以决定将其送入专门学校接受专门教育。 A.父母或监护人 B.教师…

深度学习GPU环境安装(WINDOWS安装NVIDIA)

1.检测是否支持GPU环境 1.1.打开设备管理器 winows下面搜索设备管理器(或者从桌面"此电脑"——>右键点击——>"管理"打开) 1.2.查看本地显卡 在"设备管理器"——"显示适配器"中,如果没有&…

【Python】-----基础知识

注释 定义:让计算机跳过这个代码执行用三个单引号/双引号都表示注释信息,在Python中单引号与双引号没有区别,但必须是成对出现 输出与输入 程序是有开始,有结束的,程序运行规则:从上而下,由内…

低代码平台开发——基于React(文末送书)

目录 小程一言适用对象本书达成 书籍介绍作者简介内容介绍书籍目录阅读指导 小程送书 小程一言 《低代码平台开发——基于React》这本书主要围绕低代码平台和React技术的结合展开,为读者提供了关于低代码平台开发的理论和实践知识。 ## 书中内容简介 书中内容分为…

go-zero入门

本文简单介绍了go-zero,以及go-zero相关的安装配置。通过go-zero的hello world级别的一个的单体应用和一个包含两个服务的微服务应用,以实践的方式展示了go-zero项目的入门级搭建。 文章目录 1. 简介2. 快速开发单体应用3. 微服务应用搭建3.1 用户服务 u…

一本书讲透ChatGPT,实现从理论到实践的跨越!大模型技术工程师必读书籍【送书活动】

目录 前言一、内容简介二、作者简介三、专家推荐四、读者对象五、目录福利总结 前言 OpenAI 在 2022 年 11 月推出了人工智能聊天应用—ChatGPT。它具有广泛的应用场景,在多项专业和学术基准测试中表现出的智力水平,不仅接近甚至有时超越了人类的平均水平…

【Docker】Windows11操作系统下安装、使用Docker保姆级教程

【Docker】Windows11操作系统下安装、使用Docker保姆级教程 大家好 我是寸铁👊 总结了一篇【Docker】Windows11操作系统下安装、使用Docker保姆级教程的文章✨ 喜欢的小伙伴可以点点关注 💝 前言 什么是 Docker? Docker 是一个开源平台&…

linux实现远程文件夹共享-samba

目录 问题描述Samba如何挂载常用参数临时挂载实例一种长期挂载方法(已失败,仅供参考)查看挂载取消挂载umount失败 问题描述 我的代码需要访问存在于两个系统(win和linux)的文件夹,我不是文件夹的创建者&am…

STM32基础--什么是寄存器

STM32 长啥样 我使用的芯片是 144pin 的 STM32F103ZET6,具体见图 STM32F103ZET6 实物图。这个就是我们接下来要学习的 STM32,它将带领我们进入嵌入式的殿堂。芯片正面是丝印,ARM 应该是表示该芯片使用的是 ARM 的内核,STM32F103Z…

three.js如何实现简易3D机房?(一)基础准备-上

目录 一、tips 二、功能说明 1.模型初始化 2.功能交互 三、初始化准备 1.目录结构 2.创建三要素 3.创建轨道控制器 4.初始化灯光 5.适配 6.循环渲染 一、tips 1.three.js入门的相关基础性知识就不在此过多赘述了,可以自行提前了解 three.js docs&…

Pytest框架中的测试用例执行方式!

前言 本文将针对pytest的核心特性之一——测试用例的执行方式展开深入探讨,并通过详尽的实战示例展示如何在不同环境下灵活操控测试运行,同时全面解析pytest中常见的且极具实用价值的命令行选项。 一、从基础到进阶:pytest在命令行下的测试用…

苹果电脑专业的Mac垃圾清理工具CleanMyMac X4.14.7

CleanMyMac X是一款专业的Mac清理工具,它具有强大的功能和易用的界面,可以帮助用户快速清理Mac上的无用文件和垃圾,优化系统性能,提升电脑运行速度。 该软件的核心功能包括智能扫描与清理、应用程序管理、隐私保护和系统维护等。…

简单介绍SpeechPrompt、SpeechPrompt V2、SpeechGen

主要介绍SpeechPrompt、SpeechPrompt V2、SpeechGen SpeechPrompt 模型结构和原理(语音到符号) 整体思路:音频特征提取(HuBert/CPC),离散–》deep prompt speechLM(GSLM)—》概率映射–>目标Verbaliz…

代码随想录刷题笔记-Day28

1. 重新安排行程 332. 重新安排行程https://leetcode.cn/problems/reconstruct-itinerary/给你一份航线列表 tickets ,其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK(肯…

计算题--时标网络图

时标网络图相当于是双代号网络图和横道图的结合体,特点是多了虚线和波浪线〰️,虚线代表虚工作(只能竖着画),波浪线代表自由时差(横着画)。 在时标网络图中 找关键路径,没有波浪线的…

07_mdioLinux内核模块

01_basicLinux内核模块-CSDN博客文章浏览阅读316次&#xff0c;点赞3次&#xff0c;收藏3次。环境IDubuntuMakefilemodules:clean:basic.creturn 0;运行效果。https://blog.csdn.net/m0_37132481/article/details/136157384my_mdio.c #include <linux/kernel.h> #includ…

【数据结构与算法】深入浅出:单链表的实现和应用

&#x1f331;博客主页&#xff1a;青竹雾色间. &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ✨人生如寄&#xff0c;多忧何为 ✨ 目录 前言 单链表的基本概念 节点 头节点 尾节点 单链表的基本操作 创建单链表 头插法&#xff1a; 尾插法&#…

【数据结构】 简单认识包装类与泛型

文章目录 包装类基本数据类型和对应的包装类拆箱和装箱自动装箱和自动拆箱包装类面试题 什么是泛型为什么要使用泛型泛型类的创建语法泛型类的使用语法示例类型推导(Type Inference) 裸类型(Raw Type)泛型如何编译的擦除机制为什么不能实例化泛型类型数组 泛型的上界语法示例复…