本文共 5758 字,大约阅读时间需要 19 分钟。
Java面试题汇总
JVM相关面试题
唤醒阻塞线程
在Java中,唤醒阻塞线程的方法是通过notify()或notifyAll()方法,在同步块中调用。 CycliBarriar与CountdownLatch的区别
- CycliBarriar:用于多线程任务的协调,允许某些任务在其他任务完成之前等待。
- CountdownLatch:用于等待多个任务的完成,所有任务完成后才能继续。
start()与run()的区别
start()方法将线程加入线程池并执行run()方法,而run()方法直接由线程执行,不能直接调用。
垃圾回收算法
分代收集与分区收集的区别
- 分代收集:根据对象年龄划分代次,优先回收老对象。
- 分区收集:将堆分为固定大小的区间,按规律回收。
程序计数器与虚拟机栈
- 程序计数器:线程私有,记录当前线程执行的位置。
- 虚拟机栈:线程私有,存储方法调用的栈帧。
JVM类加载机制
- 类加载机制包括验证、加载、准备、直接引用、类构造器等。
JVM加载类文件的原理
- 类文件由字节流读取,转换为Class对象,存储到方法区。
堆与运行时数据区
JVM内存结构
- 新生代、老年代、永久代,新生代包括Eden、Survivor区。
对象创建过程
- new操作符创建对象,分配内存,初始化,设置元数据。
对象回收条件
永久代垃圾回收
- 永久代中的类元数据可能不被回收,但JDK 8后,永久代被移除。
垃圾收集算法类型
Spring相关面试题
Spring Boot Starters
提供预配置好的依赖,简化配置管理。 Spring Framework
轻量级的前端控制器框架,支持IOC和依赖注入。 Spring Boot运行方式
- 命令行运行:
java -jar spring-boot.jar - IDE运行:主类方法直接运行。
异常处理
使用@ExceptionHandler注解,自定义异常处理逻辑。 监视器
Spring Boot提供监控功能,集成Prometheus等。 Spring优点
简化配置、依赖管理、AOP功能强大。 Spring配置文件
application.properties:核心配置 application.xml:用于配置文件替换
热部署方式
- 热部署工具(如JRebel)
- 使用类加载器重新加载类
核心配置文件区别
application.properties:所有配置 application.xml:配置文件替换
服务注册与发现
使用Spring Cloud的服务发现组件(如Eureka)。 负载均衡与Hystrix
- 负载均衡:随机、轮询、加权
- Hystrix:实现容错和流量控制。
Spring Cloud Bus
用于事件发布和通知,主要用于分布式系统间通信。 SpringMVC控制器问题
SpringMVC与Struts2对比
- MVC:基于控制器模型,请求-处理-回应流程。
- Struts2:基于动作为中心的模型。
SpringMVC重定向与转发
- 重定向:
redirect: - 转发:
forward:
SpringMVC拦截器
拦截器链处理请求,通过@Component注解实现。 Spring IOC容器
管理Bean的生命周期,提供依赖注入功能。 依赖注入方式
- setter方法注入
- 构造器注入
- 自动注入(@Autowired)
BeanFactory与ApplicationContext
- BeanFactory:功能较简单,适合内部管理。
- ApplicationContext:提供更复杂的功能支持。
Bean容器生命周期
- 初始化:读取配置文件、解析定义。
- 处理请求:创建Bean、注入服务。
- 卸载:销毁Bean、关闭资源。
内部Bean与装配
- 内部Bean:仅在同一类中可用。
- 装配:通过注解或配置文件。
注解区别
@Component:通用标记。 @Controller:标记控制器。 @Repository:标记持久化层。 @Service:标记业务逻辑层。
注解用途
@Required:依赖注入条件。 @Autowired:自动注入依赖。
@RequestMapping与@Qualifier
@RequestMapping:定义路由映射。 @Qualifier:指定注入的Bean。
Spring支持的ORM框架
Aspect切点与通知类型
- 切点:执行某个方法或类的方法。
- 通知类型:前置(@Before)、后置(@After)、异常处理(@Throwable)。
DispatcherServlet工作流程
请求进入:通过Tomcat等容器。 执行拦截器链。 找到控制器处理。 返回结果。 WebApplicationContext
- 功能:获取上下文信息。
- 常用方法:
getServletContext(), getRequestScope()。
多线程并发相关面试题
线程创建方式
- 继承Thread类:
new Thread(" runnable").start(); - 实现Runnable接口:
new Thread(new Runnable() { ... }).start();
volatile与有序性
- volatile变量确保线程间可见性和有序性,但不能保证原子性。
start()与run()区别
- start():线程池执行run()方法。
- run():直接由线程执行。
wait与notify的使用条件
- wait():释放锁,等待其他线程通知。
- notify():通知等待的线程,但不释放锁。
wait、notify的位置要求
wait、notify的实现
线程生命周期与终止方式
- 四个状态:新生、运行、等待、终止。
- 终止方式:
stop()、exit()、出-of-bounds异常、等待超时。
线程同步方法
- synchronized关键字:锁对象控制同步。
- Lock接口:提供更细粒度的锁。
线程调度算法
线程组与 ExecutorService
- 线程组:适合处理大量短任务。
- ExecutorService:提供任务执行框架,推荐使用。
Callable与Future
- Callable接口定义一个返回值的任务。
- Future接口表示异步计算,获取结果。
FutureTask与ExecutorService
- FutureTask包装Callable任务,提交到ExecutorService执行。
线程同步方法
- synchronized、lock、atomicReference、countDownLatch。
线程唤醒与其他方法
- notify(): 唤醒单个线程。
- notifyAll(): 唤醒所有线程。
- sleep(): 让当前线程暂停。
线程池与任务执行
MyBatis相关面试题
MyBatis简介
半自动ORM框架,通过XML配置映射数据库。 优缺点
- 优点:简化CRUD操作、支持动态SQL。
- 缺点:配置复杂、特定于数据库。
适用场景
与Hibernate对比
- MyBatis:动态SQL、延迟加载。
- Hibernate:ORM层面更强,提供更高级别的抽象。
模糊查询
使用like关键字实现。 分页实现
MyBatis提供RowBounds接口,通过分页插件实现。 延迟加载
MyBatis通过缓存机制实现,减少数据库访问。 一级、二级缓存
- 一级缓存:SqlSession缓存。
- 二级缓存:SqlSessionFactory缓存。
接口绑定
使用动态代理实现,通过接口实现延伸。 Mapper接口要求
一对一、一对多实现
插件原理
- MyBatis插件扩展框架,通过拦截器链实现功能增强。
MyBatis的半自动特性
微服务相关面试题
前后端分离与微服务
微服务架构扩展前后端分离,提供更高效的服务设计。 RPC与Dubbo
- RPC:分布式通信协议。-Dubbo:基于Java的高性能RPC框架。
微服务优势
- 高效率:服务拆分后提高性能。
- 可扩展性:单点故障不影响整体系统。
微服务设计实践
- 设计接口:RESTful规范。
- 版本控制:使用Semantic Versioning。
微服务运作流程
- 输入请求:客户端发送请求。
- 内部处理:各服务按业务逻辑处理。
- 集成:服务注册与发现。
微服务优缺点
- 优点:可扩展性强、灵活性高。
- 缺点:开发复杂、运维难度大。
SOA与微服务区别
- SOA:服务化架构,强调接口规范。
- 微服务:更强调服务独立性,支持弹性扩展。
API管理
- API网关:接收请求、路由、鉴权。
- API门控:限流、监控、统计。
服务熔与服务跟踪
- 服务熔:实现服务容错,防止长时间调用。
- 服务跟踪:跟踪服务调用链路,定位问题。
有界上下文与双因素身份验证
- 有界上下文:限制服务调用次数。
- 双因素身份验证:结合证书和密码验证。
PACT在微服务中的作用
OAuth与端到端测试
- OAuth:身份验证协议。
- 端到端测试:确保整个应用流程的正确性。
语义监控与跨功能测试
- 语义监控:监控服务状态和性能。
- 跨功能测试:测试多个服务协同工作。
消费者驱动的合同
ZooKeeper相关面试题
ZooKeeper简介
分布式的持久化键值存储系统,支持动态的数据集群。 ZooKeeper功能
- 数据存储:基于文件系统。
- 命名服务:基于ZAB协议。
- 分布式锁:基于ZXID机制。
Znode类型
- 持久节点(Ephemeral):临时存在。
- 临时节点(Ephemeral):持久性更强。
ZooKeeper通知机制
ZooKeeper的典型应用
- 分布式锁:防止多个进程同时修改同一资源。
- 元数据管理:存储服务的配置信息。
ZooKeeper部署模式
常用命令
create:创建节点。 get:获取节点值。 delete:删除节点。
ZAB与Paxos算法
- ZAB:基于Zookeeper的ABAB协议。
- Paxos:基于共识算法实现高可用性共识。
ZooKeeper的优势
- 高可用性:主节点故障后自动故障转移。
- 灵活性:支持动态扩展和缩减。
ZooKeeper的缺点
- 安全性:节点权限管理较为复杂。
- 性能:在高并发下可能成为瓶颈。
ZooKeeper客户端
- Java客户端:
org.apache.zookeeper.client包。
ZooKeeper的典型应用场景
ZAB与Paxos的联系与区别
- ZAB基于Zookeeper实现,Paxos基于共识算法。
Chubby与ZooKeeper对比
- Chubby:基于RAID存储,提供高可用性服务。
- ZooKeeper:基于ZAB协议,提供分布式键值存储。
ZooKeeper的负载均衡与Nginx的区别
- ZooKeeper:基于ZAB协议,适合静态数据存储。
- Nginx:基于反向代理,适合动态请求转发。
数据库相关面试题
索引优化
- 限制索引数目,避免过多索引。
- 避免索引大对象和过长的索引。
数据库引擎
- MyISAM:适合读大写优化。
- InnoDB:支持事务,适合写大。
排序算法
并发控制
- 乐观锁:使用版本号控制。
- 悲观锁:锁竞争,使用时间戳。
分布式锁
- 基于Redis:通过Redisson实现。
- 基于ZooKeeper:基于ZXID实现。
两阶段提交协议
Java并发编程相关面试题
上下文切换
死锁与活锁
- 死锁:互相等待资源。
- 活锁:资源被占用但无法释放。
线程调度算法
线程组的使用
- 不推荐使用,推荐使用ExecutorService。
Executor框架的作用
阻塞队列实现
Callable与Future
FutureTask
线程池实现
线程同步方法
- synchronized、lock、atomicReference、countDownLatch。
线程唤醒
线程的终止方式
线程组与线程池对比
线程池的工作流程
- 接收任务:提交到任务队列。
- 执行任务:由线程池中的线程处理。
- 处理结果:将结果返回或存储。
线程池的实现方式
- 使用线程池框架(如ThreadPoolExecutor)。
线程同步与互斥方法
- synchronized关键字、ReentrantLock、atomic变量。
线程生命周期
- 新:创建线程。
- 运行:执行任务。
- 等待:等待条件满足。
- 停止:线程终止。
线程组的优缺点
线程池的优缺点
- 优点:支持并发、负载均衡、任务优先级。
- 缺点:配置复杂,资源耗尽。
线程的状态与终止方式
- 状态:新、运行、等待、终止。
- 终止方式:stop()、exit()、等待超时。
转载地址:http://suwc.baihongyu.com/