一位开发多年的Android老司机以为深知熟路,撸完这份大厂警示面试,直呼好险差点犯了致命错误!

背景

寒冬季节里找工作真心累啊,不过没办法,公司要搬离上海,所以只能出来找工作了,这段时间被虐的够惨的,一个学历就被搞死了,同事工作经验跟我差不多,都是6年的老菜鸟,本科,投了10家面了两家,我投了几十家暂时才面了3家,差距,谁在跟我说学历不是问题,我一砖头拍不死他丫的。废话不多说了,总结了一下:

Android

首先Android这一块,个人建议除了一些基础知识上的正确理解之外,一定要看源码,至少要看Handler机制、AsyncTask以及两三个开源库的源码,有时间的话,可以对着下面的清单该看源码的一定要看,例如Glide、OkHttp等,这样你才不会被打上,只是一个会使用工具的人的标签,而是一个懂得工具原理的人,这会让你在面试中有一个很大的加分。

  • 什么是 ANR 如何避免它?(腾讯)
  • Activity 和 Fragment 生命周期有哪些?
  • 横竖屏切换时候 Activity 的生命周期
  • AsyncTask 的缺陷和问题,说说他的原理。
  • android 中进程的优先级?
  • Bunder 传递对象为什么需要序列化?Serialzable 和 Parcelable 的区别?
  • 动画
  • Context 相关
  • Android 各版本新特性
  • Json
  • Jar 和 Aar 的区别
  • Android 为每个应用程序分配的内存大小是多少
  • 更新 UI 方式
  • ContentProvider 使用方法
  • Merge、ViewStub 的作用
  • 四大组件的生命周期(美团)
  • Activity 之间的通信方式
  • 横竖屏切换的时候,Activity 各种情况下的生命周期
  • Activity 与 Fragment 之间生命周期比较
  • Activity 上有 Dialog 的时候按 Home 键时的生命周期
  • 两个 Activity 之间跳转时必然会执行的是哪几个方法?
  • Activity 的四种启动模式对比
  • Activity 状态保存于恢复
  • fragment 各种情况下的生命周期是如何管理的
  • 序列化的作用,以及 Android 两种序列化的区别
  • 谈谈对接口与回调的理解
  • Android 中数据存储方式
  • Android 属性动画特性
  • ART(字节跳动)
  • Apk 包体优化
  • Hook
  • Proguard
  • 架构
  • Jetpack
  • NDK 开发
  • 类加载器

Java(重点)

这里罗列的知识点,很多都是需要去真正消化理解,例如知道了保证线程安全的实现方式,那么也要会解决一些实际场景,比如手写一个生产者消费者模型,或者,一个线程打印奇数,一个线程打印偶数,交替打印,最终输出1,2,3,4…….等。所以不要死记硬背,理解性记忆也是最高效的一种方式。

  • HashMap 和 HashTable 以及 CurrentHashMap 的区别(腾讯)
  • synchronized 和 volatile 、ReentrantLock 、CAS 的区别
  • JVM 类加载机制、垃圾回收算法对比、Java 虚拟机结构等
  • Java 的四大引用
  • Java 的泛型,<? super T> 和 <? extends T> 的区别
  • Java 线程有哪些状态,有哪些锁,各种锁的区别
  • final 、finally、finalize 区别
  • 接口和抽象类的区别
  • sleep 、wait、yield 的区别,wait 的线程如何唤醒它?
  • java 中==和 equals 和 hashCode 的区别
  • 接口的意义
  • String、StringBuffer、StringBuilder 区别(美团)
  • 讲一下常见编码方式?
  • 进程和线程的区别
  • 序列化 Serializable 和 Parcelable 的区别
  • string 转换成 integer 的方式及原理
  • 静态代理和动态代理的区别,什么场景使用?
  • 说说你对 Java 反射的理解
  • 说一下泛型原理,并举例说明
  • 说说你对 Java 注解的理解
  • 数据类型(字节跳动)
  • 包装类型
  • 缓存池
  • 线程安全
  • Object 通用方法
  • 继承
  • 反射
  • 异常
  • 泛型
  • 注解
  • 容器中的设计模式
  • 迭代器模式
  • 源码分析
  • 线程状态转换
  • 实现 Runnable 接口和 Callable 接口的区别
  • 执行 execute() 方法和 submit() 方法的区别是什么呢?
  • 如何创建线程池
  • 介绍一下 Atomic 原子类
  • 讲讲 AtomicInteger 的使用

