# 一面 ## 讲下class文件结构 ## import是在class文件哪里存储的 ## 类是从哪里加载的 bootstrap、ext、user ## 栈指令集和寄存器指令集的区别 http://www.voidcn.com/blog/pq258280920/article/p-4274066.html ## GC算法。 感觉这个必问的。说了下分代收集。 ## Http的action都有哪些 我回答了GET、POST、PUT、DELETE、HEAD。我说应该还有,但一时想不起来了。他就没继续问了。 TRACE、OPTIONS ## http1.0和2.0的区别在哪里 我说最大的区别就是安全方面。 然后他说还有呢? ## TCP和UDP的区别 ## 线程和进程的区别 ## QQ应该用哪一种? 我说QQ主要保证消息不丢失。可以采用TCP和UDP混合的。在网络环境差的时候,用TCP保证消息不丢失。网络环境好的时候,可以采用UDP加快速度。 我感觉对于TCP和UDP的理解不是很到位,知乎有个问题 https://www.zhihu.com/question/20292749 ## TCP是怎么保证消息可靠性的? ## Git和SVN的区别。 讲了Git的分布式版本库和SVN的集中式版本库。 ## MySQL假如查询非常慢,怎么解决? 1. 建索引 2. 分表。 面试官感觉不太够,问还有吗? http://tech.meituan.com/mysql-index.html 《高性能MySQL》 查询性能优化 ## 排序算法都有哪些。每个的时间复杂度都是多少? ## 单链表排序 时间复杂度O(nlgn) 空间复杂度O(1) 可以使用归并排序来做。 http://noalgo.info/388.html ## 给两分钟讲下一个你做的最好项目。 我讲了税务主题爬虫项目。介绍了爬虫的技术。以及我负责URL去重,正文提取以及后期的重构。 然后面试官根据这几部分分别展开问。 ## url去重。 BloomFilter + 根据文件名去重。 讲了下为什么这么做。然后面试官问为什么存文件。我说是因为后期恰好也要建搜索引擎,刚好存文件的时候判断文件是否存在。 面试官好像对搜索引擎很感兴趣,于是似乎想问我搜索引擎的知识,我说这块不是我负责的,但是知道一些。面试官说,不是你负责的就算了吧。 ## 正文提取的步骤 简单说了下所用的哈工大的基于行块密度的正文提取算法,中间也加了常见的杂质过滤,以保证最终结果的纯净。 面试官问了怎么组织这些杂质信息呢?这些信息都放在哪里了呢? 我说放在了数据库里面,然后启动之后加载到redis里面。 ## redis用过吗?讲下你所知道的redis? 讲了下IO多路复用 ## 说下IO多路复用。 epoll和select的区别。epoll的水平触发和边缘触发。 ## 说下BloomFilter的原理。 这个幸好我寒假有研究。具体可以看我的博客。这块回答的蛮好的。 http://www.cyhone.com/2017/02/07/Introduce-to-BloomFilter/ ## Hashmap 底层实现 讲一遍Hashmap的原理。 ## Hashmap 可以存null吗? value可以为null。key只能有一个为null。 ## ConcurrenyHashMap的底层? 我说没看过源码,但知道他是由分段锁来实现的。也没继续问下去。 ## 除了synchronized,还有其他的同步方式? 重入锁、读写锁。还有一些java提供的同步类。 ## 读写锁。加读锁的时候能不能写? ## Web后端是怎么分层的。为什么这么分。 讲了下MVC和后端的service、dao和action。 我说主要是业务的解耦以及可以分工合作。 ## 讲一下你所知道的docker。 我说了下docker和虚拟机的区别,主要区别是docker是基于宿主机的内核,而虚拟机是有自己的操作系统内核。 主要相似性就是都提供了运行环境的隔离。 http://dockone.io/article/723 然后面试官就根据这个点,深入问了一个问题。 ## 宿主机能不能看到docker的进程 我说不能看到。其实是可以看到的! http://dockone.io/question/529 ## NOSQL和SQL的区别,以及每个的应用场景 # 二面 ## StringBuffer和StringBuilder的区别 StringBuilder 线程不安全 ## Java中final的用处 1. 用于类 不可继承 2. 用于方法 不可重写 3. 用于属性 值不可修改,对象不可修改地址 ## 什么情况下不用final会编译失败 这个没回答上来。下来查了一下 1. 匿名内部类来自外部闭包环境的自由变量必须是final的 2. 在外部类成员方法内部的内部类。 3. 在一个代码块block里的内部类。 https://www.zhihu.com/question/21395848 ## 说下HashMap的底层实现 这个目前所有面试中都问了。 所以HashMap的源码一定要好好看。 ## Java8解决冲突的方式 我说还是拉链法,似乎不是很满意,然后我说,当超过冲突某个值时,Java8会把链表改为Treemap。 ## ThreadLocal了解多少 讲了下ThreadLocal的源码实现,thread的localmap对象之类的。 ## 快排的最大时间复杂度、最小时间复杂度、平均时间复杂度。 ## 快排是不是稳定的。 快排是不稳定的。 这个真是自己找死,我又说了堆排序是稳定的。实际上是不稳定啊脑子啊脑子。。 http://baike.baidu.com/item/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95%E7%A8%B3%E5%AE%9A%E6%80%A7 ## 1000万个数据的Top K 说了最大堆。然后让我计算1000万个int有多大,然后说内存足够。 然后我讲了下如何用快排实现topk的过程。 当内存足够的情况下,用快排时间求topk复杂度可以为O(n) ## TCP的四次挥手 ## UDP一次最大发送多少个字节 ## Http状态码 主要问了302、404、500 http://seo.ibw.cn/display.asp?id=82 ## redis和memcached的区别 给了个选择题。实际上就是问redis和memcached的差异,最大的差异就是memcached不支持复杂类型如list等。 ## 最快的进程间通信方式是怎么样的 ## linux命令 df -h 查看磁盘空间 du -h 查看文件夹大小 lsof 查看端口占用 top | grep 查看cpu占用 ps -aux | grep linux如何查看一个进程的执行路径? http://lovesoo.org/view-processes-running-linux-full-path-method.html ll /proc/{pid} 通过进程名查找进程PID可以通过 pidof ## 逻辑题。 五辆汽车加油问题。 1/5+1/4+1/3+1/2+1 ## 问了一个多分布式消费者请求生产者的问题 当时一时间没想出来。就往raft协议和一致性hash上面说 ## raft协议、一致性hash 扯了一波主节点分发,领导者选举,一致性hash啥的。我都不知道我在说啥了,估计面试官也晕晕的。。 raft协议说完后,面试官问如果没有主控节点,所有节点都是平级的应该怎么如何设计。 我说应该加分布式锁。 ## 如何实现一个分布式锁。 我说使用redis可以实现分布式锁,但是具体的怎么实践还不是很清楚。 具体的分布式锁的细节,都在此博客中有 http://ifeve.com/redis-lock/ 最后面试官介绍说他们是腾讯手机QQ团队 前面两面电面面试完之后,HR通知我去深圳面试,当天有三面和四面。 # 三面 手写代码。 1. 两个字符串前n位忽略大小写的比较。 2. bitmap实现。 手写完代码之后面试官直接带我去四面,四面是总监面。 # 四面 1. 英语六级 我的六级是飘过,面试官对此略不满意。 2. linux熟悉吗. 我说了下/proc.面试官让我讲下底层实现。。 然后面试官问linux下的inode熟悉吗。 我依稀记得是apue里面讲过,但一点也想不起来了。就说了不知道。 3. TCP为什么四次挥手。 4. TIME_WAIT阶段是干嘛的。 5. “六度空间理论”该如何表示 我说了下用一个巨大的图,然后将其转化为各个节点之间的最短路径问题。 6. 链表倒数第k个怎么快速找。 双指针方法 7. Mac os的发展史 8. nio 9. 二叉树遍历,非递归的方式 四面我个人总体感觉还不错,但是面试完后在腾讯大厦等了一下午也没HR面,因为要回武汉就没继续等下去,后来通知结果跪了。 想想四面走来最终最后跪了,也是蛮遗憾。但是也发现了个人在很多方面的不足。 后来发现竟然是因为提前走了被认定为自动放弃。。。。好气。。 后来参加了腾讯在武汉的校招。到了现场后发现自己被调到了运营开发岗。 # 一面(运营开发) ## 从浏览器到服务器请求结果,整个流程 面试完之后面试官通知我过了一面。看面试官心情好,就申请了转岗。 晚上6点多的时候,被TEG的捞了起来。 # 一面 # 二面 # HR面