拿到腾讯Android面试offer,我是如何准备技术面试的!

176 阅读9分钟

腾讯的面试经历

腾讯的面试就是自己经历了腾讯的笔试,然后一面,二面,三面,最后HR面,然后等消息,最后得到offer。笔试的话基本上就是一些基础知识,像数据结构,计算机组成原理,操作系统,计算机网络这些。上课认真听听,笔试前刷一些题目问题还是不大的。

腾讯一面,主要就是聊一些基础,我是去面移动客户端,但是整个面试移动相关的问题很少,主要还是在围绕着一些基础再聊。如果你想拿到腾讯的 offer,我觉得基础是非常重要的。面试题的话,我觉得这个其实没什么可提的,因为这些题目都是不固定的,面试官主要还是在围绕着你的简历再跟你聊,你 的简历中写到你的APP中涉及过下载,那么网络必问,问什么?我觉得TCP,HTTP都是值得问的。有一本书叫《程序员的自我修养》 我觉得这本书有时间还是很需要去读一下的。我见到过很多人吐槽说,我是去面iOS,面试我的竟然是一个Android的,从我个人的角度来看,无论是 iOS,还是Android在很多的设计思想上面还是有很多相通的地方的。说出你的想法就可以了。我个人觉得思想还是很重要的。

一面面试题分享:

1.mvp mvvm区别 mvvm中的databinding如何刷新view的 2.跨进程通信方式,binder机制 3.leakcanary原理 4.内存优化和工具,APK瘦身 5.get和post的区别,浏览器中输入一个地址然后展示出页面这个过程中做了哪些操作 6.断点续传和下载的原理 7.glide缓存原理,lru算法 8.动态代理原理

腾讯二面给我最大的印象就是面试官说的一句话,挑一个你觉得可以的项目,然后我们聊一些东西。从这句话我感觉很多人都能够感觉出来,二面主要还是聊 你的,一定给有一个项目才行。并且好好去准备这个东西。同样没有什么具体的问题,每个人的项目都不一样,实现方案也不可能完全一样。所以聊的东西也就不可 能完全一样。二面什么太多的经验,主要还是认真的去准备一个项目。

二面面试题分享:

1.java虚拟机 2.内存优化 3.arraylist hashmap linkedhashmap 4.binder 5.surfaceView和view 6.AMS WMS 7.APK瘦身 8.锁(死锁的场景和解决方案) 9.算法 两个字符串 比较最大的公共字符串 ,主要是思路 (面对问题,以大化小)

三面面试题分享:

1.http优化 okhttp多路复用 2.硬币兑换问题 [算法] 3.车的通过问题,一条路上,30分钟内看到有车通过的概率是90%,那么5分钟之内概率是多少 4.图的展现形式 5.全球货币转换功能的代码 6.给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度

面试前的准备

这是我最想跟大家聊的东西,因为关于面试前的准备,或者是准备什么还是很有必要重点分享下的。

很多人面试的时候不知道说什么,同样很多人都说要引领着面试官,不要被面试官引领。但是该怎么做呢?难道我们不让面试官说话?我们给面试官规定题目?这都是不现实的,对吧?但是通过一些准备,还是可以实现让我们去给面试官”规定题目”的,怎么做?举一些简单的例子

例如:你的简历当中写到自己对Socket有一些了解,那么很自然的就会聊到TCP,你提前好好准备下,你自己都是可以预知的,当面试官问听到你 Socket的时候,自然就会走到TCP上。如何准备?很多人上网上查了一些,TCP很经典的就是连接的三次握手,断开时的四次挥手。你也简单的查了一下 三次握手什么样,四次挥手什么样,但是这仅仅就够了吗?我们为什么不在往更深层去准备下呢?例如连接为什么是三次,断开为什么是四次?连接如果两次会发生 什么?三次握手中总共发送了三个包,那么仅仅就是做了三个作用吗?更往深处可能会涉及到TCP的头部结构,以及TCP连接,断开时SYN,FIN,ACK 的有效值设置又是什么样的?我相信你把这些都说出来肯定是会被加分的。当然你想很好的说出来不是说你面试前查查就可以了,肯定是需要去好好的去理解的。这也就是我说的面试前的准备,不要为了面试而面试,而是要为了面试而去学习,提升自己。

