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

news2025/2/23 22:49:49

本文目录

  • 写在前面
  • 试题总览
  • 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.coloradmin.cn/o/1493403.html

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

相关文章

基于51单片机的电子秒表Protues仿真设计

目录 一、设计背景 二、实现功能 三、仿真结果 四、源程序 一、设计背景 随着科技的不断发展,电子设备在我们生活中扮演着愈加重要的角色。这些电子设备不仅使我们的生活更加便利,还帮助我们提高工作效率和精确度。其中,电子秒表是常用的计…

如何配置JDK的环境变量(简单灵活易懂)

前言: 开始学习java的小伙伴们一定都备一件事困扰过,那就是jdk的环境变量的配置,搞不懂为啥要配置环境变量,到底有啥子用?接下来小编带大家配置一下 配置环境变量的作用? Path:当用javac、jav…

redis 缓存击穿问题(互斥锁,逻辑过期)

1、缓存击穿问题 缓存击穿问题:一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。 场景:假设线程1在查询缓存之后,本来应该去查询数据库,然后把这个数据重新加…

Java学习笔记002——类的修饰符

在Java语言中,类的访问修饰符决定了其它类能够访问该类的方式。类有如下4种访问修饰符,在创建类时用于类的声明: 1、public: 当一个类被声明为public时,它可以从任何其他类中被访问,无论这些类位于哪个包中。通常&am…

探索设计模式的魅力:深入解析解释器模式-学习、实现与高效使用的全指南

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,并且坚持默默的做事。 探索设计模式的魅力:解析解释器模式学习、实现与高效使用全指南 文章目录 一、案…

2024大厂Java面试最火问题,1200页文档笔记

前言 ⽂章有点⻓,请耐⼼看完,绝对有收获!不想听我BB直接进⼊⾯试分享: 准备过程蚂蚁⾦服⾯试分享拼多多⾯试分享字节跳动⾯试分享最后总结个人所得(供大家参考学习) 当时我⾃⼰也准备出去看看机会&#…

2024 年广西职业院校技能大赛高职组《云计算应用》赛项赛题第 3 套

#需要资源或有问题的,可私博主!!! #需要资源或有问题的,可私博主!!! #需要资源或有问题的,可私博主!!! 某企业根据自身业务需求&…

工业网关、物联网网关与PLC网关是什么?

网关是什么? 网关是一种用于连接不同网络的网络设备,其作用是实现网络之间的通信和数据交换。它负责将一个网络的数据转发到另一个网络,并且可以进行路由、转换和过滤等处理。通常用于连接局域网和广域网之间,可以是硬件设备或者软…

Jenkins如何做到parameter页面里2个参数的联动

在Jenkins中,参数化构建是一种非常有用的功能,它可以让用户在构建过程中输入参数,从而实现更灵活的构建流程。有时候,我们希望两个参数之间能够实现联动,即一个参数的取值会影响另一个参数的取值。要实现这样的功能&am…

蚂蚁感冒c++

题目 思路 “两蚂蚁碰面会掉头,若其中一只蚂蚁感冒了,会把感冒传染给碰到的蚂蚁”,这句话看作是“两蚂蚁碰面会互相穿过,只是把感冒的状态传给了另一只蚂蚁”,因为哪只蚂蚁感冒了并不是题目的重点,重点是有…

iview碰到的一些问题总结

iview tabs嵌套使用问题 tabs嵌套使用的时候不是直接套用行了&#xff0c;直接套用会出现内层tab都集成到一级tab去&#xff0c;需要设置该属性指向对应 Tabs 的 name 字段(需要版本大于3.3.1) <Tabs name"tab1" ><TabPane label"标签1" tab&qu…

springboot基于java的中医院门诊挂号诊断就诊系统ssm+jsp

主要研究内容&#xff1a; 医院门诊挂号系统分为护士&#xff0c;医生&#xff0c;药房&#xff0c;收费&#xff0c;管理员等权限。 护士&#xff1a;挂号、退号、查询病人。挂号——就诊科室(发热门诊、骨科、妇科等等)&#xff0c;就诊医生数据库获取&#xff0c;挂号类型—…

【vue.js】文档解读【day 1】 | 模板语法1

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 本人会很热心的阐述自己的想法&#xff01;谢谢&#xff01;&#xff01;&#xff01; 文章目录 模板语法前言文本插值原始HTML属性Attribute绑定动态绑定多个值 模板语法 前言 Vue 使用一种基于 HTML…

CAN总线的拓扑类型和CAN收发器(原理讲解)

1&#xff1a;CAN收发器&#xff08;原理讲解&#xff09; 从原理上来讲CAN_H拉升电压&#xff0c;或CAN_L拉低电压的原理。 以上是TJA1145AT的俯瞰图&#xff0c;此芯片是NXP比较先进的CAN收发器&#xff0c;带SPI总线系统。 回到正题&#xff0c;CAN_H和CAN_L收发器是通过内…

大模型日报|今日必读的9篇大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.Cognition is All You Need 最近对如由大型语言模型&#xff08;LLMs&#xff09;驱动的聊天机器人等对话式人工智能&#xff08;AI&#xff09;工具在复杂的现实世界知识工作中的应用进行的研究表明&#xff0c;这…

MySQL NDB Cluster 分布式架构搭建 自定义启动、重启和关闭集群Shell脚本

此次NDB Cluster使用三台虚拟机进行搭建&#xff0c;一台作为管理节点&#xff1b;而对于另外两台服务器&#xff0c;每一台都充当着数据节点和SQL节点的角色。注意不是MGR主从复制架构&#xff0c;而是分布式MySQL架构。 创建 /var/lib/mysql-cluster/config.ini Cluster全局…

uniapp iOS 真机调试

一、下载爱思助手 二、打开爱思助手&#xff0c;把你的 苹果手机 用原装数据线连接至电脑&#xff1a; 找到 工具箱 > 搜索IPA > 打开IAP签名 三、添加 IPA 文件 mac&#xff1a;finder 》应用程序 》右键 HbuilderX 》显示包内容 》HbuilderX / plugins/ lau…

seata服务器集群搭建

搭建seata-server-1.3服务器对应SpringBoot2.3.12&#xff0c;springcloud2.2.3 <spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version> 首先你安装了nacos 1解压文件 2修改cong/file.conf 让seata集群信息可以共享&#xff0c;我们应该…

基于 HBase Phoenix 构建实时数仓(1)—— Hadoop HA 安装部署

目录 一、主机规划 二、环境准备 1. 启动 NTP 时钟同步 2. 修改 hosts 文件 3. 配置所有主机间 ssh 免密 4. 修改用户可打开文件数与进程数&#xff08;可选&#xff09; 三、安装 JDK 四、安装部署 Zookeeper 集群 1. 解压、配置环境变量 2. 创建配置文件 3. 创建新…

【视频转码】基于RK3588的视频转码探索

传统的视频转码服务基本都是基于X86下CPU、GPU转码&#xff0c;对硬件性能、功耗、成本来说都比较高。从技术角度来说现有视频转码技术有&#xff1a; 视频编码转变&#xff1a; 1. H.264 > H.265 保持视频分辨率、清晰度不变情况下&#xff0c;更改视频压缩方式&#xff0…