远景集团面试后端Java岗位问答与总结汇总

1. Spring Boot 了解多少

Spring Boot 是一个开源的 Java-based 框架,旨在简化 Spring 应用的配置和开发过程。它通过约定优于配置的理念,极大地减少了开发人员配置的麻烦。Spring Boot 提供了自动配置机制,支持内嵌的 Tomcat、Jetty 或 Undertow 容器,能够快速创建、启动和部署 Spring 应用。​编辑

常见的优点包括:

  • 快速启动:通过内嵌服务器实现无需部署容器,减少了部署时间。
  • 自动配置:根据项目依赖自动配置相关的 Bean,简化了开发过程。
  • 微服务支持:Spring Boot 提供了完善的微服务架构支持,便于与 Spring Cloud 配合使用。编辑

2. Spring MVC

Spring MVC(Model-View-Controller)是 Spring 框架的一个 Web 模块,提供了基于 Java 的 HTTP 请求处理方式。它将请求和响应的处理分为三个主要组件:

  • Model:包含了业务数据和逻辑。
  • View:负责展示数据,可以是 JSP、Thymeleaf 等。
  • Controller:负责处理用户请求,封装业务逻辑并返回结果。

Spring MVC 使用了请求分发机制,通过 DispatcherServlet 作为前端控制器来协调请求和相应的视图。在处理请求时,它会根据 URL 映射到具体的 Controller,然后调用相关的 Service 层处理业务逻辑。

3. Bean 生命周期

在 Spring 中,Bean 生命周期是指 Bean 从创建到销毁的整个过程。主要步骤如下:

  1. 实例化:通过反射机制创建 Bean 实例。
  2. 填充属性:Spring 会注入配置文件或注解中定义的属性值(依赖注入)。
  3. 初始化 :如果 Bean 实现了 InitializingBean 接口,或配置了 init-method,会调用相应的初始化方法。
  4. 销毁 :当容器关闭或 Bean 不再需要时,会调用 destroy-method 方法进行销毁,若 Bean 实现了 DisposableBean 接口,也会调用其销毁方法。编辑

4. 为什么使用 MQ

消息队列(MQ)常用于异步解耦、流量削峰、分布式事务等场景。其优势如下:

  • 解耦:通过消息中间件解耦应用之间的紧密耦合。
  • 异步处理:消息队列可以异步处理任务,提高系统的响应能力和吞吐量。
  • 流量削峰:通过消息队列可以缓解系统的高并发压力,平衡系统负载。

5. JVM 内存区域

JVM 内存主要分为几个区域:

  • 堆内存(Heap):存储 Java 对象和数组,Java 中的垃圾回收发生在这里。
  • 栈内存(Stack):每个线程独立的内存区域,用于存储局部变量、方法调用和返回值。
  • 方法区(Method Area) :存储类信息、常量池、静态变量等,JVM 规范要求该区域在所有线程之间共享。
  • 程序计数器(PC Register):记录当前线程执行的字节码的行号指示器。
  • 本地方法栈(Native Method Stack):存储 native 方法的相关信息。

6. 双亲委派模型

JVM 类加载机制采用了双亲委派模型,指的是类加载器在加载类时,会先委托给父类加载器加载,如果父类加载器无法加载,再由子类加载器加载。这种机制的优点是:

  • 避免重复加载:防止同一个类被加载多次,确保了类加载的唯一性。
  • 隔离性:确保了不同层次的类加载器不会互相干扰。

7. synchronized

synchronized 是 Java 中用于实现线程同步的关键字。它可以用来修饰方法或代码块,确保在同一时刻只有一个线程能够执行该方法或代码块。

  • 方法同步synchronized 可以修饰实例方法或静态方法,分别实现对实例和类级别的同步。
  • 代码块同步 :通过 synchronized 修饰代码块,只对该代码块内的资源进行同步,能够提高性能。

8. volatile

volatile 是 Java 中的一个关键字,用来修饰变量,保证该变量在多个线程间的可见性。它确保每次读取该变量时,都会从主内存中读取,而不是缓存中的值,从而避免了线程之间的缓存不一致问题。

