美团9大高频问题和答案! 【后端】

国内互联网大厂主要使用Java的,当属阿里和美团了吧!

之前分享过阿里的一些高频面试题和答案,链接在此:https://www.nowcoder.com/discuss/818602
今天分享的是美团的面试问题,整理自牛客2021.10.11-2021.11.07这一段时间的面试问题和答案。

春招准备冲阿里和美团的牛油记得收藏点赞,学起来呀!有任何问题欢迎在评论区留言,我看到会回复的~

另外我写的《Java面试必知必会》系列继续更新,请大家多多关注!

下面开始美团高频面试题分享:

Java线程池核心参数与工作流程,拒绝策略

线程池中的执行流程:

(1)当线程数小于核心线程数的时候,使用核心线程数。

(2)如果核心线程数小于线程数,就将多余的线程放入任务队列(阻塞队列)中

(3)当任务队列(阻塞队列)满的时候,就启动最大线程数.

(4)当最大线程数也达到后,就将启动拒绝策略。

回答:有四种拒绝策略

1.ThreadPoolExecutor.AbortPolicy

线程池的默认拒绝策略为AbortPolicy,即丢弃任务并抛出RejectedExecutionException异常(即后面提交的请求不会放入队列也不会直接消费并抛出异常);

2.ThreadPoolExecutor.DiscardPolicy

丢弃任务,但是不抛出异常。如果线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃(也不会抛出任何异常,任务直接就丢弃了)。

3.ThreadPoolExecutor.DiscardOldestPolicy

丢弃队列最前面的任务,然后重新提交被拒绝的任务(丢弃掉了队列最前的任务,并不抛出异常,直接丢弃了)。

4.ThreadPoolExecutor.CallerRunsPolicy

由调用线程处理该任务(不会丢弃任务,最后所有的任务都执行了,并不会抛出异常)

Synchronized和Lock的实现原理与区别

相同点:

(1)都是可重入锁

(2)都保证了可见性和互斥性

(3)都可以用于控制多线程对共享对象的访问

不同点:

(1)ReentrantLock等待可中断

(2)synchronized中的锁是非公平的,ReentrantLock默认也是非公平的,但是可以通过修改参数来实现公平锁。

(3)ReentrantLock绑定多个条件

(4)synchronized是Java中的关键字是JVM级别的锁,而ReentrantLock是一个Lock接口下的实现类,是API层面的锁。

(5)synchronized隐式获取锁和释放锁,ReentrantLock显示获取和释放锁,在使用时避免程序异常无法释放锁,需要在finally控制块中进行解锁操作。

重写和重载的区别

回答:

重载是发生在同一个类中,具有相同的方法名,但是有不同的参数,参数的个数不一样、参数的位置不一样,这就叫重载,常见的就比如构造方法,有有参构造和无参构造。

重写是发生在当子类继承父类时,对父类中的一些方法根据自己的需求进行重写操作。

线程的状态及转移

Java中线程生命周期分为新建(New)、运行(Runnable)、阻塞(Blocked)、无限期等待(Waiting)、限期等待(Time Waiting)和结束(Terminated)这6种状态。

synchronized原理

回答:

(1)synchronize作用于成员变量和非静态方法时,锁住的是对象的实例,即this对象。

(2)synchronize作用于静态方法时,锁住的是Class实例

(3)synchronize作用于一个代码块时,锁住的是所有代码块中配置的对象。

Jvm垃圾回收器

回答:垃圾回收器可以在新生代和老年代都有,在新生代有Serial、ParNew、Parallel Scavenge;老年代有CMS、Serial Old、Parallel Old;还有不区分年的G1算法。

追问1:CMS垃圾回收器的过程是什么样的?会带来什么问题?

回答:CMS回收过程可以分为4个步骤。

(1)初试标记:初试标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,但需要暂停所有其他的工作线程。

(2)并发标记:GC 和用户线程一起工作,执行GC Roots跟踪标记过程,不需要暂停工作线程。

(3)重新标记:在并发标记过程中用户线程继续运作,导致在垃圾回收过程中部分对象的状态发生了变化,未来确保这部分对象的状态的正确性,需要对其重新标记并暂停工作线程。

(4)并发清除:清理删除掉标记阶段判断的已经死亡的对象,这个过程用户线程和垃圾回收线程同时发生。

带来的问题:

(1)CMS收集器对处理器资源非常敏感。

(2)CMS无法处理“浮动垃圾”。

(3)CMS是基于标记-清除算***产生大量的空间碎片。

追问2:G1垃圾回收器的改进是什么?相比于CMS突出的地方是什么?

回答:G1垃圾回收器抛弃了分代的概念,将堆内存划分为大小固定的几个独立区域,并维护一个优先级列表,在垃圾回收过程中根据系统允许的最长垃圾回收时间,优先回收垃圾最多的区域。(G1算法是可控STW的一种算法,GC收集器和我们GC调优的目标就是尽可能的减少STW的时间和次数。)

G1突出的地方:

基于标记整理算法,不产生垃圾碎片。

