前言
现在已经6月了,2023年要过半了,最近在各大网络技术交流平台看到很多同学的工作情况内心还是蛮触动的(降薪、裁员、辞退等)。可能这并不是当下一个普遍的现象,但仍然使我感受到Android开发这碗青春饭不好混。于此同时联系我内推的同学很多都处于待业状态,能感受到他们内心的迷茫和焦灼。于是内心一直有声音督促我,赶紧写点面试相关的东西出来吧,哪怕对大家只有一丝丝的帮助。当然这次我会以面试官的角度出发(可能不是一个优秀的面试官),让大家更加了解面试注意事项、Android常见面试题等。接下来我会从以下两个模块来讲解:
- 面试注意点
- 常见面试题
面试注意点
01
代码能力
是研发面试考察的核心!
其实说句老实话,研发面试所考察的最核心的能力就是…代码能力!
代码能力是计算机专业的基础。能否在有限时间内写出清晰简洁、逻辑清晰的代码,不仅可以考察出候选人是否有扎实的基本功,也可以让面试官对候选人在未来是否能够胜任相应的岗位工作有一个基础判断。
面试两场之后我发现,有的候选人刚开始聊项目聊得非常开心,一些细节问题回答得都挺不错的,可一旦到了手写代码这一关,连二分查找都写不出来的大有人在。
平时写的代码多不多,面试之前有没有做过准备,有经验的面试官一眼就可以判断出来。所以这里给大家分享三点建议:
1、加强基本功,增加代码量
多看优秀的源代码,认真从效率、逻辑等方面分析他人如何简洁明晰地实现一个函数,这对提升自己的基本代码能力有很大的帮助。
2、面试前多做题,保持手感很重要
面试之前多做些练习,这不仅可以加快答题速度,也会让自己养成较为规范的答题习惯。
3、复盘笔试答案,思考更优解
最后,不少面试官喜欢在面试的时候复盘笔试题目,与候选人讨论题目的更优解,从而考察考生是否具备主动思考能力。
02
我们不反对刷题
不过更希望大家举一反三
在面试过程中,经常会有同学非常骄傲地坦白道:“我没有刷题。”
而在这里我想代表广大面试官表个态:我们不反对刷题,甚至希望同学们在大量做题之后,能够灵活运用、举一反三。
大量做题不仅可以在短时间内提高同学们的解题速度,也会在一定程度上帮助你拓展自己的答题思路。
当然,如果发现同学刷题,面试官也会变种问题,从侧面考察同学是否死记硬背答案。作为春招的面试官、你未来的潜在同事,我们更希望同学们能够灵活贯通。
所以说,该准备准备,该刷题刷题,临时抱佛脚至少体现了你对面试重视是不是?等你题目刷到一定程度,你就会发现自己的能力有了一个量变到质变的提升。
03
项目描述切忌花哨
突出项目重点,表述逻辑要清晰
参与面试的同学们最起码都有实习经历。在公司的大环境下,你会在实践中不断夯实代码基础,也会有更多机会接触到最新的技术。
我们希望大家对过往的实习经历做更深入的思考,不是简简单单描述你在哪里做了什么。毕竟面试官需要在短时间内看到你的个人能力。发挥主观能动性,多在几种不同方法之间做比较,给出在思考之后得出的最优解,会显得你格外与众不同。
除此之外,思考的逻辑性和表达能力也是面试时考察的重点。在面试时切记要简化答案,能表达清楚想法就好,项目描述时只需要简单介绍项目背景,并着重突出项目亮点就可以啦!千万不要过度包装,要知道坦诚清晰可是很重要的一点哦~
04
跨专业面试不会受到区别对待
技术实力最重要
面试官们常常会被问到:非计算机专业的同学跨专业面试会不会受到区别对待?
在这里我想强调:完全不会!
不同岗位对具体的专业能力要求不同,拿算法岗位举例,只要你代码基础功底过硬,数理能力够强,又对所面试岗位是发自内心的热爱,就算你是学挖掘机技术的,面试官们也是想给你发offer的。
算法行业的通用能力就是代码硬实力。如果不具备这种能力,在实际工作中就总会感觉不自信,受人制肘。所以非科班出身的同学们不用受自己的专业所限,但一定要多多锻炼,努力提升自己。
不过这里也想真心地提醒大家几句,千万不要盲从跟风选择自己的职业方向,每个领域都有自己广阔的发展空间,适合自己的才是最好的。越热门的岗位对基础的要求越高,面试官在面试的时候是看得到笔试成绩的,所以还希望大家在面试过程中诚实一点,不懂装懂可是会减分的哦!
05
哪些行为一定是减分项?
除了上述几点,我还想多嘱咐几句:
虽然面试考察最多的是技术基础和代码能力,但是从心理学的角度分析,第一印象也是相当重要的啊喂!
为了这场面试,逗比的我收敛了表情包,穿上了帅气的格子衫,还把头发梳成了面试官的模样,你说你穿着拖鞋、脸都不洗就来面试是不是有点伤我心了。
如果同学们选择的是视频面试,希望大家在面试前做好充分的准备工作。面试开始之后,如果遇到候选人迟到、没有调试设备、网络不畅通、麦克风关掉、面试环境嘈杂等情况,面试官会给一定时间调试,但是面试体验会受到一定影响,心理上可能会减分的哦!
诚实守信是做人第一要务,也是公司用人的底线。你们要知道,即使是视频面试,面试官也是可以看到考生行为的!答应我,像类似「一边考试一边用ipad查答案」这种事情千万不要干好嘛!作为考官的我在摄像头另一边看到了也是很尴尬的…
常见面试题
一、Java相关方面
- 抽象类与接口的区别?
- 分别讲讲 final,static,synchronized关键字可以修饰什么,以及修饰后的作用?
- Java 中深拷贝与浅拷贝的区别?
- 什么是反射机制?反射机制的应用场景有哪些?
- 谈谈如何重写equals()方法?为什么还要重写hashCode()?
- 请说一下HashMap与HashTable的区别
- 谈一谈ArrayList的扩容机制?
- 请简述 LinkedHashMap 的工作原理和使用方式?
- Java 中使用多线程的方式有哪些?说一下线程的几种状态?
- 谈谈线程死锁,如何有效的避免线程死锁?
- 什么是线程池?如何创建一个线程池?
- 谈一谈JAVA垃圾回收机制?
- JVM、Dalvik、ART三者的原理和区别?
- JMM是什么?它存在哪些问题?该如何解决?
二、Android方面
- Activity 与 Fragment 之间常见的几种通信方式?
- 对于 Context,你了解多少?
- 谈一谈startService和bindService的区别,生命周期以及使用场景?
- 简单介绍下ContentProvider是如何实现数据共享的?
- 说下切换横竖屏时Activity的生命周期?
- 说说Activity加载的流程?
- HandlerThread 的使用场景和用法?
- 谈谈 Handler 机制和原理?
- 试从源码角度分析Handler的post和sendMessage方法的区别和应用场景?
- 谈谈Android的事件分发机制?
- 谈谈自定义View的流程?
- 谈谈你对Android性能优化方面的了解?
- 自定义 Handler 时如何有效地避免内存泄漏问题?
- 谈谈Android中内存优化的方式?
- 谈谈你是如何优化App启动过程的?
- 请回答一下Android进程间的通信方式?
- 请简要谈谈Android系统的架构组成?
- 请简述一下 Android 7.0 的新特性?
- 什么是冒泡排序?如何优化?
三、Kotlin方面
- 请简述一下什么是 Kotlin?它有哪些特性?
- Kotlin中实现单例的几种常见方式?
- 在Kotlin中,什么是内联函数?有什么作用?
- 请谈谈Kotlin中的Coroutines,它与线程有什么区别?有哪些优点?
- 说说Kotlin中的Any与Java中的Object 有何异同?
- Kotlin中的数据类型有隐式转换吗?为什么?
- Kotlin中集合遍历有哪几种方式
四、音视频方面
- 怎么做到直播秒开优化?
- 数字图像滤波有哪些方法?
- 图像可以提取的特征有哪些?
- FFMPEG:图片如何合成视频
- 常见的音视频格式有哪些?
- 请叙述MPEG视频基本码流结构?
- 说一说ffffmpeg的数据结构?
- 如何降低延迟?如何保证流畅性?如何解决卡顿?解决网络抖动?
- 平时说的软解和硬解,具体是什么?
五、Flutter方面
- Dart 语言的特性?
- Dart 多任务如何并行的?
- dart是值传递还是引用传递?
- Flutter 特性有哪些?
- Widget 和 element 和 RenderObject 之间的关系?
- 使用mixins的条件是什么?
- Stream 两种订阅模式?
- Flutter中的Widget、State、Context 的核心概念?是为了解决什么问题?
- 说一下Hot Reload,Hot Restart,热更新三者的区别和原理
- Flutter 如何与 Android iOS 通信?
- 说一下什么是状态管理,为什么需要它?
六、算法方面
- 如何运⽤⼆分查找算法
- 如何去除有序数组的重复元素
- 如何在无线序列中随机抽取元素
- 如何判定括号合法性
- 如何寻找缺失和重复的元素
七、Android Framework方面
- 你了解Android系统启动流程吗?
- 1.2system_server 为什么要在 Zygote 中启动,而不是由 init 直接启动呢?
- 1.5 Zygote 为什么不采用 Binder 机制进行 IPC 通信?
- Binder有什么优势
- Binder是如何做到一次拷贝的
- MMAP的内存映射原理了解吗?
- 说说四大组件的通信机制
- 简述下 Handler 机制的总体原理?
- Handler 或者说 Looper 如何切换线程?
- Handler、Mesage 和 Runnable 的关系如何理解?
- Handler 为什么可能导致内存泄露?如何避免?
- Handler在系统当中的应用
- ActivityManagerService是什么?什么时候初始化的?有什么作用?
- Instrumentation是什么?和ActivityThread是什么关系?
- ActivityManagerService和zygote进程通信是如何实现的。
最后
对于程序员来说,要学习的知识内容、技术有太多太多,想要不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!!!
多余的话就不讲了,接下来将分享面试的一个复习路线,如果你也在准备面试但是不知道怎么高效复习,可以参考一下我的复习路线,有任何问题也欢迎一起互相交流,加油吧!
内容涵盖:Java方面、Android方面、音视频、Flutter、算法、Android Framework、企业常见174道面试题等等…共1700+页 质量非常高!!!
同时还给各位分享一份详细的Android学习路线图以及学习资料
首先是详细的不能再详细学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
接下来就是需要梳理知识,提升储备了!(Android八大模块进阶资料)
-
架构师筑基必备技能:深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO
-
Android高级UI与FrameWork源码:高级UI晋升+Framework内核解析+Android组件内核+数据持久化
-
360°全方面性能调优:设计思想与代码质量优化+程序性能优化+开发效率优化
-
解读开源框架设计思想:热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack
-
NDK模块开发:NDK基础知识体系+底层图片处理+音视频开发
-
微信小程序:小程序介绍+UI开发+API操作+微信对接
-
Flutter:Flutter入门+Flutter进阶
-
Kotlin: Kotlin入门教程 +Kotlin 实战避坑指南 +项目实战《Kotlin Jetpack 实战》
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。
然后再是通过源码来系统性地学习
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
以上资料均已整理打包成PDF文档,有需要的朋友,扫描下方二维码就可以领取了~
![](https://hnxx.oss-cn-shanghai.aliyuncs.com/official/1680501954752.png?t=0.20407428440613717)
同时这里还搭建了一个基于chatGPT的微信群聊机器人,24小时为大家解答疑难技术问题。
微信扫码拉你进群体验ChatGPT风采
最后
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到高级架构师,每个阶段都需要掌握不一样的能力。早早的确定自己的职业方向,才能在工作和能力提升中甩开同龄人。