Java十道高频面试题(一)
Java基础与集合1. HashMap的底层数据结构是什么JDK 1.7 vs 1.8考察点数据结构演进、哈希冲突解决、扩容死循环问题。参考答案HashMap在JDK 1.7和1.8中有着本质的区别主要体现在底层结构和扩容机制上底层数据结构JDK 1.7采用数组 链表。当发生哈希冲突时使用链表存储且采用头插法插入新节点。JDK 1.8采用数组 链表 红黑树。优化当链表长度大于8且数组长度大于64时链表会转换为红黑树。目的将查询时间复杂度从 O(n)O(n) 降低到 O(logn)O(logn) 解决了哈希冲突严重时查询效率低的问题。插入方式改为尾插法保持了元素的顺序。扩容机制核心区别JDK 1.7头插法导致的死循环在多线程环境下扩容时由于头插法会反转链表顺序可能导致链表形成环形结构死循环导致CPU占用率100%。JDK 1.8尾插法解决死循环扩容时保持链表顺序虽然HashMap在1.8中依然是线程不安全的存在数据覆盖问题但彻底解决了死循环的问题。扩容机制默认初始容量为16负载因子为0.75。当元素个数超过容量 * 负载因子时触发扩容容量变为原来的2倍并进行重新哈希Rehash。哈希计算JDK 1.8优化了哈希值的计算方式减少了哈希碰撞的概率且在扩容时不需要重新计算hash值而是通过高位运算判断元素位置效率更高。2. ConcurrentHashMap如何保证线程安全JDK 1.7 vs 1.8考察点锁粒度进化、分段锁 vs CASSynchronized。参考答案ConcurrentHashMapCHM在JDK 1.7和1.8中采用了完全不同的并发控制策略核心在于锁粒度的不断细化JDK 1.7分段锁Segment Lock结构采用Segment数组 HashEntry数组。Segment继承自ReentrantLock相当于一个小的HashMap。原理将数据分成一段一段存储给每一段数据配一把锁默认16个Segment。并发度默认支持16个线程同时并发写取决于Segment数量。缺点锁粒度较粗锁住整个Segment且Segment数量初始化后不可变内存开销较大。JDK 1.8CAS synchronized细粒度锁结构抛弃了Segment结构与HashMap 1.8一致即Node数组 链表 红黑树。原理空桶插入使用CASCompare-And-Swap操作尝试无锁插入性能极高。冲突插入当发生哈希冲突时使用synchronized锁住当前桶Bucket的头节点。并发度理论上取决于数组长度默认16动态扩容只要哈希不冲突不同线程可以操作不同的桶互不干扰。优势锁粒度从“段”细化到了“节点/桶”并发性能大幅提升。同时读操作get完全无锁依靠volatile保证可见性。3. 为什么重写equals()必须重写hashCode()考察点Object类规范、哈希集合原理。参考答案这是为了保证对象在哈希集合如HashMap、HashSet中的正确性。规范Java规定如果两个对象通过equals()比较返回true那么它们的hashCode()必须相同。后果如果只重写equals而不重写hashCode两个逻辑上相等的对象可能会计算出不同的哈希值。在存入HashMap时它们会被放入不同的桶中导致无法正确获取或去重违背了集合的设计原则。并发编程4. 线程池的核心参数有哪些工作流程是怎样的考察点ThreadPoolExecutor、生产环境配置。参考答案核心参数有7个最关键的5个是corePoolSize核心线程数常驻线程。maximumPoolSize最大线程数。workQueue任务阻塞队列。keepAliveTime非核心线程的空闲存活时间。RejectedExecutionHandler拒绝策略。工作流程当提交一个新任务时如果当前线程数 corePoolSize创建新核心线程执行。如果核心线程已满任务加入workQueue。如果队列也满了且线程数 maximumPoolSize创建非核心线程执行。如果队列满了且线程数已达最大值执行RejectedExecutionHandler默认AbortPolicy抛异常。5. synchronized和ReentrantLock的区别考察点锁的实现、功能特性。参考答案实现层面synchronized是JVM层面的关键字内置锁自动加锁释放ReentrantLock是JDK API层面的类java.util.concurrent.locks需要手动lock()和unlock()。功能特性synchronized操作简单JDK 1.6后进行了大量优化偏向锁、轻量级锁不可中断非公平锁。ReentrantLock功能更强大支持可中断、尝试获取锁tryLock、公平锁以及多条件变量Condition。选择代码简洁性优先选synchronized需要高级功能如公平锁、中断选ReentrantLock。6. ThreadLocal的底层原理及内存泄漏问题考察点线程隔离、弱引用。参考答案原理每个Thread内部维护了一个ThreadLocalMap。ThreadLocal作为Key弱引用存储的数据作为Value强引用。获取数据时从当前线程的Map中通过ThreadLocal实例取出Value。内存泄漏原因ThreadLocalMap中的Key是弱引用容易被GC回收但Value是强引用。如果线程复用如在线程池中且没有手动移除数据Key被回收后Value将无法访问也无法回收导致内存泄漏。解决使用完ThreadLocal后务必调用remove()方法清理数据。JVM与Java新特性7. JDK 21的虚拟线程Virtual Threads是什么考察点2026年面试热点、高并发新方案。参考答案虚拟线程是JDK 21引入的重磅特性Project Loom是一种轻量级线程。核心它是用户态线程由JVM调度而不是直接映射到操作系统内核线程OS Thread。优势创建成本极低内存占用极小可以轻松创建百万级并发线程。它解决了传统线程“一请求一线程”模型在高并发IO场景下的资源瓶颈。应用彻底取代了WebFlux等响应式编程的复杂写法可以用同步代码写出异步的高性能服务。8. JVM的垃圾回收算法有哪些G1收集器的特点考察点内存管理、调优基础。参考答案常见算法标记-清除碎片化、复制算法新生代常用、标记-整理老年代常用。G1收集器特点面向服务端将堆内存划分为多个独立的Region。优势可预测的停顿时间模型。它能根据用户设定的停顿时间目标动态调整回收的Region数量。适用适合大内存6GB、多核CPU且对停顿时间有要求的场景。Spring框架9. Spring Boot的自动配置原理是什么考察点框架源码、约定优于配置。参考答案核心在于EnableAutoConfiguration注解。加载通过Import导入AutoConfigurationImportSelector。读取扫描classpath下的META-INF/spring.factories文件或新版META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports。筛选读取所有候选配置类并利用Conditional系列注解如ConditionalOnClass、ConditionalOnMissingBean进行按需加载。生效只有当类路径下存在特定类如RedisTemplate且容器中不存在相关Bean时自动配置才会生效。10. Spring事务失效的常见场景有哪些考察点AOP代理机制、实战避坑。参考答案方法非publicSpring事务只支持public方法。自调用同一个类中非事务方法调用事务方法this.method()绕过了代理对象导致事务失效。异常被捕获在方法内部try-catch了异常没有抛出事务管理器无法感知异常从而无法回滚。数据库引擎数据库表引擎不支持事务如MySQL的MyISAM。异常类型不匹配默认只回滚RuntimeException和Error如果抛出Checked Exception如IOException且未配置rollbackFor事务不会回滚。这10道题覆盖了Java后端开发最核心的知识体系建议你结合自己的项目经验进行记忆。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2606745.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!