9. ArrayList 和 LinkedList 的区别

  • ArrayList:基于动态数组实现,支持随机访问,查询操作时间复杂度为 O(1),但插入和删除元素时可能需要移动元素,时间复杂度为 O(n)。
  • LinkedList:基于双向链表实现,插入和删除操作时间复杂度为 O(1),但查询操作需要遍历链表,时间复杂度为 O(n)。

Redis

1. Redis 的数据结构

Redis 支持多种数据结构,包括:

  • 字符串(String):最基本的数据类型,可以是文本或数字。
  • 哈希(Hash):存储键值对集合,适用于存储对象。
  • 列表(List):双向链表,适用于队列、栈等。
  • 集合(Set):无序集合,适用于去重和一些集合运算。
  • 有序集合(Sorted Set):每个元素都有一个权重值,用于排序。
  • 位图(Bitmap)HyperLogLog 等。

2. 缓存穿透

缓存穿透是指请求的数据在缓存和数据库中都不存在,导致每次请求都访问数据库,造成压力。常见的防止措施包括:

  • 布隆过滤器:在缓存中保存是否存在某个值的判断信息,防止无效请求直接访问数据库。
  • 缓存空值:对于不存在的数据,可以缓存一个空值,避免重复查询。

3. 缓存雪崩

缓存雪崩是指多个缓存同时失效,导致大量请求直接访问数据库,造成数据库压力过大。防止措施包括:

  • 设置不同的缓存过期时间:避免所有缓存同时失效。
  • 使用过期预热机制:提前加载数据到缓存中。

4. Redis 为什么快

Redis 是内存数据库,所有数据都存储在内存中,读写速度极快。同时,Redis 的数据结构是为特定场景优化的,这使得它在处理复杂操作时也能保持高效。

5. IO 多路复用

IO 多路复用是一种处理多个 IO 操作的技术,允许单一进程或线程同时处理多个 IO 操作。Redis 使用了 epoll(Linux)等多路复用机制来处理并发请求,避免了线程阻塞,提升了性能。

计算机网络

1. 三次握手

TCP 三次握手是建立可靠连接的过程:

  1. 客户端发送 SYN 请求报文。
  2. 服务器接收 SYN 请求并回应 SYN-ACK。
  3. 客户端收到 SYN-ACK 后发送 ACK,连接建立。

2. TCP 和 UDP

  • TCP(传输控制协议):面向连接,可靠,适用于对数据传输要求较高的场景。
  • UDP(用户数据报协议):无连接,不可靠,适用于实时性要求较高的场景,如视频流、语音通话。

3. nginx 负载均衡的几种方式

  • 轮询:默认方式,按顺序将请求分发到不同的服务器。
  • IP 哈希:根据客户端 IP 计算哈希值来决定请求发送的服务器。
  • 最少连接:选择当前连接数最少的服务器处理请求。

这篇文章总结了面试中可能涉及的一些常见问题,并提供了简明的回答和技术细节。在准备面试时,了解这些基础知识能帮助你更好地应对面试中的技术问题。

相关推荐
程序员清风2 小时前
网易三面:Java中默认使用的垃圾回收器及特点分版本说说?
java·后端·面试
hui函数2 小时前
Python全栈(基础篇)——Day07:后端内容(函数的参数+递归函数+实战演示+每日一题)
后端·python
爱吃烤鸡翅的酸菜鱼2 小时前
深度掌握 Git 分支体系:从基础操作到高级策略与实践案例
分布式·git·后端·gitee·github
IT_陈寒2 小时前
Python性能优化:5个让你的代码提速300%的NumPy高级技巧
前端·人工智能·后端
风象南2 小时前
从RBAC到ABAC的进阶之路:基于jCasbin实现无侵入的SpringBoot权限校验
spring boot·后端
小蒜学长3 小时前
jsp基于JavaWeb的原色蛋糕商城的设计与实现(代码+数据库+LW)
java·开发语言·数据库·spring boot·后端
JaguarJack3 小时前
PHP 图像处理实战 GD/Imagick 从入门到精通,构建高性能图像服务
后端·php
爱和冰阔落5 小时前
C++模板进阶 非类型模板参数 模板的特化 分离编译的深入探索
c++·面试·编译原理·模板
海梨花5 小时前
今日八股——JVM篇
jvm·后端·面试