后端工程师面试题及参考答案.docxVIP

  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文档。上传文档
查看更多

后端工程师面试题及参考答案

一、Java基础(初级/中级)

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

答案:

线程安全:HashMap完全非线程安全,多线程put可能导致链表环、数据丢失;ConcurrentHashMap(JDK1.8后)用数组+链表/红黑树+CAS+synchronized实现分段锁优化,支持并发读写。

性能:单线程场景HashMap更快(无锁overhead);多线程下ConcurrentHashMap无需额外加锁,性能优于HashTable(全表锁)。

功能:HashMap允许key/value为null;ConcurrentHashMap不允许(避免并发场景下null判断歧义)。

适用场景:多线程并发修改(如缓存更新、共享数据存储)用ConcurrentHashMap;单线程或线程隔离场景(如局部变量、单例内数据)用HashMap。

问题:Java的线程池参数有哪些?核心参数如何设置?(结合实际业务说)

答案:

核心参数:核心线程数(corePoolSize)、最大线程数(maximumPoolSize)、空闲线程存活时间(keepAliveTime)、任务队列(workQueue)、拒绝策略(handler)。

设置逻辑(以电商订单处理为例):

核心线程数:CPU密集型任务(如计算)设为CPU核心数+1;IO密集型任务(如数据库查询、HTTP调用)设为2*CPU核心数+1(因线程多阻塞在IO上)。比如8核CPU,订单处理是IO密集型(查库+调用支付接口),核心线程数设为17。

最大线程数:核心线程数的1.5~2倍(避免线程过多上下文切换),即25~34,取28。

队列:IO密集型用有界队列(如ArrayBlockingQueue,容量设为500),防止任务堆积导致OOM;CPU密集型用无界队列(LinkedBlockingQueue)。

拒绝策略:核心业务用CallerRunsPolicy(让调用线程执行,避免丢任务);非核心用AbortPolicy(直接抛异常,快速失败)。

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

答案:

JMM是Java虚拟机规范定义的内存模型,解决多线程下共享变量可见性、原子性、有序性问题——规定所有变量存储在主内存,线程操作变量时需先加载到工作内存,修改后写回主内存,JMM定义了工作内存与主内存的交互协议。

volatile的作用:

可见性:一个线程修改volatile变量后,其他线程能立即看到最新值(禁止工作内存缓存,直接读写主内存)。

有序性:禁止指令重排序(通过内存屏障实现),比如双重检查锁单例中,instance必须加volatile,否则可能出现“半初始化对象”。

注意:volatile不保证原子性(如i++仍需synchronized或AtomicInteger)。

二、Spring/SpringBoot(中级)

问题:SpringBean的生命周期?Bean的作用域有哪些?

答案:

生命周期核心流程(以单例Bean为例):

实例化:通过构造器创建Bean对象(无参构造器优先)。

属性注入:依赖注入(@Autowired、setter方法等)。

初始化:

执行BeanNameAware、ApplicationContextAware等Aware接口方法(注入容器相关信息)。

执行@PostConstruct注解方法(初始化逻辑)。

执行InitializingBean接口的afterPropertiesSet()方法。

执行自定义init-method。

就绪:Bean放入容器,供应用使用。

销毁:

执行@PreDestroy注解方法。

执行DisposableBean接口的destroy()方法。

执行自定义destroy-method。

容器关闭时释放资源。

作用域(常用):

singleton:单例(默认),容器中仅一个实例,全局共享。

prototype:多例,每次getBean()创建新实例,容器不管理销毁。

request:web场景,每个HTTP请求创建一个实例。

session:web场景,每个会话创建一个实例。

问题:@Autowired和@Resource的区别?循环依赖怎么解决的?

答案:

@Autowiredvs@Resource:

来源:@Autowired是Spring注解;@Reso

文档评论(0)

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

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

1亿VIP精品文档

相关文档