题外话

最近准备离职,换个环境。发觉Java相关的面试知识,我确实准备不充分,lz研究生期间是做iOS的,进入某厂后转入Android。这次正式以Android的开发者进入面试,哎,发觉一大堆坑。其实面试主要进行了如下方面:

  1. Android相关知识
  2. java基础知识
  3. 开发者的基础知识 数据结构与算法、操作系统(这一面没有涉及)等

面试相关技术准备

由于我简历上还有iOS相关的经验,还写了个熟悉c/c++,于是复习内容如下:

  1. 程序员面试笔试宝典
  2. 剑指offer
  3. 找的网上java相关的面试题目
  4. 看java源码: 这里准备有些不足,细节上很多答不上来。

如:ArrayList扩容和缩容,HashMap(jdk 1.8 后这里使用红黑树优化也较难), HashSet等面试前稍微看了下LinkedHashMap源码,其实这里很多面试问题。这里还有一个比较难的源码,红黑树实现的TreeMap,TreeSet

并发容器(这里没怎么准备): CopyOnWriteArrayList、LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue。 以上源码很多是需要分版本的。

  1. 并发多线程的一些操作。
  2. Android源码:只准备了几个项目相关的,如okHttp、Volley、EventBus、Butterknife等还有几个图片库。其实还准备了下装逼的 retrofit+ rxjava但底层很多不是很明白,果断在面试中不提。

java 语法知识:主要集中在集合和多线程

先说一个题外话,恩,还算幸运,居然没有涉及到垃圾回收机制和JVM类加载等。以下是一面电话面试内容。

  • ArrayList 扩容
  • ArrayList和LinkedList 区别
  • ArrayList 删除元素是否有缩容策略,当时猜的是有,因为忘记了对应的源代码
  • 如果是你,怎么设计ArrayList 删除时,缩容策略
  • 用过HashMap么? LinkedHashMap 和HashMap区别?(这个答得不好)
  • LinkedHashMap里面有按照顺序存储数据,如果是你怎么设计?(LRUChache的基本上就是采用的这个)
  • volatile关键字含义? 如果每个线程都存有共享数据的副本,是否会浪费空间。(JVM的内存模型实质)
  • 设计一种多线程的数组满足读多写少的情况。会哪些存在的线程并发问题。(CopyOnWriteArrayList)

Android的知识

  • Activity 的lanchMode 和FLAG标签
  • Service中 bindSerice和 startService 区别
  • 事件拦截和传递机制
  • Textiew怎么添加图片
  • TextView加载很多文字的时候,加载较慢,如何优化
  • 强引用,弱引用,软引用的区别等

数据结构

  • 链表的是否相交 当时提供了几种解法,然后自己给自己挖坑了
  • 如何判断交点

面试时都考察哪些

一、简历是否真实

这其实是面试第一要务,面试的过程其实就是看简历是否属实的过程,因为能到面试环节,说明这个人是符合要求的,不满足要求的早就被剔除了,如果他真的如简历描述的那样,100%会招过来,如果人人都如此,那就不需要有面试这种过程了。

需要注意的是这里的真实有三层含义:

  • 如实描述自身经历,很多人只在一些大项目里做一个很小的螺丝钉,但简历里往往夸张这段经历。
  • 不知道自己不知道,常见于简历里各种“精通”开头的描述,因为知识体系与视野的局限,明明只是了解很浅却夸口精通,很多时候他并不认为自己说的有问题,而是真的以为自己已然精通,有点井底之蛙的感觉。
  • 简历里的真实要与你的期望相匹配,一门技术了解到怎样的程度才算精通,很难有定论,所以这里的“真实" 只能是候选人与面试官标准之间的契合,这种有主观运气成分,也许面试官水平不够错误判断了你,也不用感到不爽,面试何尝不是种双向选择呢。

二、技术的深度

技术的深度一向是面时光最看重的部分,当今任何一个技术领域都非常宽广,一个人要同时掌握那么多知识并且都深入几乎不可能,那都需要拼学习效率与工作年限了。而你曾经做过的东西,正在做的东西,是绝对可以了解得更深入的,一个对技术有好奇心,有技术热情的人,都不会仅仅停留在这个东西挺好用,而是会忍不住去探究它背后的技术原理,即便不是亲自去看源码,也会花点时间了解别人整理过的经验,所以单凭考察技术上的深度,就可以考察-个人是否对技术有热情 ,是否有技术好奇心等等这些很多大牛认为的所谓“优秀程序员的特征”。

之前曾看到过一句话:“一个人对他所做的事情了解得越深,他就能做的越好”。放在这里再合适不过了。

三、技术的广度

深度是有了,还需要广度吗?我个人的理解是:深度是必要条件,广度是加分项。同样的有技术好奇心的优秀程序员,也不会满足于仅仅局限于自己的一亩三分地,工作之余,也会想要尝试一些其它的领域和方向,因为投入问题也许不够深入,但很多领域知识你知道与不知道,对你个人知识体系的形成关系很大。

比如你要实现一个功能, 在你当前熟悉的技术领域上很困难或者效果不佳,在你就要放弃时你的同事告诉你,这用一个简单Sqi语句就可以实现啦,为什么要搞得那么麻烦?这个例子虽然举得很蹩脚,但是我想意思大家应该已经明白了。知识越有厂度,头脑里的技术体系就越备,同样的问题,你就可以想到N个解,思考一下就得出最优解了 。

如果你听都没听过一些东西,就会经常说出“这个好难搞啊”、"这根本就不可能”其实有的时候真是知识的局限问题,所谓的从0到1难,也是这个意思。

四、逻辑思维能力

