五、支付宝


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