当前位置: 首页 > news >正文

【深圳五兴科技】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:网关超时。

相关文章:

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

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

画图(ccf201409-2)解题思路

解题思路 填充100*100二维数组,范围内的元素修改成1,最后累积求和。...

蓝桥杯刷题(一)

一、 import os import sys def dps(s):dp [0] * len(s)dp[0] ord(s[0]) - 96if len(s) 1:return dp[-1]dp[1] max(ord(s[0]) - 96, ord(s[1]) - 96)for i in range(2, len(s)):dp[i] max(dp[i - 1], dp[i - 2] (ord(s[i])) - 96)return dp[-1] s input() print(dps(s))…...

设计模式:策略模式 ⑥

一、策略模式思想 简介 策略模式(Strategy Pattern)属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。…...

数据结构从入门到精通——顺序表

顺序表 前言一、线性表二、顺序表2.1概念及结构2.2 接口实现2.3 数组相关面试题2.4 顺序表的问题及思考 三、顺序表具体实现代码顺序表的初始化顺序表的销毁顺序表的打印顺序表的增容顺序表的头部/尾部插入顺序表的头部/尾部删除指定位置之前插入数据和删除指定位置数据顺序表元…...

001-CSS-水平垂直居中布局

水平垂直居中布局 方案一:弹性盒子布局方案二:绝对定位 transform方案三:margin 绝对定位,四个方向为零方案四:绝对定位 margin方案五:绝对定位 calc 方案一:弹性盒子布局 💡 T…...

【[STM32]标准库-自定义BootLoader】

[STM32]标准库-自定义BootLoader BootloaderBootloader的实现BOOTloader工程APP工程 Bootloader bootloader其实就是一段启动程序,它在芯片启动的时候最先被执行,可以用来做一些硬件的初始化或者用作固件热更新,当初始化完成之后跳转到对应的…...

Spring Boot项目中不使用@RequestMapping相关注解,如何动态发布自定义URL路径

一、前言 在Spring Boot项目开发过程中,对于接口API发布URL访问路径,一般都是在类上标识RestController或者Controller注解,然后在方法上标识RequestMapping相关注解,比如:PostMapping、GetMapping注解,通…...

Vue中有哪些优化性能的方法?

Vue是一款流行的JavaScript框架,用于构建交互性强的Web应用程序。在前端开发中,性能优化是一个至关重要的方面,尤其是当应用程序规模变大时。Vue提供了许多优化性能的方法,可以帮助开发人员提升应用程序的性能,从而提升…...

Python pandas遍历行数据的2种方法

背景 pandas在数据处理过程中,除了对整列字段进行处理之外,有时还需求对每一行进行遍历,来处理每行的数据。本篇文章介绍 2 种方法,来遍历pandas 的行数据 小编环境 import sysprint(python 版本:,sys.version.spli…...

Spring之@Transactional源码解析

前言 我们在日常开发的时候经常会用到组合注解,比如:EnableTransactionManagement Transactional、EnableAsync Async、EnableAspectJAutoProxy Aspect。今天我们就来抽丝剥茧,揭开Transactional注解的神秘面纱 EnableTransactionManagement注解的作用 当我们看到类似Ena…...

第三届国际亲子游泳学术峰会,麒小佑为亲游行业提供健康解决方案

第三届国际亲子游泳学术峰会大合影 2024年2月26—28日,第三届国际亲子游泳学术峰会在中国青岛成功召开。 第三届国际亲子游泳学术峰会是中国婴幼游泳行业最高标准的学术性会议,由亲游圈主办,旨在为本行业搭建一个高端圈层,帮助机…...

Python光速入门 - Flask轻量级框架

FlASK是一个轻量级的WSGI Web应用程序框架,Flask的核心包括Werkzeug工具箱和Jinja2模板引擎,它没有默认使用的数据库或窗体验证工具,这意味着用户可以根据自己的需求选择不同的数据库和验证工具。Flask的设计理念是保持核心简单&#xff0c…...

C/C++ 说说引用这玩仍是干啥的

引用的本质就是给某个实例对象起个外号。生活中李逵&#xff0c;也叫黑旋风。诸葛亮&#xff0c;又叫孔明。 引用的方式&#xff1a; 类型& 引用名对象名 举个例子 int i0; int& ki;//这种方式就是引用----->i有了自己的小名&#xff0c;从次叫k了 std::cout<…...

swoole

php是单线程。php是靠多进程来处理任务&#xff0c;任何后端语言都可以采用多进程处理方式。如我们常用的php-fpm进程管理器。线程与协程,大小的关系是进程>线程>协程,而我们所说的swoole让php实现了多线程,其实在这里来说,就是好比让php创建了多个进程,每个进程执行一条…...

kubectl基础命令详解

管理名称空间资源 查看名称空间 [rootceshi-130 conf]# kubectl get ns [rootceshi-130 conf]# kubectl get namespace NAME STATUS AGE default Active 7d17h kube-node-lease Active 7d17h kube-public Active 7d17h kube-system …...

collection的遍历方式

增强for遍历 增强for的底层就是迭代器&#xff0c;为了简化迭代器的代码书写的。 他是jdk5之后出现的&#xff0c;其内部原理就是一个Iterator迭代器。 所有的单列集合和数组才能用增强for进行遍历。 package myCollection;import java.util.ArrayList; import java.util.C…...

SpringBoot中@Async使用注意事项

前言 Async这个注解想必大家都用过&#xff0c;是用来实现异步调用的。一个方法加上这个注解以后&#xff0c;当被调用时会使用新的线程来调用。但其实这里面也有一个坑。 问题 这个注解使用时存在如下问题&#xff1a;在没有自定义线程池的场景下&#xff0c;默认会采用Sim…...

IEEE 802.11 RTS/CTS/BA/Management

RTS/CTS IEEE 802.11 RTS/CTS即RTS/CTS协议(Request To Send/Clear To Send)即请求发送/清除发送协议是被802.11无线网络协议采用的一种用来减少由隐藏节点问题所造成的冲突的机制。 相当于一种握手协议,主要用来解决"隐藏终端"问题。"隐藏终端"(Hid…...

【风格迁移】对比度保持连贯性损失 CCPL:解决图像局部失真、视频帧间的连贯性和闪烁

对比度保持连贯性损失 CCPL&#xff1a;解决图像局部失真、视频帧间的连贯性和闪烁 提出背景解法&#xff1a;对比度保持连贯性损失&#xff08;CCPL&#xff09; 局部一致性假设 对比学习机制 邻域调节策略 互信息最大化对比学习&#xff1a;在无需标签的情况下有效学习区分…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...