面试题
文章平均质量分 75
面试题以及解答
你知道烟火吗
随时私信,欢迎技术交流
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
MySQL InnoDB 存储引擎(原理机制、核心特性与应用实践全解析)
InnoDB是 MySQL 官方默认的事务型存储引擎,自 MySQL 5.5 之后完全取代 MyISAM 成为默认引擎。支持事务(ACID属性)行级锁(高并发)支持外键约束支持MVCC(多版本并发控制)支持崩溃恢复、自带缓存池支持聚簇索引自动化的死锁检测。原创 2025-08-09 10:44:24 · 1013 阅读 · 0 评论 -
Java实现线程任务的方式有哪些?及其区别详解(含详细代码)
方式实现难度是否可返回结果是否易扩展是否支持线程池实用范围继承Thread容易否差否测试,玩具代码实现Runnable容易否好是业务开发、简单异步实现Callable一般是好是任务需返回值或抛异常一般是好是需拿结果的异步任务线程池Executor一般都支持极好内置高并发场景必用定时任务Scheduled一般部分支持好内置定时/周期任务。原创 2025-08-08 11:16:50 · 701 阅读 · 0 评论 -
说下Fork/Join框架,与传统线程池有何不同?(含详细代码讲解)
Fork/Join框架专为递归、分治的大数据量并行任务设计,底层的工作窃取让多核利用率达最佳效果。与传统线程池相比更擅长“自动拆分、大任务合并”的场景。适合用于高性能数据处理和多核算法、并行流。日常Web、异步通知等仍建议用简单高效的ThreadPoolExecutor。原创 2025-08-07 10:11:52 · 1361 阅读 · 0 评论 -
Future和CompletableFuture的区别?原理全解与详细代码示例
Future接口是Java 5引入的,代表着一个异步任务执行后结果的“占位符”。你可以提交任务,稍后通过Future对象获取结果或监控状态。是Java 8新增的异步任务增强API,是Future的升级版。它不仅实现了Future接口,还扩展了功能,支持丰富的异步编排、流式API、事件回调等。Future 和 CompletableFuture 都是Java异步编程的重要工具。Future简单但能力有限,逐渐成为“历史遗留”;原创 2025-08-06 13:50:43 · 1102 阅读 · 0 评论 -
微服务连环雪崩问题及其解决方案详解(熔断+降级+超时实战代码)
定义:在微服务架构下,服务之间相互依赖(A->B->C),当底层某个服务(如C)因故障或响应缓慢,导致上游服务(B、A)请求全部阻塞乃至资源枯竭,最终整个调用链路全面崩溃,这种现象即“连环雪崩”。微服务连环雪崩只需一个服务异常,所有上游就会被拖垮,稳定性设计必须前置防控。超时、熔断、降级是抵御雪崩的三大法宝,务必为每条远程依赖链路配置。推荐使用Resilience4j、Hystrix(维护模式)等中间件,或自己编码隔离+降级逻辑。原创 2025-08-05 10:34:47 · 927 阅读 · 0 评论 -
深度解析AOP注解实现原理:JDK动态代理、CGLIB动态代理及应用场景
Spring容器启动解析切面、切点、注解等元信息,通过代理织入逻辑,无需业务代码变动即可横切增强。**JDK代理适合有接口类;CGLIB适合无接口类。**建议业务层代码尽量对接口编程。代理对象里调用同类非代理方法(即“内部方法调用”)不会触发AOP增强,核心逻辑应避免在同类里直调。对于性能敏感型项目,建议关注不同代理实现的开销差异,合理选择。AOP注解极大提升项目可维护性和扩展性,适合所有横切关注点的场景。原创 2025-08-05 09:53:14 · 970 阅读 · 0 评论 -
BIO、NIO、AIO的原理及区别与应用场景(含详细代码讲解)
BIO即“Blocking IO”,即传统的阻塞式编程模型。每当有一个客户端请求,服务器都需要创建一个独立的线程进行处理,线程与连接一一对应。在读写操作时,线程会被阻塞,直到数据读/写完成。NIO是Java 1.4引入的“非阻塞式IO”库,又称New IO或Non-blocking IO。与BIO线程一对一不同,NIO采用单线程+多路复用,基于Selector监听多个Channel(通道),只需少量线程即可处理大量连接。AIO又称NIO.2,是Java 7引入的“异步IO”模型。原创 2025-08-04 17:19:53 · 543 阅读 · 0 评论 -
什么是守护线程?与普通线程的区别?
通俗讲,守护线程就是“为其他线程服务”的一种线程,也可以理解成“后台线程”。当所有非守护线程(即用户线程)都结束运行时,JVM就会自动退出,无论守护线程是否还在运行。用户线程结束,JVM进程就终止;守护线程只要没有用户线程存活,哪怕自己还没跑完,也会被JVM直接强制终止。典型例子:Java虚拟机中的GC(垃圾回收)线程就是守护线程,它们后台不断“回收内存”,随着主程序结束自动销毁。守护线程(Daemon Thread)是伴随用户线程存在的“后台服务线程”,主线程(用户线程)结束后,守护线程自动终止。原创 2025-08-04 09:14:14 · 528 阅读 · 0 评论 -
说说对泛型的理解?
泛型,顾名思义,就是“参数化类型”。通俗的说,泛型允许在定义类、接口、方法时,将类型作为参数进行传递,使代码可以应用于多种不同的类型。让同一份代码适配不同类型的数据在编译期提供类型检查,避免类型转换异常。原创 2025-08-03 13:18:24 · 386 阅读 · 0 评论 -
谈谈对反射的理解?
Java反射机制,是指在程序运行期间,能够动态获取类的属性、方法、构造函数等信息,并能够操作对象属性、调用对象方法甚至创建对象实例的能力。换句话说,反射是一种让Java程序有“自省”、“自编程”、“自适应”能力的特殊机制。通过反射,程序可以在不知道对象具体类型的情况下,对对象进行操作。原创 2025-08-01 16:47:41 · 343 阅读 · 0 评论 -
谈谈你对Java序列化的理解
Java序列化(Serialization)是指把Java对象转化为字节序列,以便用于网络传输、文件保存或其他方式的持久化存储。反序列化则是将字节序列恢复成原有的Java对象的过程。简单来说,序列化是“把对象拍成一张快照存下来”,以后需要的时候“把快照恢复成对象”。Java序列化是Java对象持久化和分布式应用通信的基础能力,虽然操作简单,但处理大数据量、复杂对象、长生命周期或跨版本时,需要关注性能、兼容性及安全性。推荐日常开发选择更现代的序列化框架如Kryo、Protobuf等,并加强反序列化安全校验。原创 2025-08-01 11:15:53 · 561 阅读 · 0 评论 -
线程池任务的处理流程是什么?(Java线程池原理全解析+实战细节)
在高并发Java开发和微服务应用中,线程池(Thread Pool)已成为提升性能、资源复用、控制并发的重要基石。线程池可以避免频繁创建/销毁线程的高昂开销,让任务调度、线程生命周期、拒绝策略都能有序可控。理解线程池中的,是搞懂Java并发和调优实战的前提。本文将详细梳理线程池从任务提交到最终执行/拒绝的每一环,结合源码和运维建议,带你彻底掌握线程池的核心机制。原创 2025-07-31 14:29:57 · 1310 阅读 · 0 评论 -
Java分批处理数据,如何保证数据的顺序?
在实际开发中,面对大数据量的处理场景时,我们常常会采用“分批处理(Batch Processing)”的方式,避免一次性加载全部数据造成OOM(内存溢出)等问题。然而,,却是一个非常实用且有挑战性的问题。原创 2025-07-30 10:34:57 · 1138 阅读 · 0 评论 -
FlinkCDC实现多数据源数据集的增量更新实战
DataX完成首次全量同步,确保基线一致。增量以Flink CDC为主:MySQL、PG源通过binlog/WAL不间断监听与捕获。异构&弱结构源(如API、Excel)通过业务逻辑“增量补料”。Doris侧表模型建议选用唯一键或批量Upsert语义,防止脏数据和数据丢失。连续两次同步之间发生的数据变更,由FlinkCDC自动补充。原创 2025-07-29 11:05:36 · 1168 阅读 · 0 评论 -
一文解析公平锁、非公平锁、悲观锁、乐观锁、可重入锁和锁的升级(含详细代码实例)
类型定义场景代码说明优缺点公平锁先到先得,排队获取锁银行排队避免饿死但慢非公平锁不按顺序,允许插队绝大多数并发场景或性能高风险饿死悲观锁先锁后用,强制同步核心交易、资金/数据库for update安全性能一般乐观锁无锁冲突检测后重试高频读、低冲突Java原子类、版本号字段快,不适用多冲突可重入锁自身可多次获得同一锁递归与多调用场景灵活无死锁锁的升级JVM智能优化锁粒度JVM自动控制(自动实现)性能最优动态选择。原创 2025-07-25 11:29:52 · 748 阅读 · 0 评论 -
Synchronized 和 ReentrantLock 有什么区别?核心区别是什么?
是 Java 的内置同步机制,占用 JVM 原语级别的支持。可以作用于方法或代码块,实现对对象/类的加锁,保证同一时间只有一个线程能访问被锁定的代码区域。// 临界区// 同步方法是 JDK 1.5 提供的 Lock 接口实现,可重入互斥锁。其设计思想上与 synchronized 类似,但功能更灵活,扩展性更强,由 Java 代码实现(位于包中)。try {// 临界区核心区别一句话总结是JVM层的“内置”锁,简单易用,不能灵活控制锁的高级特性;而。原创 2025-07-25 11:27:07 · 580 阅读 · 0 评论 -
mysql 的主从机制是怎么实现的?
MySQL 作为当前最流行的开源关系型数据库之一,为了满足数据的高可用、负载均衡和容灾备份等需求,广泛应用主从复制(Replication)机制。其核心思想是:在一台主库(Master)上发生的所有数据变更都会同步到一台或多台从库(Slave),从而实现多节点间的数据一致性和系统的读写分离。很多初学者疑惑,MySQL 的主从机制究竟是怎样实现的?有哪些关键组件与执行流程?本文将为你系统梳理 MySQL 主从复制的原理、步骤和注意事项,帮助你彻底搞懂这一关键技术点。原创 2025-07-25 11:14:19 · 550 阅读 · 0 评论 -
平时开发中使用 Redis 分布式锁,有哪些需要注意的问题?
本文总结了Redis分布式锁的6个关键注意事项:1)使用原子命令SET NX EX/PX确保加锁与过期设置同步;2)必须设置过期时间防止死锁;3)通过唯一value和Lua脚本实现安全解锁;4)采用watch dog机制处理业务超时和锁续期;5)注意主从异步复制可能导致锁失效,建议RedLock算法;6)合理设计锁key的粒度与唯一性。遵循这些原则可有效避免Redis分布式锁的常见问题,确保系统安全性和健壮性。原创 2025-07-25 10:52:41 · 529 阅读 · 0 评论 -
面试——MySql索引什么场景下会失效
描述:在联合索引中,如果某列的范围查询中断了索引的有序性,后续列的索引无法生效。描述:当查询条件值的类型与索引列类型不一致时,MySQL 会进行隐式类型转换。描述:MySQL 优化器动态调整索引,可能选择非最佳索引或直接全表扫描。描述:如果 OR 条件中有字段未使用索引,会导致整体索引失效。描述:分区表的查询条件未覆盖分区键时,全局索引可能无法生效。描述:排序或分组字段与索引顺序不匹配时,索引无法生效。描述:查询中包含未索引的字段,可能导致回表或索引失效。=、<>)通常会导致索引失效。原创 2024-12-04 10:26:12 · 828 阅读 · 0 评论 -
面试——HashMap的并发问题
【代码】面试——HashMap的并发问题。原创 2024-11-28 18:56:03 · 674 阅读 · 0 评论 -
面试——数据库中小表驱动大表?为何能提高性能?
student表和school表,执行下面的sql。算法,那么选择哪个表作为外驱表和内驱表至关重要。作为外驱表的话,就是大表驱动小表,时间复杂度将是。作为外驱表的话,就是小表驱动大表,时间复杂度将是。都存在索引的情况下,并且数据库采用的是。**,可见根本不是一个数量级的。有一百条数据,如果选择。原创 2024-04-25 16:18:58 · 508 阅读 · 2 评论 -
面试——数据库中的锁升级(Lock Escalation)机制
以MySQL为例,按照两阶段锁协议,会先给tb_user加上表意向锁,然后对tb_user的所有行加上行锁,但是当tb_user数据量非常多的时候,频繁的获取行锁会影响性能,所以会将表意向锁升级为表锁,后续访问的时候不需要再加锁,这样导致的结果是并发性能降低,因为其他线程访问该表会被阻塞。条件,分批去操作数据,尽量防止全表扫描。因此得出建议:操作表的时候尽量带仨很。假设执行下面的sql语句。原创 2024-04-24 18:20:40 · 811 阅读 · 0 评论 -
面试——深度分页问题的优化
在开发中为了防止一次加载太多数据到内存,对内存占用和IO读取开销太大,一般使用limit关键字进行分页加载数据,在数据量比较大的时候,如果进行limit分页查询,越往后,分页查询的效率越低。当在进行分页查询时,如果执行limit 9000000, 10,此时需要排序前9000010条记录,仅仅返回9000000-9000010的记录,其他的记录丢弃,查询排序的代价非常大。丢掉前m条,保留第[m, m+n],n条结果,并返回给客户端返回,从磁盘中读取m+n条数据就是整个查询过程中耗时的操作。原创 2024-03-26 14:58:34 · 348 阅读 · 0 评论 -
面试——线上Java服务器CPU不断飙升,怎么排查
Linux:Java:实际步骤:原创 2024-03-04 10:12:12 · 634 阅读 · 0 评论 -
面试——Java垃圾回收算法和垃圾回收器
他不但只会用一个线程去收集垃圾,在收集垃圾的时候其他的所有工作线程必须停止,即会发生Stop the World现象,对于Stop the world(在垃圾回收开始时停掉其他所有的线程,只供垃圾回收器回收使用,对于系统尤其是高并发系统来说就是一个噩梦),直到垃圾回收结束。复制算法将堆内存分为两个区域,通常是”From“区和”To“区,当”From“区的对象被标记为存活时,它们将被复制到”To“区,而未被标记的对象将被丢弃,完成复制后,”From“区和”To“区的角色交换。标记-清除算法分为两个主要阶段。原创 2024-02-28 18:46:02 · 1067 阅读 · 0 评论 -
面试——双亲委派机制
我们再看第四个问题,我们想我们要怎么实现jsp文件的热加载,jsp 文件其实也就是class文件,那么如果修改了,但类名还是一样,类加载器会直接取方法区中已经存在的,修改后的jsp是不会重新加载的。这样保证了Class执行安全。在加载某个类时会先委托父加载器寻找目标类,找不到再委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的类加载路径中查找并载入目标类。如果父加载器及bootstrap类加载器都没有找到指定的类,那么调用当前类加载器的findClass方法来完成类加载。原创 2024-02-27 18:22:26 · 1049 阅读 · 0 评论 -
面试——类加载机制
4、解析:将符号引用替换为直接引用,该阶段会把一些静态方法(符号引用,比如main()方法)替换为指向数据所存内存的指针或句柄等(直接引用),这是所谓的静态链接过程(类加载期间完成),动态链接是在程序运行期间完成的将符号引用替换为直接引用。1、加载:在硬盘上查找并通过IO读入字节码文件,使用到类时才会加载,例如调用类的main()方法,new对象等等,在加载阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。3、父类的变量和代码块(先声明的先执行)原创 2024-02-27 17:36:11 · 452 阅读 · 0 评论 -
面试——redis的缓存击穿、雪崩和穿透及处理办法
redis击穿:请求数据顺序,首先会从redis缓存中拿数据,若未拿到则查数据库,再写到redis。如果是请求一条根本不存在的数据时,则会去直接访问数据库,但是数据库也没有,所以它也没把数据写入redis缓存。所以每次这种请求都会直接访问数据库。如果请求的数量太大的话,这种绕过redis直接访问数据库情况则成为击穿。解决办法:1、在查询数据库的时候若未查询到数据,依然在redis中保存一条记录,并把value设置为null或者其他便于区别的值,可以再给该条数据设置一个过期时间,那么以后再有请求过来访问原创 2022-05-04 11:02:02 · 363 阅读 · 0 评论
分享