工作两年三面美团,看我如何从简历到技术面一步一步折服面试官!

147 篇文章 0 订阅
140 篇文章 0 订阅

前言

美团社招(上海)Java开发面经
先搞个前提,各位同学可以根据自身情况仅做参考,本人非计算机专业,学历一般吧,工作目前两年左右,因为工作日实在没有时间,所以和HR约定的是视频面试。

招聘的岗位描述:Java开发工程师,但可能需要学习Go语言,非业务开发部门

地点:上海市长宁区北新泾地铁站附近吧,一年之后极有可能搬到杨浦区

技术一面(一小时)

  • 项目相关的一些问题,主要是阐述了下项目是什么业务场景,解决什么问题,在进行项目描述过程汇总面试官比较关注的貌似是并发量和业务总量

  • 因为我在项目中使用了很多的ES作为持久层,所以面试官就针对我熟悉的中间件进行了提问

  • ES在写入时它是怎么完成一次写入操作的?

  • 此处我给出了两种层面的回答

架构层面

在架构层面,由于ES分为了master、client、data、ingest四种角色,每次写入和读取的HTTP请求都会先落到client角色的节点上,然后再负载到各个data节点上,完成写入和读取的操作后又将响应给应用程序。其中需要注意的是data节点在进行查询时,是由多个分片进行查询后,在内存中拼接而成的,所系查询时也需要很大的内存,

持久化操作层面

这层面的话就只是在写入操作上进行了藐视,首先是数据请求到达了data节点进行存储,存储时刷盘存在了两种方式,buffer刷入磁盘和translog进行存储

  • ES集群写入是怎么优化的

关于HashMap源码方面的理解,主要是存储运算过程

  • HashMap的容量为什么是2的n次方幂
  • HashMap线程不安全会有哪些影响
  • HashMap的resize过程是怎么样的
  • 对于其他集合框架的了解
  • 关于这个HashMap,我之前有专门研究过两天源码,笔记放着同学们自行拿取HashMap源码学习笔记

JVM堆内存模型相关问题

  • 新建对象内存分配过程(没太答上来)

  • 这里应该会涉及到指针碰撞、空闲列表、并发安全(CAS机制和分配缓冲)

  • 堆内存中的GC分类,我在回答时分为了youngGC和FullGC

  • 出现GC时什么情况下会有阻塞用户线程的情况

  • GC算法进行标记的时候,可达性分析算法中,根可达算法(GC Roots)有哪些根

作为 GC Roots 的对象包括下面几种:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象;各个线程调用方法堆栈中使用到的参数、局部变量、临时变量等。
  • 方法区中类静态属性引用的对象;java 类的引用类型静态变量。
  • 方法区中常量引用的对象;比如:字符串常量池里的引用。
  • 本地方法栈中 JNI(即一般说的 Native 方法)引用的对象。
  • JVM 的内部引用(class 对象、异常对象 NullPointException、OutofMemoryError,系统类加载器)。(非重点)
  • 所有被同步锁(synchronized 关键)持有的对象。(非重点)
  • JVM 内部的 JMXBean、JVMTI 中注册的回调、本地代码缓存等(非重点)
  • JVM 实现中的“临时性”对象,跨代引用的对象
  • Spring框架是如何解决循环依赖的问题

二面

  • SpringMVC框架中Filter和Interceptor有什么区别,平时会怎么使用它们

  • ThreadLocal的实现原理,为什么能保证线程安全

  • 设计模式,手写一个静态工厂模式

  • 之前另一个面试手写过三种单例模式,这些设计模式考的都还挺简单的,目前我自己掌握的有

  • 三种创建模式:

  • 单例、工厂、原形

  • 四种行为模式:

  • 模板、策略、监听(写的不多,要百度才能手写出来)、责任链

一个业务场景的算法选择,字典树算法
*
给出的业务场景:目前有一堆单词,给定开头的前缀,如ab找出这对单词中以ab开头的单词。这个没有手写,但是之前在业务上自己用过,放这里方便大家参考

public static void initTrie(Set<String> sensitiveWords) {
 words = new HashMap(sensitiveWords.size());
 Map temp;
 Map<String, String> temp2;
 //遍历传入的敏感词集合,构建字典树
 for (String word : sensitiveWords) {
     temp = words;
     //将每个词转为字符数组,每个字符都是一个状态,构建有限状态集合
     for (char character : word.toCharArray()) {
         //先查看字典树内是否存在这个状态
         Object var1 = temp.get(character);
         if (var1 != null) {
             //如果存在,则指向下一个节点
             temp = (Map) var1;
         } else {
             //如果不存在则进行创建节点
             temp2 = new HashMap();
             temp2.put("isEnd", "0");
             //放置该字符,并标记其状态
             temp.put(character, temp2);
             //指向下一个节点
             temp = temp2;
         }
         if (word.charAt(word.length() - 1) == character) {
             temp.put("isEnd", "1");
         }
     }
 }
 System.out.println(words);
}
public static boolean contains(String text, int matchType) {
 int i = 0;
 while (i == text.length() - 1) {
     text.substring(i);
 }
 return false;
}
public static void main(String[] args) {
 initTrie(new HashSet<>(Arrays.asList("搓搓手", "扣扣脚", "深深懒腰")));
 System.out.println(contains("搓手",1));
}

反问环节

团队代码规范是否严苛,是否有注释

A:代码注释可能不会特别多,但是
对于变量的命名有绝对的CodeReview标准,代码仓库也是自研,如果代码不是太规范标准的话,将不能编译

招人团队属于哪个业务线,如果一起奋斗的话,会在哪个模块

A:主要是负责公司自研的代码仓库,只有部分命令传输模块使用的是开源组件,其他均为公司自研,非业务方面,并且能够看到公司所有的代码

我的面试经验汇总

由于平台限制,不能以图片的形式一一展示了!基础的东西就不进行过多的赘述,我们将会从面试必问的说起,基本上文档里面的内容都是打出面试必问的技术点和面试真题整理而成,大家拿到手后建议直接去把真题做一下,一边练手一边考证一下自己的技术水平,全部做完之后再去看面试题解析和技术点讲解,这样的学习效率是非常高的!
以上所有资料欢迎关注公肿号:前程有光,领取一线大厂Java面试题总结+各知识点学习思维导+一份300页pdf文档的Java核心知识点总结!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值