这也是一些面试官比较看重的一点,这里并不是指那些臭名昭彰的脑经急转弯问题,而是通过交流观察,判断一个人表达观点逻辑是否清晰,回答问题是否有章法,这个很难描述,但如果你细心观察,你会发现很容易通过一些简单的交流,就可以看出一一个人是否逻辑清晰。

有时候你会觉得某个人表达沟通很不错,其实不是沟通的问题,是他说出去的话,经过了他大脑的条理清晰的整理,让你很容易就能明白。这种习惯不是一朝一夕就能养成的,所以面试过程中这点装不出来。

另外一个人如果逻辑清晰,而且反应又敏捷,语速很快,那是大大的加分项,恭喜你,距离offer不远了。

面试前系统复习的重要性

我也已经做了好几年开发了,还记得刚出来工作的时候觉得自己很牛逼,现在回想起来也蛮好笑的。懂的越多的时候你才会发现懂的越少。因为如果你的知识是一个圆,当你的圆越大时,圆外面的世界也就越大。

工作将近8年,似乎一直都在救火式的学习。遇到问题,才着急忙慌的上网查,边学边用,这种方式诚然是100%学以致用的,但是这种头痛医头脚痛医脚的方式并不会对自己日后解决新问题有多少助益。

面试新工作时我们难道可以以此作为核心竞争力吗?

福尔摩斯的神探能力也许是通过破解一件件错综复杂的案件获得的,但是促使她破案的绝不仅仅是对犯罪现场的敏锐观察,他的推理很大程度上取决于他对某些领域的系统知识的掌握以及独到见解。处理问题的能力很重要,但是这个能力需要有专业及系统化的理论知识作为支撑。

不管是往深了学,还是横向扩展知识的广度,重要的是得找到那个圆心,然后以或大或小的半径去打磨围绕这个圆心的各种技能。这样,找工作时才能底气十足,才能有望在某一个领域成为专家。

面试需要具备哪些技能?

  1. Java基本功,这个是必备知识。如果说面试到时很少用,并不代表后面项目不会用到。而且,如果基本知识都掌握不好,说明还有很多提高的空间。
  2. Android基本知识也是要的。如果连android基本知识都理解不深刻,那我估计想开发出一款好的软件也没那么容易。
  3. 面试的问题不常用或是比较难的,其实,说明面试官想对你做深层次地考核,答得上来是加分项。
  4. 面试官也很忙的,面试题大多也是网上找到。
  5. 有时候,需要的并不是标准的答案,而是看你的学习能力、知识广度、分析问题的思路、解决问题的技巧等等,这个才是面试官关心的。

面试复习路线参考

  • Android学习路线图

首先,对于没有学习方向,知识不体系的人,我把我工作几年整理的学习路线分享给大家,做一个借鉴作用,还不知道怎么学习的人可以直接照着我这个学习路线一个个的去学习,知识不体系的人可以参考下我整理路线的方式,总之希望能够帮到你们!

  • 模块化学习资源

接下来是每个模块我整理出来的文档学习资料,帮助大家更细致化的学习。

《Android汇总复习资料—Java》

《Android汇总复习资料—Android》

《Android汇总复习资料—Android扩展》

《Android汇总复习资料—Kotlin》

《Android汇总复习资料—Flutter》

《Android汇总复习资料—算法》

除了上面的学习路线,还可以额外的配合以下方式系统学习,效果翻倍~

1.用心刷题,加深印象

可以说每一个位程序员在面试前夕都会以刷题来记住面试考点,但是这些都是有重复性的。一味的刷题只能称之为低效复习;

因为题是死的,面试官是活的,面试官会根据你的开发经验而随机改动面试题;而我们刷题是为了梳理出自己的技术栈,理出面试题背后的原理和逻辑,并加深印象。所以说,死刷题带来的效率并不大,重要的是理解出面试题背后所涵盖的原理。

建议:面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,Android技术栈的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

2.看视频进行系统学习

业务写多了,日常的工作流程也就形成了。大概率的程序员在工作几年以后就会忘记最基础的知识点,导致技术栈非常零散,这对我们的技术提升是非常不好的,我们做到的是要以点连线,覆盖成面。

所以,关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,有深入的也有基础的。

但是,唯一的缺点就是免费的容易过时。

这里我自己也珍藏了好几套视频,有需要的我也可以分享给你。

3.读源码,看实战笔记,学习大神思路

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

主要内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等。

以上这些内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容。或者点击 【这里】 查看获取方式。

更多相关文章

  1. 寻找卓越的(Android)软件工程师,可解你燃眉之急
  2. [置顶] 随了Android的大流,站入Google阵营,持续更新中......
  3. 如何学习Android及如何利用android来赚钱
  4. Android(安卓)Okhttp 断点续传面试解析
  5. Android(安卓)setting中添加桌面循环滑动选项
  6. Android内核开发:在源码树中添加新的app应用
  7. android SDK 源码 -----建造这模式(生成器模式)
  8. Android学习记录(6)—将java中的多线程下载移植到Android中(即多线
  9. [置顶] Android学习记录(6)—将java中的多线程下载移植到Android中

随机推荐

  1. 安卓Android大量项目源码实例
  2. 【Fragment】 Android(安卓)Fragment生命
  3. MAC上使用maven打android的包,报错:No And
  4. 【翻译】(8-补丁1)Android接口定义语言(AI
  5. Android_布局属性大全
  6. 阅读《Android(安卓)从入门到精通》(31)—
  7. Android应用程序键盘(Keyboard)消息处理机
  8. FregServer进程,获取ServiceManager代理对
  9. Android(安卓)Studio查看错误信息
  10. 百度地图android开发资料