计算机网络

  • TCP 与 UDP 的区别(腾讯)
  • 三次握手、四次挥手。为啥是三次不是两次?
  • HTTPS 和 HTTP 的区别。HTTP 2.0,3.0?
  • 浏览器输入一个 URL,按下回车网络传输的流程?
  • TCP 建立连接后,发包频率是怎样的?
  • OKHttp
  • 如何验证证书的合法性?
  • https 中哪里用了对称加密,哪里用了非对称加密,对加 密法(如 RSA)等是否有了解?
  • client 如何确定自己发送的消息被 server 收到?
  • 谈谈你对 WebSocket 的理解
  • WebSocket 与 Socket 的区别
  • 谈谈你对安卓签名的理解
  • 请解释安卓为啥要加签名机制?

数据结构及算法

  • 排序(腾讯)
  • 二叉树
  • 链表
  • 栈 / 队列
  • 二分
  • 哈希表
  • 堆 / 优先队列
  • 二叉搜索树
  • 数组 / 双指针
  • 贪心
  • 字符串处理
  • 动态规划
  • 矩阵(字节跳动)
  • 二进制 / 位运算
  • 反转整数
  • LRU 缓存策略

面试总结一下

总结一下吧主要涉及的几块内容就是:

  • 四大组件
  • Handler
  • View的绘制
  • 事件分发机制
  • 滑动冲突
  • 滑动套嵌
  • 进程保活
  • 性能优化

关于基础知识如何准备

从上面一个拿到offer的流程来看,我们可以发现不管是笔试还是一面或者二面,都会涉及到基础知识的考察,所以在准备校招的过程中,最最最核心的就是要把基础知识打牢,具体包括,一门你最熟悉的语言,假设是Java,那么Java基础你肯定是要烂熟于心,包括

  • Java关键字的含义和作用
  • 接口和抽象类
  • 多态和继承
  • 装箱和拆箱
  • …..

具体有哪些我会在后面整理出来,当然只会基础,可能二面就比较难,所以还要进阶,对于Java,进阶包括

  • Java内存区域
  • Java内存模型
  • Java GC机制
  • 多线程安全
  • …..

这里只是举几个例子感受一下,那么我该如何来准备呢?答案:看书+实践+思考+总结

算法题如何准备

关于算法题如何准备,这个其实是最不好准备的,也是最容易准备的,算法题在整个拿offer的流程中处于一个特殊的地位,在笔试环节中,基本每个笔试题,最后都是两道算法题,如果不能AC一半以上,那么通过笔试的机率就比较小,如果能全部AC,当然更佳,除了笔试,在一面和二面中,一般都会以手撕两道算法题来结束面试,当然这两道手撕的算法题如果能直接给出最优解并写出完整的代码,那么即便你前面的基础和项目答的并不好,也是一个非常大的亮点,也可以让你这次面试通过的机率提升很多,所以算法题起着举足轻重的作用,在整个offer流程中。

那么如何准备呢?首先关于算法,我建议首先在学算法前,先由简至难,基础掌握之后,直接去LeetCode官网从mid难度开始刷题,等mid难度差不多后,再挑战hard难度,一般做客户端开发,如果能够刷上50道hard难度的题目,基本大部分面试的算法题都可以给出思路了,如果追求完美和保险,建议hard难度的题能刷多少是多少,多多益善。

项目如何准备

因为我自己是做安卓的,但是我想不管是哪个方向,关于简历上写的项目,面试官肯定都是会先让你挑一个最熟悉的来讲,那么问题来了,我该怎么将一个项目清晰的叙述给面试官呢,同时还要吸引面试官,让这个项目成为亮点?

关于这个问题,我们首先需要明确的是,我们在陈述任何一个问题的时候,逻辑一定要清晰,说话不要跳着说,那么怎么清晰的表达呢?分点+简洁的概括。怎么分点?比如有一个项目,我一般是分三点来讲述,一、这个项目实现的功能,二、你在项目中具体做了什么工作,三、取得的成效,然后就是简洁的概括出来,这个比较有难度,所以强烈建议,每个项目都按照这三点事先准备概括好,然后随着面试次数的增加,你就会形成肌肉记忆,之后,当面试官再让你介绍一个项目的时候,毫不夸张的说你会发现你可以不带脑子的回答这个问题。

