本人是国内某985大三本科生,说来惭愧,大一刚学完C语言还是勉强会用函数的水平,准确来说我的编程生涯开始于大一下学期,这两年间我算是进步速度比较快,中间也比常人花了更多时间在编程和看书上。大三寒假有幸在搜狐公司实习,三月开始准备实习生春招(实际上这时候有点晚了,以至于我阿里一面面的很不好)。最近一个月也面了腾讯百度头条美团等公司,而今天(4月27日)收到腾讯的offer,激动之余不由得感叹,实习生春招终于是结束了。本文仅列举最近面试的公司的面经,一个月之前还面试过携程阿里腾讯头条等公司,也拿到了携程的offer,面经都在我的春招笔记本(https://github.com/bboylin/MyNotebook)中,里面也有一些平时的总结和笔记,主要针对Android和Java,希望对正在找工作或者实习的同学有帮助。废话不多说,下面是面经。
美团一面面了74分钟,比较重基础,算法,操作系统,网络,Android,Java挨个问了个遍。个人感觉还行,不过美团面试流程太慢,至今未等到二面。
- 算法: 常用排序算法,复杂度,比较器用的哪种?快排怎么写?完全二叉树高度为n结点最多有多少,汉诺塔问题怎么解决,链表和数组比较?
- 操作系统: 进程冲突,生产者消费者问题,设逻辑分页和物理分页好处是什么,什么是脏内存。
- 网络:http1.1相比以前版本有什么改变,七层/五层模型,tcpip分别对应哪层。https的对称加密。
- java: public等四个权限关键字的区别,synchronized的用法区别,可否嵌套。 hashmap底层实现,扩容策略,初始化。 arraylist和linkedlist的实现和区别。 classloader的作用,双亲委托。 gc算法(优缺点),为什么叫新生代老年代(晋升机制),强软弱虚四种引用的区别。
- android: activity退出怎么保存数据。 怎么把数据写入文件。 picasso的缓存策略,lrucache底层实现,linkedhashmap底层实现,缓存文件怎么命名。 RxJava优缺点,实习项目相关。 自定义view有几个构造方法,第三个参数作用。 listview的convert view作用,用viewholder为什么可以优化他。
百度一面问了很多性能优化的问题,还有app被杀死怎么启动,耗电太多怎么破,怎么统计crash,怎么减少用户流量消耗,事件分发机制,ontouchlistener返回false才会调用onclicklistener,消息机制,view的绘制原理,方法数超过65535怎么办,binder,anr,listview优化,bitmap怎么避免oom。 Java静态内部类和内部类的区别,垃圾回收机制,元空间有哪些东西,hashmap和hashtable区别,list和set区别。
头条暑期一面: 二维数组二分查找的最优算法,数组元素从左到右从上到下递增。 retrofit原理,recyclerview和listview异同,各自缓存原理,handler原理,activity生命周期,四种启动模式区别,singletask启动standard的activity在哪个栈,android多进程和多线程的实现,进程和线程区别。java泛型类型擦除发生在什么时候,通配符有什么需要注意的。hashmap删除键值对的过程,扩容算法,hashcode和equals有什么关系。java保证线程安全有哪些方法,volatile和synchronized各有何作用。 浏览器打开一个网页的过程发生了什么。 擅长android哪些方面?
- 内推一面: final作用。 下拉刷新加载更多的原理。 RxJava优点,map,flatmap的原理。 可不可以多次subscribeOn,ObserveOn,会有什么后果。 lambda表达式?和匿名内部类的不同。 http协议和https,ssl和tls握手。
- 内推一面: 自我介绍,项目经历。 java finalize关键字的用法。 try 里面return了finally还会执行吗?执行顺序是? wait和sleep的区别,应用场景。 gc发生在什么时候。 死锁发生的条件。 tcp三次握手的过程?如果确认信号没传到服务器会发生什么?为什么不是两次握手? 一个无序数组怎么找出两个和为特定值的数?快排后首尾两游标。 12个鸡蛋有一个质量不同,如何只称三次测出。 开发过程中有没有实际遇到内存泄露情况,怎么解决的。 activity四种启动模式区别和应用场景。 service生命周期,两种启动方式的区别。 实现ipc的方法有哪些? handler的内在原理。消息队列为空会怎样? 换主题功能怎么实现 如果有机会来腾讯实习,你比较感兴趣的技术有哪些?
- 网申一面:当时面完没记录,主要是针对简历提问,大致问了,动画,handler的原理,GC,双亲委托模型,容器类源码,四大组件,红黑树,activity四种启动模式及其用途,Java实现线程安全有哪些方式,TCP三次握手四次挥手,线程进程区别,Android多进程相关,socket相关,怎么设计一个检测内存泄漏的第三方框架,为什么用Picasso不用更好的库,RxJava相关。手写一个线程安全的单例模式。
- 网申二面:技术总监面,学到了很多。基础很重要。基础不好就会更早迎来瓶颈,只有深入底层(操作系统,编译原理,网络,算法等等),解决问题的方案才能多样。大致问了项目,NP问题,断点调试功能怎么设计,也聊到一点在实验室做过的APK逆向工程,写编译器,APP启动过程以及其中的堆栈分配,以及技术成长道路什么的。这是印象最深的一次我感觉面完非常畅快并且受益匪浅,正了我在技术方面的误区,非常感谢面试官。
- HR面:HR面就轻松一点了,问面了哪些公司,为什么没过。家庭情况,爱好,项目经历和自己负责的部分,成绩,对部门了解多少,看过哪些专业书籍,想去哪里发展,经常回家吗,和聊天差不多。面完第二天显示已完成所有面试。
总结就是简历很重要,一份好的简历可以大大提升拿offer的概率,简历上实习经历和项目经历是亮点。面试之前准备工作也很重要(尤其简历上的东西要非常熟悉,面经也可以刷一刷)。基础知识也很重要,切不可只会写Android APP而忽视了操作系统,算法,网络等基础。个人认为,对校招来说,想进大公司光能够写出漂亮的APP是不够的。正如二面面试官所说那样,非科班的也能做。基础和深度是很重要的,比如Android可以多看看源码或者原理,而Java,算法,网络,操作系统,编译原理这些都应该熟练掌握。下面推荐一些我大一到大三看过的技术书籍。
推荐书籍
- c++ primer plus
- efficient c++
- CSAPP
- thinking in java
- 深入理解Java虚拟机
- Android开发艺术探索
- Android开发进阶:从小工到专家(何红辉著)
- 第一行代码第二版(郭霖著)
- effective Java
- 操作系统概念
- 算法导论
- 数据结构与算法分析(Java语言描述)
- Java8函数式编程
- 剑指offer
- 汇编语言(王爽著)
- 计算机网络(谢希仁著,据说是考研书)
- 数据库系统概念
- 设计模式之禅(好在通俗,想了解更深还是《Android源码设计模式》更好)
一些没看过但是据说不错的:
- TCP/IP详解(有三卷)
- TCP/IP协议族
- STL源码剖析
- 鸟哥的Linux私房菜
- the c programming language
- Android设计模式源码剖析
- 计算机程序的构造与解释
作为一个才写了Android一年多的菜鸟,我平时也比较关注鸿洋,何俊林,郭霖,piasy的公众号和博客,还有美团,微信,QQ空间等团队的技术博客,包括一些知乎专栏。平时还是要多积累才能厚积薄发。希望自己能不断进步。也希望这篇博客对各位有一点点帮助。