美团社招Java面试经历分享

1、手撕代码。牛客题霸上的原题,可以去看看:NC45 实现二叉树先序,中序和后序遍历

2、项目详细信息,涉及一些aiot交互处理,怎么实现大量的不同设备的指令编解码和指令转化,服务器的架构,自己责任模块

3、OOM的故障处理

4、有没有用过分布式锁,怎么实现的,讲讲原理

5、为什么Redis选择使用跳表而不是红黑树来实现有序集合?

首先分析下Redis的有序集合支持的操作:

1)插入元素

2)删除元素

3)查找元素

4)有序输出所有元素

5)查找区间内所有元素


其中,前4项红黑树都可以完成,且时间复杂度与跳表一致。但是,最后一项,红黑树的效率就没有跳表高了。在跳表中,要查找区间的元素,我们只要定位到两个区间端点在最低层级的位置,然后按顺序遍历元素就可以了,非常高效。


而红黑树只能定位到端点后,再从首位置开始每次都要查找后继节点,相对来说是比较耗时的。此外,跳表实现起来很容易且易读,红黑树实现起来相对困难,所以Redis选择使用跳表来实现有序集合。


6、mysql优化的实践经验

7、hashMap1.81.7区别

jdk1.8相对于1.7底层实现发生了一些改变。1.8主要优化减少了Hash冲突 ,提高哈希表的存、取效率。

1)底层数据结构不一样,1.7是数组+链表,1.8则是数组+链表+红黑树结构(当链表长度大于8,转为红黑树)。

2JDK1.8resize()方法在表为空时,创建表;在表不为空时,扩容;而JDK1.7resize()方法负责扩容,inflateTable()负责创建表。

31.8中没有区分键为null的情况,而1.7版本中对于键为null的情况调用putForNullKey()方法。但是两个版本中如果键为null,那么调用hash()方法得到的都将是0,所以键为null的元素都始终位于哈希表table0】中。

4)当1.8中的桶中元素处于链表的情况,遍历的同时最后如果没有匹配的,直接将节点添加到链表尾部;而1.7在遍历的同时没有添加数据,而是另外调用了addEntry()方法,将节点添加到链表头部。

51.7中新增节点采用头插法,1.8中新增节点采用尾插法。这也是为什么1.8不容易出现环型链表的原因。

61.7中是通过更改hashSeed值修改节点的hash值从而达到rehash时的链表分散,而1.8中键的hash值不会改变,rehash时根据(hash&oldCap==0将链表分散。

71.8rehash时保证原链表的顺序,而1.7rehash时有可能改变链表的顺序(头插法导致)。

8)在扩容的时候:1.7在插入数据之前扩容,而1.8插入数据成功之后扩容。


8、netty的原理和使用

9、tcp的连接过程

10、socket有几个队列

11、一台服务器能支持多少连接,为什么

12、tcp各个参数怎么设置

13、redis底层基本数据类型,redis集群原理,cluster集群的使用

14、mysql存储引擎类型,索引类型,innodb数据存储方式

15、线程池的参数说明,rejectHandler说明

16、volatile的原理

17、jvm有哪几种垃圾回收器,各自的应用场景

1)新生代收集器:

Serial

ParNew

Parallel Scavenge

2)老年代收集器:

Serial Old

CMS

Parallel Old

3)堆内存垃圾收集器:G1


18、g1回收器的特征

19、jvm结构

20、负载均衡器的四层和七层负载均衡原理

21、场景题:设计一个高可用高并发的电商系统

#美团##社招##面经##Java工程师#
全部评论
楼主一面?
点赞 回复
分享
发布于 2020-11-13 01:26
楼主,你们的 hr 面都有 问薪资吗? 我这种没问都是不是要挂了?
点赞 回复
分享
发布于 2020-12-05 21:53
联易融
校招火热招聘中
官网直投

相关推荐

4 69 评论
分享
牛客网
牛客企业服务