后端开发面试题及参考答案(无AI味·侧重实战).docxVIP

后端开发面试题及参考答案(无AI味·侧重实战).docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

后端开发面试题及参考答案(无AI味·侧重实战)

一、Java基础(10题)

问:HashMap和ConcurrentHashMap的核心区别?实际开发中什么时候用后者?

答:HashMap线程不安全,扩容时会出现死循环(JDK1.7)或数据覆盖(JDK1.8);ConcurrentHashMap在JDK1.7用分段锁,1.8改用CAS+synchronized,支持高并发。实际开发中,只要有多个线程操作集合(比如接口并发查询缓存、多线程写入统计数据),就必须用ConcurrentHashMap,避免ConcurrentModificationException或数据错乱。

问:ArrayList和LinkedList的查询、插入删除效率对比?举个实际业务场景选择例子。

答:ArrayList基于数组,查询(get(index))O(1),插入删除(中间位置)O(n)(需复制数组);LinkedList基于双向链表,查询O(n),插入删除O(1)(只需改指针)。场景:做商品列表分页查询(频繁get)用ArrayList;做消息队列(频繁添加/删除头部元素)用LinkedList。

问:Java的线程池参数有哪些?核心线程数和最大线程数怎么设置?

答:核心参数:核心线程数、最大线程数、队列容量、空闲线程存活时间、拒绝策略。设置原则:CPU密集型任务(比如计算)核心线程数=CPU核心数+1;IO密集型任务(比如数据库查询、接口调用)核心线程数=CPU核心数*2,最大线程数根据并发峰值调整,队列容量避免过大导致内存溢出。

问:synchronized和Lock的区别?项目中怎么选?

答:synchronized是JVM层面锁,自动释放,不可中断,非公平锁;Lock是API层面,需手动lock/unlock,可中断,支持公平锁/非公平锁。项目中:简单场景(比如单例模式)用synchronized,代码简洁;复杂场景(比如需要超时获取锁、条件等待)用Lock(ReentrantLock),比如秒杀场景中控制并发抢单。

问:什么是Java内存模型(JMM)?volatile关键字有什么用?

答:JMM定义了线程和主内存之间的抽象关系,解决多线程可见性、原子性、有序性问题。volatile保证可见性(线程修改后立即刷回主内存,其他线程可见)和有序性(禁止指令重排),但不保证原子性(比如i++)。实际用例:单例模式的双重检查锁(防止指令重排导致的空指针)、状态标记位(比如线程停止标记)。

问:HashMap的扩容机制?JDK1.7和1.8有什么不同?

答:JDK1.7:数组容量达到阈值(负载因子0.75)时扩容为2倍,采用头插法,多线程下会形成循环链表;JDK1.8:扩容时用尾插法避免循环,且扩容时元素迁移更高效(通过位运算判断元素位置),同时当链表长度超过8会转为红黑树,提升查询效率。

问:Java的垃圾回收机制?常用的GC算法有哪些?

答:GC是回收堆中不再使用的对象,释放内存。常用算法:标记-清除(效率低,有碎片)、复制算法(无碎片,浪费空间,用于新生代)、标记-整理(无碎片,效率中等,用于老年代)、分代收集(新生代用复制,老年代用标记-整理)。实际项目中,通过JVM参数(-Xms/-Xmx)设置堆大小,避免频繁GC影响性能。

问:什么是线程死锁?怎么避免?

答:死锁是两个或多个线程互相持有对方需要的锁,导致无限等待。必要条件:资源互斥、持有并等待、不可剥夺、循环等待。避免方式:按固定顺序获取锁(比如先获取A锁再获取B锁)、设置锁超时(tryLock(time))、减少锁持有时间(锁内不做耗时操作)。

问:接口和抽象类的区别?Java8中接口有什么新特性?

答:接口是抽象方法的集合,只能有publicstaticfinal变量,类可实现多个接口;抽象类可有抽象方法和普通方法,变量可非静态,类只能继承一个抽象类。Java8接口新增默认方法(default关键字)和静态方法,允许接口有具体实现,比如Collection接口的stream()方法。

问:String、StringBuffer、StringBuilder的区别?

答:String不可变(每次修改创建新对象),效率低;StringBuffer线程安全(方法加synchronized),效率中等;StringBuilder线程不安全,效率最高。场景:字符串拼接少用String;多线程环境(比如日志拼接)用StringBuffer;单线程环境(比如业务逻辑字符串处理

文档评论(0)

151****9429 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档