背景
这阵子,各大网络社交平台,刷到最多的就是面试求职相关的信息。这位网友在脉脉职言求助。本科毕业三年了,一直做安卓开发,请问跳槽找工作要怎么准备呢?
写代码三年月薪不到一万是不是很失败?
近日,还有程序员就因为这个问题在某职场社交软件上,被认证了的百度京东员工一顿嘲讽。
找工作不可避免的要涉及到面试,但是对于多数程序员来说,解决各种bug信手拈来,满足各种需求不在话下,面试的沟通介绍,还有最后的薪酬问题简直是比写代码痛苦百倍的事。这就造成入职同样level的公司,有人年薪几十万,有的人用白菜价就把自己卖了。
你如何看待面试?
任何企业招聘重要岗位时都不会只安排一个候选人面试,通常都是两到三个甚至更多,最终来优中选优综合评估,筛选出与企业所需岗位能力素质要求最接近的人,所以对求职者来说面试是一场比拼,一个竞争的舞台,比的是素质、经验、能力,也是思维方式,以及对岗位的认知度,拼的是耐性,临场发挥,对企业的认同感,比拼的奖品就是录用通知书,所以说应聘者以什么心态,怎样的精神面貌来对待面试这个过程,决定了你在面试时的结果。
并且我觉得面试本身并不能完全评价一个人的实力。面试通过的人,也许只是恰好在面试时遇到了自己熟悉的问题,面试不通过,也有可能是面试官自身的问题,并非每个面试官都具备客观评价别人的能力。
换句话说,面试没通过也许是面试官没有发现你的才华,面试通过了也并不代表你就能胜任工作,因为进入企业之后可不是每天负责回答面试题!
网上关于面试最多的是什么?就是面经,他有些介绍了一些“装逼”的方法,还有所谓的“面试技巧”,我本人的话是不太认可的。技巧需要有,这是为了让你更好的展示自己,而非坑蒙拐骗。我更想展现一个真实的自己,如果面试官不认可,说明我们没有缘分,或者说自己的能力还不够。
你为面试准备了些什么?
就算你觉得你所有的东西都准备好了,但也不是你拿着简历奔赴各个面试你就有机会
如果你为自己做了份详细的职业生涯规划,那你也应该为自己做一份详细的时间管理计划表。好的面试一定不是拿着简历跑出来的。
资历深的HR可以清楚的看出优秀和普通面试者的区别,当然了他们可能也会问这样的问题,“你觉得哪首歌最能体现你的职业道德?”“EXCEL有多少种算法公式?”“你洗澡的时候都在想什么”当然,这些问题也都是真实存在的。但是面试的重点一定不是寻找和你喜好相同,品味一致的人。
面试需要准备些什么,在这里我就不给予评价了,各大面经里面都有,大家去看看就好了的。但是大家在刷面试题的时候一定要注意,不要仅仅是去背答案,浅步的了解会让提高你面试的成功率。
总之,面试的本质一定不是一问一答,如果你还想要让自己在面试过程中魅力十足,那就带一份工作计划过去,这不仅是展现你的诚意,更让HR看到的是你的工作思路和专业实力。
面试准备
8月来了,也是面试准备和冲刺的高峰期了,马上就到跳槽的黄金时期,不知道准备跳槽的朋友们准备好接受面试官的考验了吗?如果没有,你还在为寻遍万千无一无所获而烦恼吗?今天的分享虽不能为大家找工作打包票,但是却能让大家在准备面试的时候事半功倍,不用再浪费时间找面试题搜索答案了,你想要的我都有。
本篇文章也包含 Java 的基础知识和 Kotlin 语法知识,具体如下:
- Java 语法必备
- Kotlin 基础知识
- Android 应用开发相关面试题解析
- Android 音视频开发面试题解析
- Android 底层开发面试题解析
- Android 向开发面试题解析
Java 基础
- 简要说说常见编码和字节占用数
- String、StringBuffer 与 StringBuilder 的区别
- HashMap 和 Hashtable 有什么区别?
- ArrayList 和 LinkedList 有什么区别?
- 什么是自动装箱拆箱
- Object 有哪些公用方法?
- Java 的四种引用,强弱软虚,用到的场景。
- 抽象类与接口的区别
- 匿名内部类使用的参数为什么要是 final 的
- Java 中实现多态的机制是什么?
- 线程 sleep 和 wait 有什么区别
- 闭包和局部内部类的区别
- 进程和线程的区别
- 序列化有哪些方式
- Serializable 和 Parcelable 的区别
- 静态属性和静态方法是否可以被继承?是否可以被重写?
- 成员内部类、静态内部类、局部内部类和匿名内部类的理解
- 说说你对 Java 反射的理解
- 说说你对 Java 注解的理解
- Java 虚拟机的工作原理
- Java 虚拟机和 Dalvik 虚拟机的区别
- 哪些情况下的对象会被垃圾回收机制处理掉?
- 并发集合了解哪些?
- 集合类以及集合框架
- 容器类介绍以及之间的区别
- List 和 Map 的实现方式以及存储方式
- HashMap 的实现原理
- HashMap 源码理解
- HashMap 几种遍历方式的实现
- HashSet 与 HashMap 怎么判断集合元素重复
- 数组和链表的区别
- 堆和树的区别
- 堆和栈在内存中的区别是什么
- 什么是深拷贝和浅拷贝
- 手写链表逆序代码
- 在 Java 中,什么时候用重载,什么时候用重写?
- 使用工厂模式最主要的好处是什么?
- 说一下泛型原理,并举例说明
- 泛型中 extends 和 super 的区别
- 什么是泛型中的限定通配符和非限定通配符
- HTTP 响应的结构是怎么样的?
- HTTP 和 HTTPS 的区别
- 开启线程的三种方式?
- 谈谈你对多线程同步机制的理解?
- 如何控制某个方法允许并发访问线程的个数?
- 什么导致线程阻塞?
- 谈谈对 Synchronized 关键字,类锁,方法锁,重入锁的理解
- 谈谈 volatile 关键字的作用
- Synchronized 和 volatile 关键字的区别
- Synchronized 与 Lock 的区别
- 死锁的四个必要条件?
- 怎么避免死锁?
- 什么是线程池,如何使用?
- 多线程断点续传原理
Kotlin 面试题
- 你有使用过 Kotlin 来开发 Android 应用吗?说说 Kotlin 和 Java 有什么区别?
- Kotlin 如何与 Java 混编
- 协程
- 说一下 Kotlin 的伴生对象(关键字 companion 使用要说出来)
- Kotlin 的高阶函数使用过吗
- 当你项目中同时使用 Kotlin 和 Java ,你是如何保证空指针问题的?
- Kotlin 是否向后兼容?
- Kotlin 是否支持宏?
- Kotlin 类的默认类型是什么?
- Kotlin 内联函数的使用
Android 应用开发
生命周期
- 说说 Activity 的生命周期
- 说说 Fragment 生命周期?
- 说说 Service 生命周期?
- 下拉状态栏是不是影响 activity 的生命周期,如果在 onStop 的时候做了网络请求,onResume 的时候怎么恢复
- Activity 上有 Dialog 的时候按 home 键时的生命周期
- 横竖屏切换的时候,AVctivity 各种情况下的生命周期
View/UI 相关
- 简单概述 View 的绘制流程
- View,ViewGroup 事件分发
- 概述 Android UI 适配方案
- 理解 Activity,View,Window 三者关系
- View 滑动冲突怎么解决
- View 渲染流程
其他
- 动态权限适配方案,权限组的概念
- 网络请求缓存处理,okhttp 如何处理网络缓存的
- bitmap 如何处理大图,如一张 30M 的大图,如何预防 OOM
- 进程保活,如何实现常驻进程
- LRUCache 原理
- Handler 机制
- App 是如何沙箱化,为什么要这么做
- handler 发消息给子线程,looper 怎么启动
- 怎么启动 service,service 和 activity 怎么进行数据交互
- 四种 LaunchMode 及其使用场景
- Android 中的几种动画有哪些
- Android 中跨进程通讯的几种方式
- Binde 机制简单理解
- 热修复的原理
- Android 内存泄露及管理
- Fragment 与 Fragment、Activity 通信的方式
- 概述 Android 优化方案
- 内存泄漏与内存溢出区别
- MVP,MVC,MVVM 的优劣
- Universal-ImageLoader,Picasso,Fresco,Glide 对比
- Xutils, OKhttp, Volley, Retrofit 对比
- 跨进程通信的几种方式
- 简述 TCP,UDP,Socket
- 进程和线程的区别
- 内存泄露如何查看和解决
- RecyclerView 的拖拽怎么实现的?
- RcyclerView 嵌套卡顿解决如何解决
- Dgger2 框架的了解
- SharedPreference 跨进程使用会怎么样?如何保证跨进程使用安全?
- Android 的数据存储方式--持久化技术
- Android 数据解析的几种方式及优劣
- Fragment 的生命周期
- Fragment 的切换方式
- 消息推送原理以及实现过程
- Alipay 的支付流程?
- 加密解密技术
- 图片的三级缓存
- AIDL 的使用
- 常用的 git 命令
- git 冲突的产生原因以及解决?
- 如何避免冲突?
- 广播(动态注册和静态注册区别,有序广播和标准广播)
- Android 中哪里使用了观察者模式
- Android 系统为什么会设计 ContentProvider,进程共享和线程安全问题
- RxJava 的功能与原理实现
- sqlite 升级,增加字段的语句
- 强引用置为 null,会不会被回收?
- glide 使用什么缓存?
- AndroidManifest 的作用与理解
- 如何计算一个 view 的嵌套层级
- EventBus 实现原理
- Application 和 Activity 的 context 对象的区别
- ViewPager 使用细节,如何设置成每次只初始化当前的 Fragment,其他的不初始化
- 如何实现 Fragment 的滑动
- 差值器&估值器
- 介绍下 SurfView
- 概述 Android 事件分发机制
- 如何进行 Android 电量优化
- Activity 栈相关
- 封装 view 的时候怎么知道 view 的大小
- App 启动崩溃异常捕捉
- 手写生产者/消费者模式
- Activity 之间的通信方式
- Activity 与 Service 通信的方式
- Oom 是否可以 try catch ?
- 在任何地方 new handler 都是什么线程下
- 如何保证多线程读写文件的安全?
- Glide 内存缓存如何控制大小?
- 简要概述 Android 垃圾收集器
- String 为什么要设计成不可变的?
- 线程如何关闭,以及如何防止线程的内存泄漏
- Android 线程有没有上限?
- Glide 加载一个一兆的图片(100x100),是否会压缩后再加载,放到一个200x200的 view 上会怎样,1000x1000呢,图片会很模糊,怎么处理?
- Socket 建立网络连接的步骤
- 如何使用 OkHttp 进行异步网络请求,并根据请求结果刷新 UI
- 可否介绍一下 OkHttp 的整个异步请求流程
- OkHttp 对于网络请求都有哪些优化,如何实现的
- OkHttp 框架中都用到了哪些设计模式
音视频面试题
- 常用的编码格式有哪些
- 常用的封装格式有哪些
- 说说 YUV 与 RGB 格式的转换
- 传输语音的格式一般有哪些
- 列举一些音视频编码常用的实现方案
- 请叙述 MPEG 视频基本码流结构
- 请叙述 AMR 基本码流结构
- 预测编码的基本原理是什么
- 丢包恢复算法怎么实现的?丢包是由于网络不好导致的,还是确实丢包了,丢包率怎么反馈给发送端的?
- 回音消除的实现原理
- Opus,G.711 音频编解码的实现原理?OPus 的好处,最低带宽是多少?
- 音视频数据传输怎么判断延迟发生在哪个阶段?
- 带宽估计和带宽反馈是怎么做的?
- 为什么要有 YUV 这种数据出来?优点在哪?
- 为什么要用 FLV?
- 视频硬编码-压缩率关键参数设置
- 什么是大小端?网络通信中的大小端问题如何解决?
- TCP 和 UDP 的区别?UDP 如何实现可靠传输?
- 视频或者音频传输,你会选择 TCP 协议还是 UDP 协议?为什么?
- 如何实现服务器高并发?都有什么方式?你会选择什么方式?为什么?
- TCP、UDP 如何处理丢包问题?
- TCP如何实现可靠传输,讲一下超时重传?
- AsyncTask 内部维护了一个线程池,是串行还是并行,怎么维护的?
- Material Design 如何定义一个 Behavior
底层开发面试题
- Android sqlite3 是否支持并发访问?
- Android wap 访问方式。
- 介绍 Android IPC 机制
- ART、Dalvik 和 JVM 的关系及区别是什么?
- 例举一下 Android 系统级服务,在 App 层一般都用过哪些?如何实现一个自定义的系统级服务?
- 概述 Binder 机制。
- Launcher 的实现。
- 系统级 app 和第三方应用级 app 分别在什么目录下?一个第三方的 app 能否直接放到系统级 app 目录下而又能正常运行?
- 能不能单独编译一个系统级应用?
- JNI,共享库和静态库的区别和使用场景,JNI 中 C/C++ 和 Java 相互调用各自使用的机制是什么?
- 如何限制第三方应用安装?
逆向开发面试题
- Andorid 如何本地提权获得 root 权限
- 概述 Android 打包流程
- 概述 Android 反编译流程
- 概述 Android 流程
- 注入有哪几种方式?
- 空结构体多少个字节?
- 用const修饰一个函数有什么作用?
- Smali 是什么
- Smali 的数据类型和 Java 的对应关系
- 了解 Android 的加解密
- 了解反的技术
- 简要概述 so (破壳技术)
Android如何学习提高个人硬实力?
Android学习是一条漫长的道路,我们要学习的东西不仅仅只有表面的 技术,还要深入底层,弄明白下面的 原理,只有这样,我们才能够提高自己的竞争力,在当今这个竞争激烈的世界里立足。
现在竞争这么激烈,只有通过不断学习,提高自己,才能保持竞争力。
对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
对于一些不知道学习什么,没有一个系统路线的程序员,这里给大家提供一个大概的思路:
- Android学习路线图
首先,对于没有学习方向,知识不体系的人,我把我工作几年整理的学习路线分享给大家,做一个借鉴作用,还不知道怎么学习的人可以直接照着我这个学习路线一个个的去学习,知识不体系的人可以参考下我整理路线的方式,总之希望能够帮到你们!
- 模块化学习资源
接下来是每个模块我整理出来的文档学习资料,帮助大家更细致化的学习。
《Android汇总复习资料—Java》
《Android汇总复习资料—Android》
《Android汇总复习资料—Android扩展》
《Android汇总复习资料—Kotlin》
《Android汇总复习资料—Flutter》
《Android汇总复习资料—算法》
除了上面的学习路线,还可以额外的配合以下方式学习,效果翻倍~
①看视频进行系统学习
前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
另外,我自己也珍藏了好几套视频,有需要的我也可以分享给你。
②读源码,看实战笔记,学习大神思路
“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。
主要内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等。
③面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:
④2020大厂面试高频知识点
- 图片
- 网络和安全机制
- 数据库
- 插件化、模块化、组件化、热修复、增量更新、Gradle
- 架构设计和设计模式
- 性能优化
- Android Framework
- Android优秀三方库源码