热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android开发技巧!给Android程序员的一些面试建议

#Android开发面试的几部分**1、基础知识**基础知识包括几个部分:Java(JDK、JVM)、Android、数据结构和算法、计算机基础、设计模式,有的还会问Flutter

# Android开发面试的几部分
**1、基础知识**
基础知识包括几个部分:Java(JDK、JVM)、Android、数据结构和算法、计算机基础、设计模式,有的还会问Flutter。
![2020Android面经:教你增加拿到BAT等大厂offer几率( 面试技巧)](http://www.icode9.com/i/li/?n=2&i=images/20210711/1626013843552538.jpg)
**Java部分**:
不太推荐这部分只看博客,因为很多博客并不系统也不完整,推荐完整看一遍《深入理解Java虚拟机》这本书,基本上这里面涵盖了JVM相关的所有面试问题,包括内存分区、GC机制、内存模型、锁、字节码、类加载等。JDK的部分会杂一些,基本上可以归类为几种:容器(必问HashMap、CurrentHashMap、ArrayList等)、线程池(必问)、注解、同步工具、动态代理、notify/wait/sleep。这部分可以从一些JDK相关的文章中去整理一遍。
**Android部分:**
**这部分必问的是Handler机制、触摸事件传递、四大组件启动流程、View绘制流程、Binder机制、生命周期**。经典的问题比如:
* 触摸事件一定是先传递到Activity然后才传递给View的么?
* 如果要在Application的onCreate生命周期之前执行一些逻辑,可以放在哪里?
* draw、onDraw、dispatchDraw执行的顺序如何?
* View真正显示是在onResume之前还是之后?
* Activity中嵌套有一个Fragment,startActivity之后,Activity和Fragment的生命周期顺序是如何的?
**数据结构与算法:**
这部分在客户端开发中考察的比例会小一些,不过也有很多公司非常重视手写代码。经常碰到的问题有二叉树遍历、有序二维数组查找,排序等,基本上以《剑指offer》或者《编程之美》为准就可以了。
**计算机基础:**
这部分涵盖的比较杂,比如计算机网络(7层网络模型、Http和Https)、git工作流和命令、计算机缓存策略、UML、信息安全等等。
**设计模式:**
在自己的项目中一定要多总结和使用设计模式,面试官问你使用过什么设计模式的时候,如果能回答出比如状态模式、责任链、装饰等等,肯定会加分不少。如果只是回答单例和建造者模式,那就会逊色多了。这部分推荐看《研磨设计模式》。
**开源项目:**
这个也是必问的环节之一,建议从自己项目使用的开源项目入手,跟着代码,画一遍流程图和架构图,仔细体会这里面设计的优点和缺点。
比如OkHttp、LeakCanery等等,这些都可以。开源项目根据面试官的个人经验不同,问的深入程度也不一样,这时候就需要你个人的一些引导技巧,比如面试官可能不是很熟悉这个框架,这时候你能主动表达出这里面设计的一些细节,也能给面试官留下不错的印象。**切忌在简历上写只是用过但是没看过源码的框架。**
![2020Android面经:教你增加拿到BAT等大厂offer几率( 面试技巧)](http://www.icode9.com/i/li/?n=2&i=images/20210711/1626013843243567.jpg)

# 重点项目经历
小厂的项目往往追求业务快速迭代上线,相对比较能容忍一些技术难点,但是这些**技术难点往往是能体现一个人技术能力的**。所以你如果在小厂,就不能过分陷入到业务中,必须跳出来找一些有亮点的技术点,做好做精。这些技术点才是一个程序员安身立命的本钱,否则公司业务陷入困境了,你的价值也就不复存在了。在如何准备面试中项目这部分,小编有几点心得:
**分成三部分:**
1. 为什么要做这个点,
2. 考虑了什么因素并且是如何做的,
3. 取得了什么效果(比如启动速度从1000ms降到200ms,这种具体的数据)
可以把几个小点串起来,这样可以显得更系统和全面一些,比如代码优化和性能优化结合在一起讲。
小厂的一些优化点往往只能做性价比最高的一部分,这时候还可以讲一下业界还有哪些更优的方案
最好再准备一下“如果你没有离职项目中还有有什么不足和可以优化的地方?”(笔者面试中碰到过几次这样的问题)
**小厂跳大厂,技术基础可以准备得很充分,但是项目绝对是一个弱项。**大厂一个App可能就有几十上百人在做,小厂很多所谓的优化在大厂的面试官眼中可能都是他们很早就做过了,这时候项目本身做了哪些东西并不是太重要,需要着重体现你解决问题的思路以及你是一个有追求的程序员,至少你要能做到业界的平均水平,这样才能有机会通过面试。
# 技术以外的东西
大厂面试中技术以外的部分也是非常重要的一部分,这部分大多是一些软技能:
**自我驱动和追求**
这部分主要是在平时工作中的一些自我驱动学习和自主追求一些技术能力,而不仅仅是完成需求就可以了,这样才能体现出你个人的成长性和潜力。
**沟通和协作**
这部分会评估你未来在团队的融入程度以及跟团队跨团队协作和沟通的能力。比如你在工作中是否能正确看待和解决一些跨部门沟通的问题。
# 我的面经总结
主要分为四个方面:
**Android**
1. Android各个版本的特性(例如6.0,动态权限)
2. ANR的原因
3. Android中进程间通信的方式和对比
4. AsyncTask的实现原理及优缺点
5. Handler机制
6. 自定义view三部曲,流程(或者实际场景题,例如实现一个表盘,怎么做)
7. FrameWork层次结构
8. Activity生命周期(A跳转到B,A和B中生命周期的执行顺序)
9. Dvlik、ART、JVM三种虚拟机的区别
10. 能不能在非UI线程更新UI
11. Service和IntentService的区别
12. Thread和HandlerThread的区别
13. Touch事件分发机制
14. 怎么知道一个Activity是否发生了泄露
15. 从点击一个APP图标开始发生了什么
16. Activity启动流程(源码看一遍,能大致讲出来就行)
17. Activity启动模式(四种)
18. Intent启动Activity的方式
19. onStart和onResume的区别
20. LruCache以及实现原理
21. Android中的MVC、MVP、MVVM的区别和联系
22. Parcelable和Serializable的区别
23. Service生命周期
24. Service的启动方式及区别
25. Binder机制
26. onSaveInstanceState和onRestoreInstanceState的调用时机(需要理解,一般会出个场景让你判断)
27. onNewIntent的调用时机(同上)
28. Android中的性能优化和内存优化
29. RxJava说一下(常用操作符,背压,线程切换原理,实际应用)
30. RxAndroid说一下
31. EventBus原理
32. Volley原理
33. OkHttp原理
34. Retrofit原理
35. RxJava和Retrofit结合
36. Dagger2原理
37. 组件化介绍一下(为什么要有组件化,怎么解决合并冲突问题)
38. 快应用介绍一下
39. 屏幕适配的常用方法
40. Service、进程保活
41. Glide原理
42. AsyncTask原理
43. SurfaceView和普通View的区别
44. 依赖注入框架的实现原理
45. Git项目管理
46. 什么是三级缓存
**Java**
1. 常用的设计模式(掌握常见的大约10种就Ok)
2. ThreadLoal的作用及原理
3. 线程的实现方式和实现原理
4. 线程的状态,怎么创建线程,线程状态之间的转化(例如什么情况下线程会由运行变为阻塞)
5. 进程的状态
6. transient关键字的作用
7. sleep()和wait()的区别
8. hashcode()方法的作用
9. ==和equals()方法区别(为什么重写了equals()方法还要重写hashcode方法)
10. Java的三大特性
11. 接口和抽象类的区别
12. 进程和线程的区别
13. 线程池各参数的含义,以及四种常用线程池的应用场景
14. 阻塞队列的特点和原理和应用场景
15. yield()方法的作用
16. 多线程锁的类型,ReentrantLock,Lock,synchrnoized关键字等
17. volatile关键字的作用(在单例中的作用)
18. 闭包的概念
19. 泛型(什么是类型擦除,为什么要有泛型)
20. 锁优化方式(自旋锁、自适应自旋、锁消除、锁粗化、偏向锁)
21. 类执行顺序
22. StringBuffer和StringBuilder的区别
23. HashMap的实现原理(最好是1.8之前和1.8之后都要知道)
24. ConcurrentHashMap的实现原理(同1.8之前和之后都要知道)
25. ArrayList和LinkedList的区别
26. Java内存区域(堆区和栈区的区别,什么是运行时常量池)
27. 装箱和拆箱
28. OOM异常
29. GC机制(GC区域,如何判断一个对象是否可以回收,GC算法,GC策略)
30. 类加载机制(类加载过程双亲委派模型)
31. Java内存模型(主内存与工作内存)
32. 原子性(AtomicInteger原理)、可见性(volatile关键字)、有序性,如何保证
33. 先行发生原则(happens-before原则)
34. 线程安全的实现方法
35. 锁的类型(悲观锁,乐观锁CAS算法,公平锁,非公平锁等怎么实现)
36. StringBuffer和StringBuilder区别
37. 注解(自定义注解)
38. 四种引用的概念和区别
**计算机网络**
1. HTTP协议(头结构,几种请求方法,缓存机制,各版本的区别)
2. HTTPS协议,和HTTP协议的区别,密钥协商的过程,SSL机制
3. 对称加密和非对称加密
4. TCP和UDP的区别
5. TCP的三次握手、四次挥手(包括状态码,以及四次挥手后为什么要等待2*TIME_WAIT)
6. TCP拥塞控制机制
7. TCP滑动窗口机制
8. TCP超时重传机制
9. DNS协议
10. 五层网络模型(物理层,数据链路层,网络层,传输层,应用层)
11. IP头部
12. 在浏览器地址输入一个网址,发生了什么
**数据结构及算法**
1. 链表(单向链表,双向链表)
2. 数组(旋转数组)
3. 队列(双端队列,阻塞队列)
4. 栈
5. 堆(大根堆、小根堆)
6. 二叉树(完全二叉树、满二叉树、二叉排序树、平衡二叉树,红黑树)(深度遍历,层序遍历)
7. 图(重点掌握图的深度优先遍历和广度优先遍历)
8. 七大排序算法(冒泡,选择,插入,归并排序,快速排序,堆排序,希尔排序)
9. 剑指offer上的算法题(能够对照目录,一看题目,能有思路,就ok)
10. 二分查找
11. 两个栈实现一个队列,两个队列实现一个栈
12. 海量数据排序
13. topK问题,有1千万个数,怎么快速找出最大的100个
14. 合并两个有序数组,合并两个有序链表
15. 杨氏矩阵(横向递增,纵向递增)中如何找到指定的数字
16. 翻转一句话,例如I am 3 years old,翻转后,old years 3 am I
17. 有10亿条数据,现在只有200M内存,怎么找出这10亿条数据中出现次数最多的100条数据

### 结尾
**最后,针对上面谈的内容,给大家推荐一个Android资料,应该对大家有用。**
首先是一个知识清单:(对于现在的Android及移动互联网来说,我们需要掌握的技术)
>泛型原理丶反射原理丶Java虚拟机原理丶线程池原理丶
>注解原理丶注解原理丶序列化
>Activity知识体系(Activity的生命周期丶Activity的任务栈丶Activity的启动模式丶View源码丶Fragment内核相关丶service原理等)
>代码框架结构优化(数据结构丶排序算法丶设计模式)
>APP性能优化(用户体验优化丶适配丶代码调优)
>热修复丶热升级丶Hook技术丶IOC架构设计
>NDK(c编程丶C++丶JNI丶LINUX)
>如何提高开发效率?
>MVC丶MVP丶MVVM
>微信小程序
>Hybrid
>Flutter
![](http://www.icode9.com/i/li/?n=2&i=images/20210711/1626013843808461.jpg)
接下来是资料清单:(**敲黑板!!!**)
**领取通道在这里给你们摆上了~**
##### **[点击我的GitHub免费获取](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)**
* * *
**1.数据结构和算法**
![](http://www.icode9.com/i/li/?n=2&i=images/20210711/1626013843536372.jpg)
**2.设计模式**
![](http://www.icode9.com/i/li/?n=2&i=images/20210711/1626013844652363.jpg)
**3.全套体系化高级架构视频**;七大主流技术模块,视频+源码+笔记
![](http://www.icode9.com/i/li/?n=2&i=images/20210711/1626013844269654.jpg)
**4.面试专题资料包**(怎么能少了一份全面的面试题总结呢~)
![](http://www.icode9.com/i/li/?n=2&i=images/20210711/1626013844240299.jpg)
>不论遇到什么困难,都不应该成为我们放弃的理由!共勉~
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
![](http://www.icode9.com/i/li/?n=2&i=images/20210711/1626013844463797.jpg)

推荐阅读
  • 美团Android 岗3次挂了,这次终于成功拿下!
    美团Android岗3次挂了,这次终于成功拿下!-面试流程自我介绍回答问题————(详情看下面的攻略)前面会问你很多技术问题,从简单到难,直到问到你打不出来就会又问其他部分的,也是 ... [详细]
  • 2021年7月22日上午9点至中午12点,我专注于Java的学习,重点补充了之前在视频中遗漏的多线程知识。首先,我了解了进程的概念,即程序在内存中运行时形成的一个独立执行单元。其次,学习了线程作为进程的组成部分,是进程中可并发执行的最小单位,负责处理具体的任务。此外,我还深入研究了Runnable接口的使用方法及其在多线程编程中的重要作用。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 在最近的WWDC17大会上,苹果公司宣布了多项重要更新,其中一项是macOS High Sierra 10.13 Final的正式发布。这一版本经过优化,显著提升了系统的稳定性和响应速度,为用户在任何Mac设备上提供了更加流畅的使用体验。本文将详细介绍如何在Windows系统中利用VMware虚拟机软件安装并运行macOS High Sierra 10.13 Final,帮助用户在非苹果硬件上体验这一先进操作系统。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 深入理解排序算法:集合 1(编程语言中的高效排序工具) ... [详细]
  • 深入解析 ELF 文件格式与静态链接技术
    本文详细探讨了ELF文件格式及其在静态链接过程中的应用。在C/C++代码转化为可执行文件的过程中,需经过预处理、编译、汇编和链接等关键步骤。最终生成的可执行文件不仅包含系统可识别的机器码,还遵循了严格的文件结构规范,以确保其在操作系统中的正确加载和执行。 ... [详细]
  • 深入解析十大经典排序算法:动画演示、原理分析与代码实现
    本文深入探讨了十种经典的排序算法,不仅通过动画直观展示了每种算法的运行过程,还详细解析了其背后的原理与机制,并提供了相应的代码实现,帮助读者全面理解和掌握这些算法的核心要点。 ... [详细]
  • Androidwifi对象属性及简易Demo本章介绍Android开发中WiFi热点和WiFi属性的获取,介绍WiFi的名称、状态等属性以及获取周围 ... [详细]
  • 对okhttp网络请求的简单介绍publicclassAppextendsApplication{OkHttpClient实例是唯一的,所有的请求都会通过 ... [详细]
  • 本篇文章给大家分享的是有关静态方法如何在Kotlin项目中实现,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话 ... [详细]
  • 负载均衡 LVS vs Nginx 对比
    前言今天总结一下负载均衡中LVS与Nginx的区别,之前看过好几篇博文一开始就说LVS是单向的,Nginx是双向的,我个人认为这是不准确的,LVS三种模式中,虽然DR模式以及TU ... [详细]
  • SmartMesh WireLess HART 资料总结
    SmartMeshWireLessHART资料总结--刘振君2017.01.0923:00:00IEEE802.15是一个工作组98年成立,专门从事 ... [详细]
  • Pytorch的load方法和load_state_dict方法只能较为固定的读入参数文件,他们要求读入的state_dict的key和Model.state_dict()的key ... [详细]
author-avatar
jiaqi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有