
每日面试题
文章平均质量分 87
整理面试中常见的问题。
℡余晖^
不知名程序员
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
面试题24:Spring循环依赖
在设计Bean之间的依赖关系时,尽量避免循环依赖的出现。如果无法避免,优先考虑使用setter注入或者字段注入(通过@Autowired)的方式。如果必须使用构造器注入且出现了循环依赖问题,可以考虑使用@Lazy注解来解决。在使用注解时,要确保其标注的方法中的操作不会引入新的循环依赖或者影响Bean的正常初始化顺序。原创 2025-08-21 15:13:52 · 636 阅读 · 0 评论 -
面试题23:单例Bean和原型Bean
使用@Scope注解: 在类定义上添加或更简洁的。XML 配置: 在<bean>元素中设置属性。@Component@Scope("prototype") // 或 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)// ... Bean 的具体实现 ...原创 2025-08-21 15:10:02 · 821 阅读 · 0 评论 -
每日面试题22:静态代理和动态代理的区别
System.out.println("创建订单:用户" + userId + "购买" + product);维度静态代理动态代理代理类生成时机编译期(手动/工具生成)运行期(动态生成字节码)代码侵入性需为每个被代理类编写代理类无需手动编写代理类,通用性强维护成本高(接口变更需同步修改代理类)低(仅需调整InvocationHandler)扩展性差(无法动态代理新类)强(一个代理可代理多个类/接口)适用场景。原创 2025-08-16 14:50:51 · 508 阅读 · 0 评论 -
每日面试题21:AOP的底层原理
Spring AOP的核心价值在于通过动态代理实现横切关注点的模块化,其底层依托JDK动态代理(接口场景)和CGLIB动态代理(非接口场景)完成方法增强。理解这两种代理的实现原理、选择策略及注意事项,有助于我们在实际开发中更合理地使用AOP,避免常见的坑(如内部调用失效、final方法增强失败),并充分发挥AOP在解耦、复用、扩展方面的优势。无论是日志记录、事务管理,还是权限校验、性能监控,动态代理技术都让这些横切逻辑的处理变得优雅而高效——这正是Spring AOP的魅力所在。原创 2025-08-07 13:29:44 · 855 阅读 · 0 评论 -
每日面试题20:spring和spring boot的区别
Spring 定义了企业级 Java 开发的“游戏规则”(IoC/AOP),而 Spring Boot 则是将这套规则“产品化”的工具——它不是替代,而是进化。正如 Spring Boot 官方文档所说:“Spring Boot 让 Spring 应用的创建、配置和部署变得前所未有的简单”。对于开发者而言,掌握 Spring 核心原理(IoC/AOP)是基础,而熟练使用 Spring Boot 提升开发效率则是现代 Java 工程师的必备技能。原创 2025-08-03 14:25:00 · 1256 阅读 · 0 评论 -
每日面试题19:深拷贝和浅拷贝的区别
浅拷贝(Shallow Copy)是一种“表面复制”:对于基本数据类型,直接复制值;对于引用数据类型,仅复制对象的地址指针(即新对象与原对象指向同一块堆内存)。深拷贝(Deep Copy)是“彻底复制”:不仅复制对象本身,还会递归复制其所有嵌套的引用类型对象,最终生成一个与原对象完全独立的新对象(新旧对象不共享任何堆内存)。深拷贝与浅拷贝的本质区别在于是否复制引用类型的内存地址。浅拷贝是“快捷但共享”的复制,适合简单场景;深拷贝是“彻底但耗时”的复制,适合需要状态隔离的场景。原创 2025-08-03 14:11:11 · 562 阅读 · 0 评论 -
每日面试题18:基本数据类型和引用数据类型的区别
优先基本类型:追求性能时(如循环计算),基本类型内存占用小、操作更快。使用引用类型:需要对象特性时(如集合存储、继承多态),或需要表示"无值"状态(null包装类的合理使用:集合、反射等场景必须用包装类;注意缓存范围和空指针问题。原创 2025-08-01 22:56:59 · 1207 阅读 · 0 评论 -
每日面试题17:面向对象OOP的三大特性
封装(Encapsulation)是OOP的基础特性,其核心是将对象的属性(数据)和操作属性的方法(行为)绑定在一个类中,并通过访问控制机制隐藏内部实现细节。简单来说,就是“把该藏的藏起来,该露的露出来”。继承(Inheritance)是OOP实现代码复用的核心机制,允许一个类(子类/派生类)继承另一个类(父类/基类)的属性和方法,并可以在此基础上扩展新功能或重写原有方法。通过继承,类之间形成“父子”关系,形成层次化的类结构。多态(Polymorphism)是OOP最强大的特性之一,指。原创 2025-07-29 14:52:06 · 740 阅读 · 0 评论 -
每日面试题16:什么是双亲委派模型
定位:开发者通过继承抽象类实现的扩展加载器;场景:用于加载非标准路径的类(如网络、数据库、加密文件中的字节码)、实现热部署/热替换等;关键方法:需重写(推荐)或方法(谨慎修改父类委托逻辑)。在Web容器(如Tomcat)或调试场景中,开发者希望修改代码后无需重启应用即可生效。此时需要隔离不同版本的类Tomcat的会为每个Web应用创建独立的类加载器,优先加载各自和中的类;原创 2025-07-28 15:59:21 · 724 阅读 · 0 评论 -
每日面试题15:如何解决堆溢出?
堆溢出并非"无解之症",关键在于快速定位+精准分析+系统预防。通过本文的应急流程和长效策略,可有效降低堆溢出对业务的影响。当发生堆溢出使,先通过报错信息确认错误位置,然后使用jmap命令生成堆转储文件,然后使用Eclipse MAT等工具分析堆内存,之后根据问题适当调整JVM参数,选择适当的JVM垃圾回收机制,并通过一些缉拿空工具实时关注内存的使用情况,可以有效防止堆溢出。原创 2025-07-26 16:47:28 · 879 阅读 · 0 评论 -
每日面试题14:CMS与G1垃圾回收器的区别
CMS与G1的差异,本质上是JVM对“延迟”与“吞吐量”、“固定分代”与“动态分区”、“并发效率”与“内存整理”的平衡选择。随着ZGC(Z Garbage Collector)等更先进的回收器出现(目标停顿<10ms),GC的设计仍在向“更智能、更可控”的方向演进。但对于大多数企业级应用而言,理解CMS与G1的核心差异,仍能为我们的技术决策提供坚实的基础。下次遇到GC性能问题时,不妨先看看堆内存的大小、应用的延迟要求,再想想:是该让CMS的并发回收“轻踩油门”,还是让G1的分区策略“精准控速”?原创 2025-07-25 10:44:42 · 787 阅读 · 0 评论 -
每日面试题13:垃圾回收器什么时候STW?
CMS通过并发标记和清除大幅减少了STW时间,但初始标记和重新标记仍需短暂停顿。其STW总耗时通常在10ms~100ms级别(取决于堆大小和对象复杂度)。G1的STW主要集中在初始标记、最终标记和筛选回收阶段,但通过并发标记和SATB算法大幅缩短了单次STW的时间。由于G1支持"增量回收"(每次只回收部分Region),其平均STW时间可控制在用户设定的阈值内(如不超过200ms)。原创 2025-07-23 10:48:48 · 1183 阅读 · 0 评论 -
每日面试题12:JVM垃圾回收机制
JVM会从一组称为GC Roots的根对象出发,通过引用链(Reference Chain)遍历所有能被访问到的对象。这些被遍历到的对象被标记为“存活对象”,反之则被视为“垃圾对象”,等待回收。JVM垃圾回收机制是Java高效运行的基石,理解不同回收器的原理与适用场景,能帮助开发者根据业务需求选择最优配置,平衡性能与资源消耗。随着JVM技术的演进(如ZGC的普及),未来的GC将更智能、更高效,持续赋能高并发、低延迟的现代应用。原创 2025-07-22 11:19:11 · 938 阅读 · 0 评论 -
每日面试题11:JVM
JVM不仅是Java跨平台的“桥梁”,更是程序运行的“资源管家”。它的核心架构(运行时数据区、类加载器、执行引擎、GC)协同工作,确保了Java程序的高效、安全与稳定。下次遇到或OOM时,不妨回忆一下JVM的内存结构——问题可能就出在某个区域的“超载”;而理解类加载器和GC机制,则能帮你写出更健壮、更高效的Java代码。原创 2025-07-21 15:50:13 · 1166 阅读 · 0 评论 -
每日面试题09:进程、线程、协程的区别
进程、线程、协程的本质是操作系统对资源分配与任务执行的抽象分层进程通过内核级隔离保障系统稳定性,是「安全屋」;线程通过共享资源提升执行效率,是「协作伙伴」;协程通过用户态调度优化并发性能,是「效率引擎」。在实际开发中,选择何种模型需结合具体场景:需要安全选进程,需要效率选线程,需要并发选协程——或者,三者结合(如「多进程+多线程+协程」的混合架构),以发挥各自的优势。原创 2025-07-19 11:07:51 · 1095 阅读 · 0 评论 -
每日面试题10:令牌桶
令牌桶算法以其优雅的设计,在"严格限制"与"灵活应对"之间找到了完美平衡。它既像一位严谨的交通警察,确保请求有序通过;又像一位贴心的服务生,在高峰期能灵活调配资源。理解并合理应用令牌桶算法,将为你的系统构筑起一道可靠的流量防线。实践建议在API网关层实施全局限流关键业务接口设置独立令牌桶结合熔断降级机制形成完整防护链。原创 2025-07-20 17:13:09 · 969 阅读 · 0 评论 -
每日面试题08:wait()和sleep()的区别
wait()是Object类的实例方法(所有Java对象都拥有此方法),其核心作用是让当前线程进入等待状态。但必须在持有对象监视器锁的前提下调用(即必须在同步块或方法中),否则会抛出异常。// 正确调用:在synchronized块中持有锁// 合法调用// 错误调用:未持有锁时调用// 抛出IllegalMonitorStateExceptionsleep()是Thread类的静态方法(),直接通过调用。它不依赖任何锁,即使线程未持有对象监视器锁也可以调用。// 直接调用,无需同步块。原创 2025-07-18 10:47:49 · 910 阅读 · 0 评论 -
每日面试题07:线程池的工作流程
线程池的工作流程可以概括为:任务提交 → 检查核心线程(是否空闲) → 核心线程忙则入队 → 队列满了创建非核心线程 → 线程数满了触发拒绝策略。核心参数(workQueuehandler)的组合决定了线程池的行为,而阻塞队列的选择是其中的关键——它直接影响了任务是“排队等线程”还是“挤不下了直接拒绝”。理解线程池的底层逻辑,能帮助我们在实际开发中更合理地配置线程池参数,避免资源浪费或系统崩溃,让并发程序更高效、稳定地运行。原创 2025-07-17 10:38:47 · 1211 阅读 · 0 评论 -
每日面试题06:自定义线程池与线程池工厂
通过构造函数自定义线程池时,需要显式指定以下核心参数。这些参数共同决定了线程池的行为模式和资源分配策略。自定义线程池:优先使用构造函数,根据业务场景调整参数(如根据常驻任务量设置,workQueue根据任务特性选择有界/无界队列)。避免OOM:尽量使用有界队列(如),并合理设置;拒绝策略推荐(减缓任务提交)或(丢弃旧任务)。官方建议:《Java并发编程实战》明确指出,直接使用Executors工厂方法可能隐藏线程池的实际配置,推荐显式通过构造函数创建,以提高透明度和可控性。原创 2025-07-15 10:47:10 · 688 阅读 · 0 评论 -
每日面试题01 HashMap的底层原理
即使未触发数组扩容,若某个桶的链表长度超过 8(且数组长度 ≥ 64),会转换为红黑树,占用更多内存。)时,为了优化查询效率(链表的查询时间复杂度为 O(n),红黑树为 O(logn)),会将链表转换为红黑树(需同时满足数组长度 ≥ 64,避免数组过小时频繁转换)。红黑树与链表的转换需要额外的计算和内存操作(如红黑树的旋转、颜色调整,或链表节点的指针修改),频繁切换会显著影响性能。当数组长度 ≥64 时,若红黑树节点数降至 6 以下,说明冲突已缓解(可能因扩容或数据分布变化),此时退化为链表可节省内存。原创 2025-07-09 23:12:44 · 1189 阅读 · 0 评论 -
每日面试题02:ConcurrentHashMap的底层原理
是 Java 并发包()中提供的线程安全哈希表实现,专为高并发场景下的键值对存储设计。它在保证线程安全的同时,通过优化锁机制和数据结构,显著提升了多线程环境下的性能。底层结构:与HashMap同源,均基于哈希表(数组+链表/红黑树)实现,核心逻辑(如哈希冲突解决、扩容机制)高度一致。HashMap是非线程安全的哈希表,适合单线程或低并发场景;是线程安全的哈希表,通过 CAS、和细粒度锁机制,在多线程高并发场景下保证数据一致性,同时保持高性能。原创 2025-07-10 22:27:59 · 932 阅读 · 0 评论 -
每日面试题03:CAS的底层原理及其ABA问题
CAS的核心:通过CPU原子指令实现无锁的“比较+交换”操作,是高效并发的基础。ABA问题的本质:CAS仅比较值是否相等,无法感知中间修改,可能导致逻辑错误。解决方案:引入版本号(如)跟踪修改历史,或根据业务场景忽略ABA问题,或改用锁机制。关键结论:CAS是无锁并发的利器,但需警惕ABA问题的潜在风险。通过版本号或锁机制可有效规避,确保程序逻辑正确性。原创 2025-07-12 09:43:55 · 983 阅读 · 0 评论 -
每日面试题04:volatile字段的原理
volatile是 Java 的关键字,用于修饰共享变量。可见性:确保线程对变量的修改立即同步到主内存,其他线程能立即看到最新值;有序性:禁止编译器和 CPU 对变量的读写指令进行重排序,保证代码执行顺序与编写顺序一致。简单来说,volatile是多线程环境下的“变量同步器”,让共享变量的修改在多线程间“可见”,且操作“有序”。volatile适用场景原因状态标志(如线程启停)仅需单次读写,无需复合操作,volatile轻量且高效。单例模式的DCL。原创 2025-07-12 21:31:00 · 698 阅读 · 0 评论 -
每日面试题05:ArrayList和LinkedList的底层原理
ArrayList和LinkedList的选择没有绝对答案,关键在于场景匹配若需高频随机访问(如遍历、按索引操作),选ArrayList;若需高频头尾插入/删除(且数据量不大),选LinkedList(或更优的ArrayDeque内存敏感场景,优先ArrayList(紧凑存储更省内存);多线程环境,根据需求选择线程安全的扩展实现(如或理解底层原理后,结合具体业务场景的性能瓶颈(如访问频率、插入位置、数据量),才能做出最优选择。原创 2025-07-13 22:23:48 · 833 阅读 · 0 评论