Java中级工程师面试题及答案.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中级工程师面试题及答案

一、Java基础与进阶

问:HashMap和ConcurrentHashMap的核心区别?实际项目中怎么选?

答:首先是线程安全,HashMap完全线程不安全,并发操作会有死循环(JDK1.7)或数据覆盖(JDK1.8)问题;ConcurrentHashMap是线程安全的,JDK1.7用分段锁(Segment),JDK1.8改成CAS+synchronized(锁链表/红黑树头节点),锁粒度更细,性能更好。

选的时候看场景:如果是单线程环境,或者线程安全由外层控制(比如用锁包裹HashMap),用HashMap更轻量;如果是多线程并发读写(比如缓存场景),直接用ConcurrentHashMap,比HashTable(全表锁)性能高很多,也不用自己写同步逻辑。

问:Override和Overload的区别?Override有哪些必须遵守的规则?

答:Override是“重写”,子类重写父类的方法,方法名、参数列表、返回值(协变返回,比如父类返回Object,子类返回String)必须完全一致,访问权限不能比父类更严格(比如父类public,子类不能private),抛出的异常不能比父类更宽泛。

Overload是“重载”,同一个类里方法名相同,参数列表(个数、类型、顺序)不同,返回值和访问权限不影响。比如ArrayList的add(Objecte)和add(intindex,Objecte)就是重载。

实际开发中,Override常见于子类实现父类抽象方法(比如ServiceImpl实现Service接口),Overload用于提供多参数版本的方法(比如工具类的StringUtils.isEmpty(String)和isEmpty(CharSequence))。

二、并发编程

问:线程池的核心参数有哪些?如果核心线程满了、队列也满了,会触发什么逻辑?

答:核心参数有5个:核心线程数(corePoolSize)、最大线程数(maximumPoolSize)、空闲线程存活时间(keepAliveTime)、时间单位(unit)、任务队列(workQueue),还有可选的拒绝策略(handler)。

执行逻辑是:提交任务时,先判断核心线程是否满,没满就创建核心线程;满了就往队列里放;队列满了再判断是否达到最大线程数,没到就创建非核心线程;如果最大线程也满了,就触发拒绝策略。

拒绝策略常用的有4种:AbortPolicy(抛异常,默认)、CallerRunsPolicy(让提交任务的线程自己执行,缓解压力)、DiscardPolicy(直接丢任务)、DiscardOldestPolicy(丢队列里最老的任务)。实际项目里,比如秒杀场景,一般会自定义拒绝策略(比如返回“系统繁忙,请重试”),不会用默认的抛异常。

问:ThreadLocal的原理是什么?为什么会有内存泄漏?怎么避免?

答:ThreadLocal是“线程本地变量”,每个线程有自己的ThreadLocalMap,key是ThreadLocal实例(弱引用),value是我们存的值(强引用)。原理是让变量只在当前线程可见,避免线程安全问题(比如多线程里存用户上下文)。

内存泄漏原因:ThreadLocalMap的key是弱引用,GC时会回收,但value是强引用,只要线程没销毁(比如线程池的核心线程),value就一直占内存,导致泄漏。

避免方法:用完ThreadLocal后,一定要在finally里调用remove()方法,手动删除value。比如Spring的RequestContextHolder,就是用ThreadLocal存请求上下文,并且在请求结束时自动remove,防止泄漏。

三、框架应用(Spring/MyBatis)

问:SpringBean的生命周期?如果想在Bean初始化后做操作,有哪些方式?

答:生命周期大概分4步:①实例化(new对象);②属性注入(setter方法或构造器注入);③初始化(执行初始化逻辑);④销毁(容器关闭时执行)。

初始化后做操作的方式:①实现InitializingBean接口,重写afterPropertiesSet();②在XML里配置init-method属性,或者用@PostConstruct注解(推荐,因为不用耦合Spring接口);③用BeanPostProcessor的postProcessAfterInitialization()(对所有Bean生效,比如AOP

文档评论(0)

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

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

1亿VIP精品文档

相关文档