Java技术高频面试题及答案(企业实战版).docx

Java技术高频面试题及答案(企业实战版).docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

Java技术高频面试题及答案(企业实战版)

一、Java基础核心

问:int和Integer有什么区别?实际开发中什么时候会踩坑?

答:int是基本类型,占4字节,默认值0;Integer是包装类,本质是对象,默认值null。

踩坑点:一是自动装箱拆箱的NPE问题,比如Integera=null;intb=a;会抛空指针;二是缓存池问题,Integerx=127;Integery=127;x==y为true(缓存-128~127),但128时为false,项目里比较值建议用equals()。

问:Override和Overload的区别?重写时要注意什么?

答:Override是子类重写父类方法,方法名、参数列表、返回值完全一致(子类返回值可窄化),访问权限不能更严格;Overload是同一类中方法名相同、参数列表不同(个数/类型/顺序),返回值无关。

重写注意:必须加@Override注解(避免拼写错),父类方法不能是private(否则子类是新方法不是重写),异常声明不能扩大(比如父类抛IOException,子类不能抛Exception)。

二、集合框架

问:HashMap和ConcurrentHashMap的区别?JDK1.8里ConcurrentHashMap做了哪些优化?

答:HashMap线程不安全,多线程put可能导致死循环(JDK1.7链表扩容时)或数据覆盖;ConcurrentHashMap是线程安全的。

JDK1.8优化:①放弃分段锁(Segment),改用CAS+synchronized(只锁链表头/红黑树根节点),并发度更高;②底层结构和HashMap一致(数组+链表+红黑树),链表转红黑树阈值8,退化为链表6;③支持原子操作如putIfAbsent(),避免手动加锁。

问:ArrayList和LinkedList怎么选?实际项目中用哪个多?

答:ArrayList底层数组,查改快(索引访问O(1))、增删慢(需复制数组);LinkedList底层双向链表,增删快(改指针O(1))、查改慢(遍历O(n))。

项目里ArrayList用得更多:一是大部分场景是查改操作,二是LinkedList遍历效率低(即使遍历也建议用迭代器,别用get(i)),除非明确是频繁在首尾增删(比如实现队列)。

三、JVM与性能优化

问:项目里怎么排查内存泄漏?举个实际案例

答:常用工具:JDK自带jmap(dump内存快照)、jhat(分析快照),或Arthas(线上实时查看)。

案例:之前做电商项目,订单列表查询后用staticArrayList存历史数据,没及时清理,导致老年代内存持续上涨。排查步骤:①用jstat-gc看老年代使用率,发现持续100%;②jmap-dump:format=b,file=heap.hprof进程号导出快照;③用jhat分析,发现ArrayList对象占用60%内存,引用链指向static变量;④改成本地缓存(如Caffeine)并设置过期时间,问题解决。

问:GC垃圾收集器你项目里用的哪个?怎么配置参数的?

答:后端服务用G1收集器(JDK1.8默认是Parallel,但G1适合大内存低延迟)。

核心配置:-Xms4g-Xmx4g(堆大小固定,避免频繁扩容)、-XX:+UseG1GC(启用G1)、-XX:MaxGCPauseMillis=200(目标停顿时间200ms)、-XX:InitiatingHeapOccupancyPercent=45(堆占用45%触发混合收集)。

为什么这么配?因为服务是金融交易系统,要求低延迟,G1的Region分块回收能更好控制停顿时间,之前用Parallel时偶尔会有1秒以上GC停顿,改G1后稳定在200ms内。

四、Spring框架

问:SpringBean的生命周期?实际项目中怎么自定义初始化逻辑?

答:生命周期核心流程:实例化(new对象)→属性注入(setter/构造器)→初始化前(BeanPostProcessor.postProcessBeforeInitialization)→初始化(init-method/@PostConstruct)→初始化后(BeanPostProcessor.postProcessAfterInitialization)→就绪→销毁(destroy-method/@PreDestroy)。

自定义初始化:常用

文档评论(0)

151****9429 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档