我可以再举个简单的例子,关于图片缓存这个东西,在iOS,Android中有很多动态的图片缓存解决方案。你的简中如果写到做过相关的操作,我觉 得这个东西还是很值得去问的。明知道会被问,面试前肯定要好好准备下啊。准备的过程当中我觉得需要总结出自己的方案中优点有哪些,缺点有哪些,针对你的缺 点你准备怎么做,或者说你可以针对你知道的一些知名的开源库是如何解决的,你有什么可以借鉴的,这样我感觉你肯定是要被加分的,最起码你是阅读过开源库, 并且认真的去思考过。

我就见过有人被问到如何做图片缓存的时候,他就简单的说了一句通过URL下载图片然后保存起来,以便利用。这个话题当中有很多东西都是可以去值得聊 的,就说这么一句话,我觉得面试官不可能得到他想要的答案,他没有得到答案,肯定是要去接着问你的。这个时候你就会显着的很被动,接下来就是要被面试官引 领着走了。有人会问有什么可以聊的?

我举一些简单的例子,例如图片的缓存方案肯定是要涉及到图片的下载问题,既然是下载,那么下载进度信息的回调你怎么做的?下载失败怎么办?下载完成 的回调怎么做的?下载肯定涉及到多线程的下载,那么这些线程你是如果管理的?线程管理器的结构又是什么样的?甚至是一个URL下载连接正在被下载,另一个 地方发起了一个相同URL的下载,这种情况我认为为了节省资源不应该在新开一个线程去下载,那么这种情况你有做处理吗?如何做的?其实有很多值得考虑的问 题和值得去说的。做缓存,你做的是磁盘缓存啊?还是内存缓存?还是两者都有?是否支持磁盘空间大小的设置,图片有效期的设置如何做的,图片的清理工作,我 相信无论在iOS还是Android那些知名的开源库不可能就是简单的有一个清理方案,肯定是支持部分清理,或者全部清理,部分清理的依据又是什么?例如 依据图片的有效期来做清理,过了我们设定的有效期,这个时候我们就需要去清理掉这部分内容。另外如果如果所有缓存文件的总大小超过这一大小,则会按照文件 最后修改时间的逆序,以每次一半的递归来移除那些过早的文件,直到缓存的实际大小小于我们设置的最大使用空间。这些东西都是有很多值得去说的,当然你只要 去感悟的越深,理解的越深,就会体会的越深,表达的就会越好。

刚刚提到的东西我觉得聊个20分钟还是很容易的,因为这个里面存在的东西和值得注意的地方太多了。准备好一个项目,找出你项目中的一个亮点,然后认真的去总结, 并且看一些别人的方案,看看有哪些你没有的,你没有的就是你方案的缺陷,看看该怎么解决。我觉得,缺陷还是很重要的,没有什么很完美的解决方案,方案好也 仅仅是针对满足了现在的所有业务需求而谈的。针对你的业务需求,谈出你的设计理念。项目不用多,认真的去总结一个就可以了。关键是很多人做了很多项目,但是却没有认真的去体会总结一个,做了也是白做,仅仅是代码熟练度增加了而已。

后话

不要为了面试而面试,要为了提高而学习,提高了自然也就能从容的面对知名公司的面试了。

就先写到这,码字不易,写的很片面不好之处敬请指出,如果觉得有参考价值的朋友也可以关注一下我

我的【Github】会分享一些关于Android进阶方面的知识,也会分享一下最新的面试题~

如果你熟练掌握【Github】中列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包——————可以我的【Github】阅读下载,最后觉得有帮助、有需要的朋友可以点个赞