hr面如何准备

一般技术面试到了hr面试,基本80%的可能就稳了,大部分hr面都是不会刷人的,当然一些极个别的公司除外,所以到了hr面,不用那么紧张,正常对话交流即可,我们先来看看一般hr面会问些什么问题,感受一下hr面的具体内容:

  • 给前两次面试打打分?为什么?
  • 对上班时间有要求吗?加班怎么看?
  • 你压力最大的是什么时候,怎么应对的?
  • 你未来的职业规划是什么?
  • ............

最最最最重要的简历上写的知识一定要会

这个之所以放到最后,是因为这个是最快速有效的短期速成准备方法,如果我们因为总总共原因,在时间上不允许像上面那样去系统的准备基础+项目+算法,那么我希望你至少做到简历上的写的知识能够经得起问,所以,简历上写的知识就一定要滚瓜烂熟,个人建议,尽量写自己熟悉的点,和尽量写有难度同时自己又有把握回答出来的点,如果实在是没时间,那么可以挑两到三个点,例如Java的话,Java GC机制,Java synchrnoized关键字(锁),不求多,但是要能做到经得起问,然后写在简历上,这两个点,花个2天应该能搞定,然后其它的就尽量写自己会的。

写完简历之后,一定要知道自己简历上涉及了哪些知识点,自己再将这些涉及到的知识点都总结归纳出来,例如,写了Java多线程,那么怎么保证多线程,多线程锁的类型,常见的生产者消费者模型手写,这些就必须要会,当然你也可以假设自己是个面试官,看到自己的这份简历,可能会怎么来考察自己,无非就是写了什么就尽量问什么,对吧,所以最保险的就是把简历上的知识点抽取出来,然后罗列一个知识点清单,再对着这个清单上的每个点去一个个总结归纳能考察的问题。

结语

总的来说,在这次面试中,让我深有体会的主要有两个点,一个是,早做准备比什么都重要,大部分秋招得意者都是从春招开始就持续准备,成功和机遇总是会眷顾有准备的人,运气在这中间固然会占有一些比重,但是仅凭运气,是远远不够的;第二个,在面试中,一个人有没有自信,完全可以判若两人,同时也会很大程度上影响最终结果,自信,真的是一种很优秀的品质,这种品质会让你整个人散发无穷的个人魅力

面试复习路线参考

目前我们要做的就是选好自己细分领域深入研究,对基础原理性内容深入理解,尽快向高级水平靠近并达到。当然也要了解新技术,拥有开放的心态去学习一些新技术,不要一开始出来一个新技术就转入学习,这样会导致啥都会一点啥都不会,当然新技术是有一个发展过程的,不会立马流行和大量应用等它稍微成熟点。

多余的话就不讲了,接下来将分享面试的一个复习路线,如果你也在准备面试但是不知道怎么高效复习,可以参考一下我的复习路线,有任何问题也欢迎一起互相交流,加油吧!

首先是超级详细得不能再详细的Android开发学习思维导图,因为图片实在是太大了,所以我就只把二级目录的内容放出来,更加详细的你们可以主页扫微信二维码获取

接下来就需要梳理知识,提升储备了!(Android移动架构师七大专题学习资源)

  • 架构师筑基必备技能:深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO

  • Android高级UI与FrameWork源码:高级UI晋升+Framework内核解析+Android组件内核+数据持久化

  • 360°全方面性能调优:设计思想与代码质量优化+程序性能优化+开发效率优化

  • 解读开源框架设计思想:热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack

  • NDK模块开发:NDK基础知识体系+底层图片处理+音视频开发

  • 微信小程序:小程序介绍+UI开发+API操作+微信对接

  • Hybrid 开发与Flutter:Html5项目实战+Flutter进阶

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。

然后再是通过源码来系统性地学习

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

刷大厂面试题备战,增加大厂通过率

历时半年,整理了这份市面上最全面的安卓面试题解析大全。

1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

以上内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容。或者关注主页扫描加 【微信】 获取。

最后还有耗时一年多整理的一系列Android学习资源:Android源码解析、Android第三方库源码笔记、Android进阶架构师七大专题学习、历年BAT面试题解析包、Android大佬学习笔记等等,这些内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章