9 分钟
实习生面经(二)
五、支付宝
1、2018-04-18 支付宝一面
(1)方式
电话面试 30min
(2)职位
Java研发工程师实习生(失败)
(3)问题内容
- 自我介绍
- 项目难点
- 项目遇到的问题
- 项目带给你的帮助
- 举例说明通过阅读源码解决问题的情况 x
- Java内存回收算法有哪几种,描述一种最熟悉的
- Major GC和Full GC的区别
- 频繁full gc的原因 x
- HashMap的实现原理
- 线程安全的HashMap如何实现
- ConcurrentHashMap如何实现
- 常用的Linux命令
- Java内存泄露如何排查 x
- 数据库索引的执行原理
- 数据库的隔离级别
- 个人职业规划 x
- 学习能力和抗压能力的评价和举例 x
(4)问题答案
个人职业规划
- 我的兴趣是对计算机互联网系统后台开发这一块,我的优势就是勤奋刻苦,善于自学。所以我希望做的是Java后台开发相关的职业。
- 三到五年内我希望我的技术水平能达到较高的层次之后。希望在后台架构方面有所进展。
- 更长远的规划,我会根据实际情况动态调整。
学习能力
- 勤奋刻苦,可以并行学习。
- 大一大二期间,课堂学习、项目实践、ACM训练和比赛同时进行,都取得了很好的成绩。
- 大一大二期间,阅读计算机方面的书籍大约有七八十本。
- 自学习惯好,学习新的知识,我总会写笔记,加深印象和方面后续复习。所以自从2016年11月到现在,我已经写了接近120余篇博客笔记
- 定期查看技术发展的最新动态,比如说查看语言排行榜,一些新的语言特性。
抗压能力
- 比较强
- 大一、大二期间,要兼顾课堂学习、项目、ACM训练比赛等众多压力,但是给我的感受是生活很充实,而不是被压迫的焦虑或者退缩。我会把压力当做动力,让生活充满充实感。
- 首先我比较喜欢面临挑战,在大一什么都不懂的情况下就接下了基于微信的课堂教学系统。并顺利结题
- 信念坚定,不受外物干扰:
- 大一大二在中山学院,周围的同学大都逃课、玩游戏。我坚信我虽然高考失败,但是大学努力一定可以弥补。所以我不会受周围同学的干扰,努力学习,抓住各种提高自己的机会
(5)经验教训
- 开放式问题回答的内容是次要的,重要的是逻辑清晰分析合理
六、汉得
1、2018-04-19 汉得现场面试
(1)方式
现场面试 20min
(2)职位
Java研发工程师实习生(成功)
(3)问题内容
主要问项目、不理基础
七、京东
1、2018-04-21 京东现场面试一面+二面
(1)方式
现场面试 30min一面+10min二面 坐标:成都某酒店
(2)职位
Java研发工程师实习生
(3)问题内容
一面
- 画一下Java集合框架
- 一些集合框架的问题
- 一些并发问题
- 一些虚拟机问题
二面
- 写个程序实现阶乘 x
- 写个文件读取的过程 x
- 写个Sql语句:实现查询所有成绩都及格的学生的姓名
- 针对项目的中的出现的问题提问
- 项目的部署进程,如果挂了怎么办
- 针对建立中,写的熟练掌握的技术的提问
- NIO的实现,Selector如何实现
(4)问题答案
有序的Map
- 插入序:
- LinkedHashMap
- 自然序
- TreeMap
- ConcurrentSkipListMap (线程安全)
实现元素不可重复容器
- set
- HashSet (对HashMap的封装)
- TreeSet
Java的集合框架
分为两个顶层接口Collection、Map
- Collection:主要是单元素集合
- List 线性表结构
- Queue 队列
- Set 集
- Map:主要是键值对集合
- 另外大多数集合都实现了Iterator接口,用于创建迭代器
线程安全的Map
- 使用HashTable
- 使用synchronizedMap
- 使用ConcurrentHashMap(与HashTable相似,不允许出现null键值)
- 完全允许多个读操作并发进行
- 读操作并不需要加锁(弱一致性)
- 读时发生写操作,可能读到旧值
- 涉及到的类
- Segment 继承自 可重入锁
- HashBucket 头结点
- HashEntry几乎不可变(只有value可变),只能插入到最头结点(HashBucket)后面
- 删除的话则HashEntry链表
- ConcurrentSkipListMap
J.U.C使用ReentrantLock的例子
- ConcurrentHashMap中的Segment
- ArrayBlockingQueue阻塞队列
CyclicBarrier和CountDownLatch区别
- CountDownLatch,减记数,不可不可重用,countDown和await两个方法
- CyclicBarrier,加记数,达到最大值重置为0,仍然可以使用,只有一个await方法
写个程序实现阶乘
long f(long n){
if(n<0) return -1;
if(n<=1) return 1;
return n*f(n-1);
}
写个Sql语句:实现查询所有成绩都及格的学生的姓名
表结构如下
+--------+-------+---------+
| name | score | subject |
+--------+-------+---------+
| 小明 | 65.0 | 数学 |
| 小明 | 90.0 | 英语 |
| 小华 | 40.0 | 数学 |
| 小华 | 70.0 | 英语 |
+--------+-------+---------+
实现
#方式1:使用子查询
select distinct name
from Student
where name not in (
select name from Student where score<60
);
#方式2:使用 group by + having
select name from Student group by name having min(score) >= 60;
(5)经验教训
- 写程序一定要严禁,这都不是ACM
- 程序API记不清楚,写个流程,并说明自己记不太清楚API了
- 原理可以略讲,但要搞清楚特性
2、2018-04-27 京东HR面试
(1)方式
电话面试 8min
(2)职位
Java研发工程师实习生
(3)问题
- 自我介绍
- 兴趣爱好
- 为什么选择京东
- 兴趣爱好
- 身边朋友对你的评价
- 职业规划
- 喜欢什么样的团队和leader
八、快手
1、职位信息
(1)地点
北京
(2)职位+部门/团队
后台研发工程师+快手小游戏
(3)待遇
300/天+免费餐点、无住宿补贴
2、2018-05-05 一面+二面+hr面
(1)方式
视频
一面+二面连续进行 约80分
hr面 约15分
(2)问题
一面
- 自我介绍
- 对RESTful和http的理解
- RESTful风格和普通的http的区别
- request和response报文长什么样子
- 浏览器到服务端的过程
- 什么是反向代理
- TCP如何将五次请求发送到服务端的
- TCP如何解决丢包乱序的(如何知道发生丢包了)
- 什么叫超时重传、还有什么别解决方案
- TCP断连的过程
- 断连最后一个ACK丢失怎么办
- TimeWait出现在那一端,被动断连是什么状态
- TimeWait要等多久,为什么?
- DNS作用、DNS分类、为什么DNS要选择UDP
- CDN了解吗
- 如何将字符串IP转换为数字
- 如何快速计算a^b
- Java线程池的实现,各种构造函数参数的含义
- Java中有界阻塞队列
- 阻塞队列和非阻塞队列的区别
- 阻塞队列阻塞是如何发生的,什么时候恢复,谁来通知通知 x
- wait和notify
- 指令重排的原理
- 何时会禁止指令重排,为什么
- Mysql两个主要存储引擎及区别
- 数据库的隔离级别
- 什么是脏读,什么隔离级别解决了脏读
- 什么是幻读,如何解决幻读
- 什么是不可重复读,与幻读的区别
- repeatable read如何解决不可重复读
- 各种锁的兼容关系
- MVCC是什么意思有什么特性
- NIO和其他IO的区别
- 网络编程
- accept后客户端一直发消息,服务端不读会发生什么
二面
- 自我介绍
- Java中原子性和一致性的问题
- 选择线程安全的Map
- 最小堆的概念
- 堆的调整算法
- 实现一个Ip计数器类 vx
- 操作系统的内核态
- AVL和B树
- Java hashCode作用
- Linux正在握手的连接网络连接是什么状态
- 十进制转换为32进制的数
- C++
const char * const p
什么意思 - Java的泛型和C++模板有什么区别
(3)问题回答
对RESTful和http的理解
- RESTful是一种http架构风格
- 如果把RESTful当做分布式架构,那么与之相似的方案有RPC、RMI等
- RESTful将一个URL定义为一种资源,使用不同的http动词表示对资源操作,使用请求头限制资源的表现形式
- RESTful的GET、PUT、DELETE方法要满足幂等性
- GET负责查询、POST负责新增资源、PUT负责全部更新、PATCH负责局部更新、DELETE负责删除资源
- 普通的HTTP可能所有api都使用GET或者POST方法
什么是反向代理
代理用户通过互联网(外部)对内网服务器(内部)的请求
- 安全防护
- 内容缓存
- 负载均衡
正向代理代理内网(内部)用户对互联网(外部)的访问
- 请求过滤限制
- 安全限制
- 跳过防火墙
TCP如何将五次请求发送到服务端的
滑动窗口机制
TCP如何解决丢包乱序的(如何知道发生丢包了)
- 丢包:当发生丢包后,发送方将不会收到ack确认,则超时后会重传
- 乱序:每个tcp包都包含了一个序号,接收方进行排序存放
- 使用滑动窗口,只要确认最后一个接收到的包
TCP断连
- 最后一个ACK发送之后会进入2MSL的timewait状态,此时被动关闭方为LAST_ACK状态
- 保证ACK可以到达
- 这个连接在网上的所有延时的报文都消失,防止干扰新的连接
- MSL:最大报文生存时间:一般为30s、1min或者2min
如何快速计算a^b
int res=1;
while(b){
if(b&1) res=(res*a) % M;
a = a*a;
b >>= 1;
}
阻塞队列阻塞是如何发生的,什么时候恢复,谁来通知通知
- 当队列慢或者队列空
- 使用Condition的await阻塞,signal通知
DNS作用、DNS分类、为什么DNS要选择UDP
- 将域名转换成成ip地址
- 分类
- 大多数实现使用UDP(同时占用TCP和UDP的端口):
- DNS服务是无状态的,要求速度块
- 降低服务器负载,保证服务器的稳定性和简单性
- 重试代价不大
指令重排的原理
为了提高执行效率,编译器会对一些没有依赖性(单线程情况)的顺序语句进行重排序,如果在多线程情况下这就造成了不可预测的执行序列 参见
accept后客户端一直发消息,服务端不读会发生什么
- 导致缓冲区满,滑动窗口为0。
- 然后客户端进行,TCP零窗口探测,如果接收方回复窗口大小仍然为零,则发送方的探测定时器加倍
实现一个Ip计数器类
class IpCount{
Map<String, AtomInteger> ips = new ConcurrentHashMap<>();
public int get(String ip) {
AtomInteger a = ips.get(ip);
if(a==null) return 0;
return a.get();
}
public void update(String ip){
AtomInteger c = ip.get(ip);
if(c==null) {
synchronized(this){
c = ip.get(ip); //双检查
if(c==null){
ips.put(ip,new AtomInteger(1));
return;
}
}
}
c.incrementAndGet();
}
}
九、51信用卡
1、2018-05-10一面
(1)方式
电话 30分
(2)问题
- 自我介绍
- 项目简介
- 当课堂交互遇到高并发的情况如何解决
- SpringMVC一个请求过来如何分发
- servlet是线程安全的吗?No
- servlet全局变量如何使用?(线程安全类或者同步)
- ThreadLocal
- 如何实现登录?(cookie,单点登录Ticket,opendid,oauth)
- 范式化设计
- 反射原理
- 线程池
- 阻塞队列
- Spring的什么是控制反转
- synchronized 和 volatile区别
(3)问题回答
当课堂交互遇到高并发的情况如何解决
- 多个实例+负载均衡
SpringMVC一个请求过来如何分发
https://blog.csdn.net/xiaoxufox/article/details/77196949
- 到达DispatcherServlet
- 查找与该URL映射的Controller的方法(HandlerMapping)
- 生成异常处理链
- 获取处理器适配器
- 进行http请求消息转换,转换成对象等内容
- 经过拦截器链到达Controller方法
- Controller返回视图模型,再次此经过拦截器链
- 调用先关视图解析器解析渲染返回资源
- 返回给web容器
(3)经验教训
- 尽量使用简洁的话、专有词汇回答问题
2、2018-05-15二面
(1)方式
视频 20分
(2)问题
- 未录音,只记得这么多
- 项目询问
- 如何排查堆外内存溢出
- 如何实现一个通用缓存工具
- 如何实现堆溢出
- 如何实现下载断点续传
- SpringMvc如何接收一个请求
- Spring如何创建bean并组织bean的关系
- i++是原子操作吗
3、2018-05-18hr
略