- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
美团Java面试题及答案
一、Java基础
问:equals和==的区别?实际开发中怎么用?
答:==是运算符,比较基本类型时比值,比较引用类型时比内存地址;equals是Object类的方法,默认也是比地址,但很多类(比如String、Integer)重写了equals,改成比内容。
实际用的时候要注意:比如判断两个订单号字符串是否相等,得用orderNo1.equals(orderNo2),不能用==;如果怕空指针,就用Objects.equals(orderNo1,orderNo2)。另外重写equals时必须重写hashCode,不然用HashMap存对象会出问题——比如两个对象equals为true,但hashCode不同,会存成两个key。
问:Integera=127,Integerb=127,a==b为true;a=128,b=128,a==b为false,为什么?
答:因为Integer有缓存机制,默认缓存-128到127之间的整数。创建127时,直接从缓存拿对象,所以a和b是同一个地址;128超出缓存范围,会new新对象,地址不一样,所以==为false。
实际开发中如果要比较Integer值,还是用equals,别依赖缓存范围,比如处理订单金额(可能超过127)时,用a.equals(b)才安全。
二、集合框架
问:HashMap底层结构?JDK1.8做了哪些优化?美团业务中怎么避免HashMap问题?
答:JDK1.8前是数组+链表,1.8后改成数组+链表+红黑树。当链表长度超过8、数组容量≥64时,链表转红黑树,减少查询时间(从O(n)降到O(logn));阈值6时红黑树转回链表,避免频繁转换。
美团业务里用HashMap要注意两点:一是线程不安全,高并发场景(比如订单秒杀)得用ConcurrentHashMap,1.8的ConcurrentHashMap用CAS+synchronized替代了1.7的分段锁,效率更高;二是初始容量设置,比如知道要存1000个订单数据,初始容量设(int)(1000/0.75)+1(负载因子0.75),避免频繁扩容。
问:ArrayList和LinkedList区别?什么时候用前者,什么时候用后者?
答:ArrayList底层是动态数组,查改快(通过索引直接定位,O(1)),增删慢(尤其是中间位置,要移动元素,O(n));LinkedList是双向链表,增删快(改指针就行,O(1)),查改慢(要遍历,O(n))。
美团业务里,比如订单列表需要频繁分页查询(查多),用ArrayList;如果是购物车,频繁添加/删除商品(增删多),用LinkedList。但实际中ArrayList用得更多,因为大部分场景是查改多,而且LinkedList遍历太耗时。
三、JVM
问:Java内存模型(JMM)里,堆和方法区的作用?美团怎么处理堆内存溢出?
答:堆是存对象实例的,比如new的Order对象,还分年轻代(Eden、Survivor)和老年代;方法区存类信息、常量、静态变量,比如Order类的结构、static修饰的订单状态。
堆溢出常见原因是对象没回收,比如死循环创建订单。美团的解决办法:一是用JVM参数限制堆大小(-Xms2g-Xmx2g,初始和最大堆都是2g),避免无限膨胀;二是线上用Arthas工具排查,看哪个对象占内存多(比如heapdump导出堆快照,分析是否有内存泄漏);三是代码里避免静态集合存大量对象,比如别用staticListOrderallOrders存所有订单,改用数据库或Redis。
问:垃圾收集器(GC)里,G1的优势?美团为什么用G1而不是CMS?
答:G1是区域化分代收集器,把堆分成多个Region,能兼顾吞吐量和延迟。优势是:支持可预测的停顿时间(比如设置最大停顿200ms),不会像CMS那样有“浮动垃圾”导致的FullGC;还能优先回收垃圾多的Region,效率高。
美团业务里,比如外卖订单系统要求低延迟(用户下单不能等太久),CMS虽然并发收集,但碎片多、FullGC耗时,而G1能控制停顿,还能减少碎片。之前用CMS时,高峰期偶尔会因FullGC卡几秒,换成G1后,停顿基本控制在200ms内,更稳定。
四、并发编程
问:线程池的核心参数?美团怎么设计线程池参数?
答:核心参数有5个:核心线程数(corePoolSize)、最大线程数(max
文档评论(0)