美团一、二面面经
美团 LBS部门
2020/3/21
笔试 3.19 结果:200/500
一面 90min
- 自我介绍,主要讲了一下项目
- 根据简历:RecyclerView、复用机制;viewType干什么用的
- ViewPager,怎么实现循环滚动?用RecyclerView如何实现View Pager,并且怎么让recyclerView实现Viewpager滑动效果
- 自定义View说一下,onLayout负责什么
- 事件分发机制
- OkHttp大概原理,怎么用的。怎么实现的并发连接(回答了责任链拦截器、线程池),Retrofit、rxjava了解不(没用过,只是见别人用过)
- OS中进程线程区别、进程状态有哪些、进程间通信方式有哪些
- 计算机网络 TCP/IP五层是哪五层。http:应用层、TCP:传输层、IP:网络层。 http一次通讯过程(域名解析、ip转化物理地址、建立连接三次握手四次挥手、返回什么(数据、状态码吧));你们项目中是怎么处理状态码的(根据业务状态码、网络状态码分别判断吧)
- 数据结构:栈、队列怎么实现(数据、链表)
- 如何判断一个链表有环(快慢指针)、 如何找到链表倒数第k结点(快慢指针) 这都是剑指Offer上的题
- 算法题:在二叉树中找到两个节点的最近公共祖先(https://www.jianshu.com/p/f3d2e995fd06)(http://www.360doc.com/content/19/0422/02/9482_830462434.shtml)
- Java基础:
[https://www.cnblogs.com/lsymove/p/11228499.html](https://www.cnblogs.com/lsymove/p/11228499.html) //equals和==区别, String a = "123", a== "123" //true "123"在常量池中,a也指向字符串常量池中的"123",String是final类型;所以在jvm中,已经创建就不会改变。 //那么String a="123";String b="123";为什么是一个对象就很清楚了 String a = new String("123"), a == "123" //false //a指向的是 new出来的对象(在堆中) new 的时候"123"创建在了常量池中。所以a == "123" 一个是(引用a)栈地址 一个是常量池地址 附: String a = new String("123"); String b = new String("123"); a == b //false 地址不同
- 内部类是什么,可不可以访问外部类变量、方法(可以,持有外部类this)
- 面向对象三个特征
- Android:什么是ANR、activity生命周期,A->B B->A 则B返回到A发生什么(b.onPause a.onRestart a.onStart a.onResume b.onStop b.onDestroy)(https://blog.csdn.net/darwin12148888/article/details/99412134)
- 四种启动模式说一下
- 逻辑题:假设你向前走了50米,左转又走了50米,左转又走了50米,你回到了原地,你处于一个什么物体上?(球、圆柱、圆锥之类走那个曲面就行)
- 最近在学什么(复习面试、深入理解java虚拟机、Android开发艺术探索),有没有去google官问了解Android
- 了解不了解RN(不了解,只知道大部分公司都在用RN混合开发)
二面 60min
- 自我介绍
- view的绘制流程,measure、layout、draw(draw后面呢?有一些渲染?)
- 项目中的自动登录是怎么实现的(shardPrefrence,安全性?做了加密)
- gc,什么样的对象可以作为GCRoot。
- 一个方法怎么返回、返回值回传到哪里(深入理解jvm虚拟机里有。返回值回传到引用者的当前栈帧的操作数栈中)
- 线程间通讯怎么做的。
- 用到了线程池,怎么用的,参数怎么设置的。
- 项目中怎么检测树莓派是不是挂了(app轮询)。RESTful API是什么?(项目中使用的后台接口 https://www.jianshu.com/p/ee92c9accedd)。
- 项目难点在哪里。(只回答了viewpager使用经验上的不足)。
- 算法:两数相乘,没写出来。。。 结果是错的。
- 平常是怎么学习的:看书、源码、视频。
//正确做法 leetcode.43 class Solution {//进位留到最后 public String multiply(String num1, String num2) { int len1 = num1.length(), len2 = num2.length(); int[] res = new int[len1 + len2]; for(int i=len1-1; i>=0; i--){ for(int j=len2-1; j>=0; j--){ res[i+j+1] += (num1.charAt(i) - '0') * (num2.charAt(j) - '0'); } } for(int i=len1+len2-1; i>0; i--){ res[i-1] += res[i]/10; //加进位 res[i] %= 10; //取余数 } StringBuilder sb = new StringBuilder(); for(int i : res){ if(!((sb.length()==0)&&i==0)) sb.append(i); } return sb.length() == 0 ? "0" : sb.toString(); } }