咳咳,介绍一下,我是来自西北地区某不知名一本邮电类院校的大三学生,在大一加入了移动应用开发实验室,找实习阶段面了三家,分别是百度、字节跳动和创业公司,拿到了字节和创业公司的offer,百度那边,目前还在备胎池里面泡着,问了两次发布招聘的那个人,都说三面消息还没通知。创业公司是我第一个投用来熟悉面试的,毕竟人生第一次工作面试嘛。
实习差不多就这样了,也不想当什么offer收割机,字节跳动是我比较喜欢的公司,最终选择去字节跳动。百度那边就放弃了,本来也不想去百度,不喜欢他们的企业文化,对百度没啥好印象,去年学长实习了两周就被裁了,刚回到学校准备期末考试,结果就打电话说不用来了…
8、9、10、11月真的是超鸡累,8月17暑假留校结束了,其他同学基本都回去了,而我又跑到学校来了,每天LeetCode10+道题目+35英语单词。9月先是匆忙的赶完自己的第二个项目,然后就每天在整理补充学习过知识,写笔记,写博客,做简历,熟悉简历,面试准备…
到了周末也闲不下来,周六早早起来继续学习。周日也是早早起来,刷几个题,然后打LeetCode周赛,算法很重要啊,现在面试都比较重视算法能力,自己也比较喜欢做题练练思维。
下面两张就是我近几月的 contributions 、blogs,内推的时候也是收到了肥美
二字好评。
数据结构:
数组链表的区别、理解
栈和队列理解
认为最快的排序,快排思想、复杂度、二叉树的理解、前中后遍历
哈夫曼树,顺带问了安卓的文件压缩
稳定排序的理解
动态规划、深搜广搜,回溯
Java:
抽象类、接口的理解和区别
多态理解
面向对象的理解
hashmap的实现,计算hash、冲突解决、红黑树的理解
==和equal
值传递和引用传递
static、final关键字,抛出一个使用的场景分析
多线程
操作系统
线程进程理解、区别
Android中的多进程如何写
Android:
上来先来一波四大组件,生命周期,场景分析
进程相关,应用默认几个进程,如何实现多进程
Fragment理解,生命周期,项目如何使用的
RecyclerView相对ListView的优化,局部刷新,复用策略
Service的理解作用,所处的线程
ASyncTask实现,线程池和Handler
消息机制的原理
内存泄漏、OOM场景及解决
我项目View的优化,嵌套层次,性能检测
介绍第二个项目,为什么写这个项目。。一波乱吹
讲了富文本的实现,图片的加载
项目插件化的具体实现
分析了ClassLoader和部分Activity启动流程
Intent如何替换的
插件资源如何加载,这个有些地方忘记了没讲清,整体逻辑没问题
简单介绍了VirtualAPK,说说其他的插件化方案
面了差不多一个小时,整体来说这个面试官很好,我答得也不错,最后聊了点其他的,然后直接问我什么时间能二面。
这个面试官 emm 真能问,连问我1小时20分钟,整整的80分钟技术面,按着我的简历一个一个问,给问懵逼了
介绍第一个项目,介绍第二个项目,介绍平板端
讲讲LeakCanary的机制和源码
讲讲OOM,除了内存不足还有哪些情况出现OOM
讲讲四大引用
Gson和自带的解析库的区别
View怎么优化的
WebSocket怎么写的
token怎么验证的
断点下载怎么写的
Handler机制,然后给了我很多问题让我分析
Glide源码
MVP、MVC
AMS有了解没
hook的实现
插件化的实现
项目的适配
屏幕适配,UI适配
两个题目
一根绳子1小时烧完,怎样记录30分钟
一个数组的次大值
设计判断一个应用进入了后台的方法
GC、GCRoot
Android的ClassLoader
双亲委派
h5有用过没
APP应用崩溃、ANR信息后台收集
介绍ARouter
如何增快Activity的启动速度
设计模式学过没
观察者模式
注解分类
学过C++没
JNI了解不
View事件分发
自定义View写过没
目前还在百度的备胎池里面泡着,问了面试官两次,都说三面还没通知,结果出来会立刻打电话的
这是一个创业公司,面试官人也挺好的。原本是面这个来试试的,结果先给百度我打电话了。
只有一面,面完有两个HR加我微信,给我说了挺多的,很想留我到他们的公司,但是我还是希望去大厂,和HR也解释了一些情况。
给我发了一个腾讯文档链接,让我先来做两道题。
第一道,看程序写结果。。
考了trycatch、++a、a++
第二道,求一个数的平方根的整数部分,很简单,一个二分的题
但是面试官总说我的代码有问题。我给他讲了好几波,最后面试官说他想错了,嘿嘿
然后问了下热更新
分别讲了基于Instant Run和类加载的方案
讲完面试官一时还没反应过来Instant Run是啥
最后面试官也就没多问其他东西,随便聊了聊公司的情况。
感觉面试官超好,自我感觉,答的也不错
自我介绍
介绍比赛
OKHttp源码
AsyncTask原理
OKHttp的WebSocket,讲了Websocket协议,还有OKHttp的封装
RecyclerView的回收复用
LeakCanary原理源码
OOM、内存泄漏,哈哈,每场面试必问套餐
Handler原理、Handler带来的内存泄漏
MVP
ARouter原理源码
如何加载插件中的class
如何实现插件中的资源加载
相比百度,字节问的Android问题轻松多了,就问了上面那么多,主要针对简历问的,刚好简历也准备的特熟
讲着讲着,面试官都不让我扩展讲了,哈哈哈
然后考了几个算法题
第一题 是一个看程序写结果
记得没错的话应该就是下面这个
public static void main(String[] args) {
Map<Short, Integer> map = new HashMap<>();
for (Short i = 0; i < 100; i++) {
map.put(i, 100 - i);
map.remove(i - 1);
}
System.out.println(map.size());
}
没答好,还以为有坑
这个题考了自动拆装箱和泛型,面试官最后问了我泛型的原理
第二题,一个文件,数据很多不能直接加载到内存,让设计一个算法
我以前绝对看到过这个问题…但是。。没打上来
我大概说了一下,肯定需要分组排序,最后还需要合并一下,好像和没说一样hh
面试官提示了一下,说可以使用文件临时存一下结果
嗯,还是不会…
最后网上看了一下,发现差不多也就是我说的那个思路,只不过在最终归并的时候,是使用文件指针,当所有的分支文件都访问完时,那么整体也就合并完了
第三题,一道很简单的设计题
设计一个类似于优先队列的结构,题目大概是这样
实现一个PriorityQueue
一组优先级不同的任务进入队列,出队列的总是当前队列中优先级最大的任务
示例:2、5、1、11、7依次入队列,出队列顺序依次为11、7、5、2、1
要求:实现入队列、出队列操作
面试官最后说可以用堆写,不是特别熟悉优先队列,不过我二分也是logN
这个面试官给我一种巨佬的感觉,emmm,很有气场
都没让我自我介绍。。而且问的都是我不太熟悉的。。几乎没问我简历上的东西。
面试官全程不做记录,到最后做题的时候,哐哐哐才敲键盘。
有用过Android的新布局没
常用那些布局?然后围绕着线性布局和相对布局说的挺多
问法和其他面试官不太一样,再加上没准备布局面试相关的东西,答得不是很好,但是差不多能说出个一二
接着问了我平时写布局时,都做了那些优化,emmm,只好讲项目做过的优化,但是不是他想要听的回答
后来说到卡顿丢帧了,终于问道熟悉的了,然后我主动问他,需要我讲一讲framework层和native层之间屏幕刷新的本质吗?我有看过安卓底层刷新的源码。
然后分析了一下整个的请求逻辑,面试官听后,感觉还是比较满意的,就问我,平时是不是对framework研究挺多的?我瞬间就感到这是个坑,我就说,也不是太多,一般用到了就会追踪到源码看看实现。
然后就不问了,下来就是计网。
都问啥,记得不是很清楚了,大概有下面这些
tcp、udp 区别 + 应用
介绍一下http协议
浏览器输入一个url发生了啥
DNS查询
四挥
常见的响应码
post和get的区别 + 应用
如何将get变为post
一个报文基本的头
这个面试官很抠细节,一些稍微不严谨的地方都会指出来
然后时间差不多了,问了三道算法题。
第一道
一个集合中,有数字1~1024,其中的数字是乱序的,现随机插入一个x,求这个x
答得不是很好,面试官提示了一下才打上来
第二道
版本号比较,一个原题,很简单,但是这个面试官很爱抠细节
第三道
一个没有重复元素的数组,给一个target,求两个数字和为target的对数。
也很简单,讲了三种解法,O(n2)+O(nlogn)+O(n)
nlogn的要用到排序,顺势问了一下排序,然后让我写快排,此时已经面了1小时10分钟了。。。
那还能怎样呢,写呗,写了两分钟,面试官等不及了,说算了,假如现在这个数组就是有序的。
最后写完后,又扣了几个细节
最后就问几个问题聊了聊。说还会有一常偏技术的面试…
来自国外的一场三面,二面结束后刷了一波面经,基本上三面还是技术面,所以就准备了一些智力题,然后复习了一下以前做过的题
这个面试官人挺好的,苗总说是大leader,四大组件问的比较多,我ContentProvider没有怎么复习,被问到了,唉
四大组件还是好好复习,我把简历上的东西准备的特别熟悉,但是四大组件复习的不到位
项目中View做的优化
LeakCanary原理
Activity和Fragment的生命周期
Activity通信+传值,startActivityForResult、EventBus(原理不知道)
Service是否会ANR
远程Service、本地Service
对Service通信
Android跨进程通信,AIDL
常见的远程Service
两个进程通过一个文件实现跨进程通信什么什么的,问题记不太清了,我当时也没答上来,应该是关于ContentProvider的
Bundle、Binder原理,不会
没问算法,直接让写一个完整的生产者消费者模型,跪了,基本乱写,以前就没看过这个啊!为啥会让写这个呢。。。最后了解到,Handler框架中是存在一个生产者消费者模型的,而我的简历上写了对Handler消息框架有了更深入的理解…
第二天HR面,了解了一下学校的情况、实验室,然后就介绍了一下工作的相关情况。
面试官你好,我是来自西安邮电大学软件工程系一名大三的学生。我由大一第一学期开始接触计算机,在大一寒假通过阅读书籍自学C语言,接着在大一第二学期加入了我们学校的移动应用开发实验室,开始有规划的学习安卓开发。
在加入实验室后,首先是继续熟悉、练习C语言,并完成了一个C语言版的图书管理系统。接着在大一暑假,我们进行了暑假留校学习,通过大二学长给我们指定的计划,开始学习Java基础和安卓基础。然后在大二开学,根据大三学长安排了一个仿写任务,就是根据自己喜欢的APP进行UI和部分功能的仿写。其主要是练习我们的UI编写能力,熟悉Android四大组件。仿写任务完成后,根据大三给我们安排的任务,我们继续学习Android的一些进阶知识,比如阅读进阶书籍,学习流行库流行框架等等。
接下来,在大二寒假前有接触到中国大学生服务外包创新创业大赛,我选择了一个比较贴近安卓开发的一个命题,然后担任项目负责人,寻找实验室其他组内伙伴进行组队。然后由寒假到大二的第二学期,就一直在准备比赛材料,筹备比赛的相关事宜,并完成自己的项目便捷会议,通过项目不断扩充对安卓的学习。最终比赛也获得了不错的成绩,拿到了全国二等奖。与此期间,我还担任了我们实验室安卓组的负责人,负责管理大一学生的学习计划和学习任务。并对他们的学习情况定期进行考核。
接着在大二的暑假留校期间,继续扩充对Java、Android和其他知识的学习,提升自己的技术栈。并完成了个人第二个项目,我的贴吧。
便捷会议 是一款可以简化会议会议室管理的一套系统。他是企业根据一些现实问题提出的一个命题。整个大项目包括有四端,安卓客户端、web客户端、web管理端和门禁端(也就是安卓平板设备)。我完成了整个安卓客户端的开发和部分门禁端的开发。
功能上。我的APP有比较完整的用户系统,包括登录注册个人信息维护等,注册时通过人脸识别,将人脸数据存放至后端,用于门禁端扫脸识别进行会议签到。用户可以选择会议室,针对不同时段选择预订会议室。对于一场会议,用户可以动态添加成员,上传会议文件,预览会议文件,发布会议投票、编写会议笔记等。当有会议和会议投票需要参与时,会提前给客户发送通知。另外APP提供比较完整的数据可视化查询,用户可以根据不同的条件,查询自己的出勤,各种会议信息。以图表的形式直观反馈给客户。对于临时远程会议的需求,我们提供给用户视频会议,可以支持多用户进行视频通话。
技术上。整体UI基于导航栏+Fragment+ViewPager,网络请求使用Okhttp,使用了webSocket建立长连接。使用RecyclerView展示各种会议会议室信息。使用AsyncTask+Service实现会议文件断点下载。使用LeakCanary检测内存泄漏解决应用OOM的问题。使用Handler更新UI。修改了部分View的嵌套层次,减轻主线程压力,解决UI卡顿问题。另外,用户操作使用token验证保证操作安全。
我的贴吧 是一款贴吧类应用,功能上,用户可以在社区发送相应话题的帖子,帖子内容支持富文本编辑,可以插入图片文字超链接等等。其他用户可以对帖子进行点赞收藏评论。用户之间可以相互访问资料并关注对方。另外有一个热帖模块,根据一些条件,筛选出热度相对较高的帖子可供用户查看。
技术上,项目采用MVP架构,使用ARouter进行组件化开发。利用SpannableString+各种Span+HTML实现富文本编辑和查看。对于热帖模块,手动实现插件化,动态加载APK。