可以精确的控制停顿时间,在不牺牲吞吐量的前提下实现短停顿垃圾回收。

追问3:现在jdk默认使用的是哪种垃圾回收器?

回答:(被问到过好几次)

jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)

jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)

jdk1.9 默认垃圾收集器G1

HashMap与ConcurrentHashMap在Jdk1.7和1.8的区别

HashMap

回答:在jdk1.7之前HashMap是基于数组和链表实现的,而且采用头插法。

而jdk1.8 之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。采用尾插法。

HashMap默认的初始化大小为 16。当HashMap中的元素个数之和大于负载因子*当前容量的时候就要进行扩充,容量变为原来的 2 倍。(这里注意不是数组中的个数,而且数组中和链/树中的所有元素个数之和!)

ConcurrentHashMap

回答:在jdk1.7是 分段的数组+链表 ,jdk1.8的时候跟HashMap1.8的时候一样都是基于数组+链表/红黑树。

ConcurrentHashMap是线程安全的

(1)在jdk1.7的时候是使用分段所segment,每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。

(2)在jdk1.8的时候摒弃了 Segment的概念,而是直接用 Node 数组+链表+红黑树的数据结构来实现,并发控制使用 synchronizedCAS 来操作。synchronized只锁定当前链表或红黑二叉树的首节点。

CAS操作原理与实现

CAS指Compare and swap比较和替换是设计并发算法时用到的一种技术,CAS指令有三个操作数,分别是内存位置(在Java中可以简单的理解为变量的内存地址,用V表示),旧的预期值(用A表示)和准备设置的新值(用B表示)。CAS指令在执行的时候,当且仅当V符合A时,处理器才会用B更新V的值,否则它就不会执行更新。

CAS带来的问题是什么?如何解决的?

回答:ABA问题、循环时间长开销很大、只能保证一个共享变量的原子操作

一般加版本号进行解决(具体操作:乐观锁每次在执行数据的修改操作时都会带上一个版本号,在预期的版本号和数据的版本号一致时就可以执行修改操作,并对版本号执行加1操作,否则执行失败。)

TCP与UDP区别

回答:TCP 和UDP都是属于运输层的

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接

2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付

3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的;UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)

4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

5、TCP首部开销20字节;UDP的首部开销小,只有8个字节

img

6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

追问:TCP和UDP的使用场景?

某些情况下 UDP 确是一种最有效的工作方式(一般用于即时通信),比如: QQ 语音、 QQ 视频 、直播等等。

TCP 一般用于文件传输、发送和接收邮件、远程登录等场景。

TCP是如何保证可靠传输的?

  1. 应用数据被分割成 TCP 认为最适合发送的数据块。
  2. TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
  3. 校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
  4. TCP 的接收端会丢弃重复的数据。
  5. 流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
  6. 拥塞控制: 当网络拥塞时,减少数据的发送。
  7. ARQ协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
  8. 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
#高频知识点汇总##面经##Java##美团##Java工程师#
全部评论
有个疑问,方法重载不是和返回值无关吗?
3 回复 分享
发布于 2021-12-14 11:13
问synchronized原理的话,不应该回答它锁住了什么对象吧。synchronized是jvm级别的锁,加了synchronized关键字会在代码段前后加上monitorenter和monitorexit这两个jvm指令,从而实现锁。
2 回复 分享
发布于 2022-01-20 10:14
暑期实习陆续开始招聘了,也会为大家第一时间整理各大公司的面经合集。 另外关于以上问题的答案,可以在《Java面试必知必会》中找到大部分的答案。 还没有下载《Java面试必知必会》的朋友,可以通过以下两个途径获取。 获取《Java面试必知必会》方法 - 1、可以进入到gitee下载《Java面试必知必会》1.0版本 (《Java面试必知必会》1.0版本已经正式上线,可以到gitee下载https://gitee.com/code-to-xiaobai/java-interview-must-know) - 2、wx公众号:代码界的小白,后台回复:Java面试必知必会
1 回复 分享
发布于 2022-02-21 20:26
更多研发优质春招职位,尽在校招补录专场,限时投递链接:https://www.nowcoder.com/jobs/jump/Odrxnr
1 回复 分享
发布于 2022-02-21 20:34
欢迎大家留言交流,offer++
点赞 回复 分享
发布于 2021-12-13 18:00
🎉恭喜牛友成功参与 【创作激励计划】高频知识点汇总专场,并通过审核! ------------------- 创作激励计划5大主题专场等你来写,最高可领取500元京东卡和500元实物奖品! 👉快来参加吧:https://www.nowcoder.com/discuss/804743
点赞 回复 分享
发布于 2021-12-13 18:07
需要更多资料和资源可以关注公众号:代码界的小白
点赞 回复 分享
发布于 2021-12-15 21:02
G1收集器是标记复制算法,真是误导人
点赞 回复 分享
发布于 2022-01-22 11:23
手机淘宝还有暑期实习hc,在杭州。有意联系。
点赞 回复 分享
发布于 2022-03-22 11:50

相关推荐

评论
78
603
分享
牛客网
牛客企业服务