一面
1.1 面试体验
- 时间:2020-09-11 15:00 ~ 16:30
- 面试官全程笑脸,很耐心,OS聊的很深💖💖💖💖💖
1.2 问题
- 进程和线程的区别
- 进程间通讯,并依次解释
- 内存映射
- Linux文件IO过程
- MMAP() 是什么?
- 死锁是什么,手写死锁示例
- 线程不安全的例子
- HashMap哪里线程不安全,单就put和get函数线程安全吗
- HashMap的链表转树,条件和原因;树转链表,条件和原因
- TCP三次握手和四次挥手
- 可以把四次挥手第二、三次挥手合并吗
- HTTP获取每个资源,每次都要建立TCP连接吗(HTTP1.1 和 1.0的区别)
- HTTP2.0和1.1的区别
- 同一个TCP连接可以进行多次HTTP请求吗,为什么
- 反问
1.3 代码实操
按照之字形打印二叉树(分析时间复杂度、空间复杂度)
二面
2.1 面试体验
- 时间 2020-09-16 14:20 ~ 15:50
- 面试官人也蛮nice的,前期跟我讨论了非常多题外话以及安全相关的问题💖💖💖💖💖
2.2 问题
- 为什么决定做安卓开发
- 之前为什么投递了后端开发
- 你的职业规划
- 移动安全是什么,包括什么(详细扯了apk打包,代码混淆)
- APK打包携带签名,由谁来验证(如果在应用商店、安装时、启动时怎么验证、有网络、无网络怎么验证)
- apk代码混淆做了什么
- 场景题:恶意用户通过hack客户端修改自己定位或者自动抢单,应该如何防止
- HTTPs中间人攻击为什么用证书可以解决(提到密钥协商)
- 动态密钥协商协议可以防止中间人攻击吗?(不能,只能保证前向安全)
- 给一段代码,分析变量的存储以及值的变化情况
- 反问
2.3 代码实操
- 实现栈,支持泛型、扩容、同步、push、pop,使用单链表,不能用java支持的数据结构做
public class MyStack<T>{
static class ListNode<T>{
T val;
ListNode<T> next;
public ListNode(T val) {
this.val = val;
}
}
private int capcity;
private ListNode<T> head;
public MyStack() {
capcity = 0;
head = null;
}
public synchronized void push(T val) {
ListNode<T> next = head;
head = new ListNode<T>(val);
head.next = next;
capcity++;
}
public synchronized T pop() throws Exception {
if(isEmpty()) throw new Exception("Stack is empty");
T val = head.val;
head = head.next;
capcity--;
return val;
}
public boolean isEmpty() {
return head == null;
}
public int size() {
return capcity;
}
public T peek() throws Exception {
if(isEmpty()) throw new Exception("Stack is empty");
return head.val;
}
}
- 将上述代码的同步操作由syschronized替换为CAS的做法(写CAS出了点问题,这里Mark一下)
import java.util.concurrent.atomic.AtomicReference;
public class MyStack<T>{
static class ListNode<T>{
T val;
ListNode<T> next;
public ListNode(T val) {
this.val = val;
}
}
private int capcity;
private AtomicReference<ListNode<T>> head;
public MyStack() {
capcity = 0;
head = new AtomicReference<ListNode<T>>();
}
public T pop() throws Exception {
if(isEmpty()) throw new Exception("Stack is empty");
while(true) {
ListNode<T> currTop = head.get();
if(currTop == null)
throw new Exception("Stack is empty");
else {
ListNode<T> next = currTop.next;
if(head.compareAndSet(currTop, next)) {
capcity--;
return currTop.val;
}
}
}
}
public void push(T val) {
ListNode<T> newNode = new ListNode<T>(val);
while(true) {
ListNode<T> currTop = head.get();
newNode.next = currTop;
if(head.compareAndSet(currTop, newNode)) {
capcity++;
return;
}
}
}
public boolean isEmpty() {
return head.get() == null;
}
public int size() {
return capcity;
}
public T peek() throws Exception {
if(isEmpty()) throw new Exception("Stack is empty");
return head.get().val;
}
}
HR面
3.1 面试体验
- 时间 2020-09-16 18:00 ~ 18:30
- 面试体验很好,HR声音好听💖💖💖💖💖
3.2 问题
- 自我介绍
- 实习项目,做了什么,遇到什么困难,怎么解决的
- 为什么选择Java客户端呢
- 职业规划
- 对美团有什么看法吗
- 做安全可以分为那些方向呢,有什么区别吗
- 反问