希望今天遇见你简谱前辈帮忙分析一下,最近想工作 遇见了两份工作,一个工作是在三维家工作,底薪1000 加提成

三、高级开发技术面试题

这里讲嘚是大公司需要用到的一些高端Android技术这里专门整理了一个文档,希望今天遇见你简谱大家都可以看看这些题目有点技术含量,需要好點时间去研究一下的

Picasso是下载图片然后缓存完整的大小到本地,比如图片的大小是1080p之后如果我需要同一张图片,就会返回这张full size的如果峩需要resize,也就是对这个full size做resize

Glide则完全不一样的做法。Glide会先下载图片然后改变图片的大小,以适应ImageView的要求然后缓存到本地。如果下载同一個图片但是设定两个不同大小的imageView,那么Glide实际是缓存两份

同样格式的图片,Glide内存使用比Picasso小

当下载图片时,加载的速度Picasso是要比Glide快的因為Glide需要进行改变图片的大小,然后缓存;如果已经缓存在内存中Glide加载速度比Picasso要快,因为Picasso内存中的图片需要resize

Glide将缓存分成了两个模块,一個是内存缓存一个是硬盘缓存。

这两个缓存模块的作用各不相同内存缓存的主要作用是防止应用重复将图片数据读取到内存中,而硬盤缓存的主要作用是防止应用重复从网络或其他地方重复下载和读取数据

LRUCache的核心思想就是维护一个缓存对象列表,其中对象列表的排列方式是按照访问顺序实现的即一直没有访问的对象放在队尾,即将被淘汰而最近访问的对象将放在队头,最后被淘汰

(1)、图片Drawable其實只是一个加载图片的工具,并不是一张图片;它可以加载xml文件解析出我们的图,也可以从drawable文件夹中加载图片处理交给画布画

(2)、主流的图片加载原理其实都用到了缓存:内存缓存、活动缓存、磁盘缓存等等,首先都是从缓存中获取到如果没有再从网络下载数据到夲地加载;最终的形式都是将文件解析成Bitmap加载到图片上。

6、自己去实现图片库怎么做?

8、Glide使用什么缓存

9、Glide内存缓存如何控制大小?

1、網络框架对比和源码分析

优先使用Retrofit前提是后台最好是支持Restful风格,如果不想使用或没有能力掌握则推荐使用Volley,如果需要上传大量的数据则不推荐使用volley,推荐使用okhttp

Retrofit整个项目使用的动态代理和静态代理

2、自己去设计网络请求框架,怎么做

网络请求框架的核心就是封装了網络请求+异步+数据处理

一般而言,我们需要考虑的方面有:

1、构建我们的请求Request:包含url,请求方法请求参数,请求头编码,请求体编码格式,超时时间代理端口,代理主机等

2、由Dispatcher分发器并行分发我们的Request请求,这里的分发器实际是一个线程池

3、准备开始连接服务器,連接http获取https服务器地址,https需要考虑自签名证书、双向SSL验证等安全问题

4、Response得到服务器的回调,考虑输入流关闭的问题大文件传输的问题,线程切换问题缓存问题。

4、网络请求缓存处理okhttp如何处理网络缓存的

okHttp缓存流程分为读取缓存和存储缓存两个过程。

(3)、构造一个缓存策畧传入Request请求和缓存响应Response,然后调用它的get方法去决策使用网络请求还是缓存响应

(4)、策略判定以后,如果是使用缓存它的cacheResponse不为空,networkRequest為空如果使用请求,则相反然后再将策略给出的两个值,继续处理

(5)、如果使用请求,但是之前又找到了缓存响应则要关闭缓存响应资源。

(6)、如果策略得出缓存响应为空网络请求也为空,则返回请求不合理的响应

(7)、如果请求为空,缓存不为空也就昰使用缓存的情况,则使用缓存响应来构造返回的响应数据

(8)、最后只使用网络请求的情况,走网络请求的路线

总结:先查找是否囿可用的Cache,然后通过Cache找到对应的缓存然后将请求和缓存交给缓存策略去判断使用请求还是使用缓存,得出结果后自己再判断使用缓存還是使用请求,如果使用缓存则用缓存构造响应直接返回,如果使用请求那么开始网络请求流程。

5、从网络加载一个10M的图片说下注意事项

需要注意开启子线程加载,需要注意内存是否会溢出

6、TCP的3次握手和四次挥手

上图包括三个部分:建立连接,数据传输断开连接

苐一次握手:客户端发送syn包(seq = x)到服务器,并进入SYN_SENT状态等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack = x+1)同时自己吔发送一个SYN包(seq = y),即SYN+ACK包此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器确认包ACK(ack = y+1)此包发送完毕,客户端和服务器进入ESTABLISHED状态完成三次握手。

第一次挥手:主动关闭方发送一个FIN用来关闭主动方到被动方的数据传输,也就是主动关闭方告诉被动关闭方:我已经不会再给你发送数据了(当然在FIN之前发送出去的数据,如果没有收到对应的ack确认报文主动关闭方依然会重发这些数据),泹此时主动关闭方还可以接收数据

第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方确认序号为收到序号加1(与SYN相同,一个FIN占用一個序号)

第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传输也就是告诉主动关闭方,我的数据也发送唍了不会再给你发送数据了。

第四次挥手:主动关闭方收到FIN后发送一个ACK给被动关闭方,确认序号为收到的序号+1致此完成四次挥手。

(1)、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的即发送数据之前不需要建立连接。

(2)、TCP提供可靠服务也就是说,通过TCP連接传送的数据无差错,不丢失不重复,且按序到达;UDP尽最大努力交付即不保证可靠交付。

(3)、TCP面向字节流实际上是TCP把数据看荿了一连串无结构的字节流;UDP面向报文的,UDP没有拥塞控制因此,网络出现拥塞不会使源主机的发送效率降低(对实时应用很有用如IP电環,实时视频会议等)

(4)、每一条TCP连接只能是点对点的;UDP支持一对一一对多,多对一和多对多交互通信

(5)、TCP首部开销20字节;UDP的首蔀开销小,只有8个字节;

(6)、TCP的逻辑通信信道是全双工的可靠信道;UDP则是不可控信道

当对网络通信质量有要求时,比如:整个数据要准确无误的传递给对方这往往需要可靠的传输协议

对当前网络通信质量要求不高的时候,要求网络通讯速度尽量的快这就使用UDP,如:QQ語音QQ视频,TFTP

Http协议是超文本传输协议

http请求分成三个部分,分别是请求行消息报头,请求正文

HTTP1.0:浏览器每次请求都需要与服务器建立一個TCP连接服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态)

HTTP2.0:HTTP2.0引入了二进制数据帧和鋶的概念其中帧对数据进行顺序标识,这样浏览器在收到数据之后就可以按照序列对数据进行合并,而不会出现合并后数据错乱的情況同样因为有了序列,服务器就可以并行的传输数据这就是流所做的事情。

一个HTTP的请求报文由四个部分组成:请求行请求头部,空荇请求数据。

HTTP响应报文也分为三个部分:响应行响应头,响应体

12、HTTP与HTTPS的区别以及如何实现安全性

(1)、HTTP是明文传输,传输内容容易被篡改或者被窃取;HTTPS是密文传输https相当于包装了SSL\TLS协议的HTTP。

(2)、https在网络请求效率上会低于http因为采用了不同的请求协议以及更复杂的安全驗证操作。

(3)、https需要申请CA证书用于验证公钥这个证书收费,HTTP不用

主要通过非对称加密+对称加密+CA证书来保证请求安全的。

13、如何验证證书的合法性?

(1)、验证证书是否在有效期内

(2)、验证证书是否被吊销了。

(3)、验证证书真实性是否是由上级CA签发的。

14、https中哪里鼡了对称加密哪里用了非对称加密,对加密算法(如RSA)等是否有了解?

https协议中加密使用了SSL协议SSL的加密既用了对称加密也用了非对称加密,对称加密速度快平时传输用对称加密,非对称加密传密码比较安全所以对称加密的密码是用非对称加密来传的,这种加密的关键是鼡非对称加密的方式用密文传输对称加密用的密码

1,任取两个质数比如p=3,q=11

4在1到A之间随便选个数e,要求e和A互质比如选e=3(随便选的,囷p=3没有关系)

5计算d,要求e*d mod(A)=1也就是3*d对20取模等于1,d可以等于7可以等于17,还可以等于其他很多值这里选d=7

6,于是得到了e和de和d关于A互為模反元素,那么公钥就是(n,e)也就是(33,3)私钥就是(n,d)也就是(33,7)

7公钥(33,3)由服务器发给浏览器,私钥(33,7)由服务器自己留丅假如浏览器要发送的内容是18,用m表示即m=18,那么m的e次方对n取模即18的3次方对33取模,得到结果c=24也就是浏览器发送的加密内容是24

8,服务器收到24的加密内容后用c的d次方对n取模,即24的7次方对33取模得到m=18,也就是浏览器本来要发送的内容

当Client收到服务器返回的二次握手的信息,包含Client发送的SYN+服务器确认的SYN

WebSocket是应用层html5出的一种协议相比较http而言优势是支持长连接,WebSocket只需要一次HTTP握手整个通信过程是建立在一次连接/状態中,也就避免了HTTP的非状态性服务端会一直知道你的信息,直到关闭请求;同时WebSocket协议解决了服务器与客户端全双工通信的问题

信息只能单向传送为单工;信息能双向传送,但不能同时双向传送称为半双工;信息能够同时双向传送称为双工

Http协议有个缺陷:通信只能从客戶端发起,做不到服务器主动向客户端推送信息

WebSocket最大的特点就是,服务器可以主动向客户端推送信息客户端也可以主动向服务器发送信息,是真正的双向平等对话属于服务器推送技术的一种。

18、谈谈你对安卓签名的理解

每个Android App都会有自己的签名,如果我们没有指定签洺编译时会默认用SDK目录下的debug签名文件。

19、请解释安卓为啥要加签名机制?

(1)、应用程序升级验证app的唯一性,包名和签名都一致才能升級

(2)、应用程序模块化,可以模块化部署多个应用到一个进程只要他们的签名都一样。

(3)、代码或者数据共享同一个签名有相哃的权限,可以共享数据和代码

为何要加密传输,因为盗链和盗播的存在让版权价值大打折扣。用户通过一次付费行为就可以拿到付费视频的播放URL,将播放的URL进行二次分发这种行为叫做盗链;用户将视频直接下载到本地,然后进行二次上传分发这种行为叫做盗播。

常用的视频加密技术有:

基于苹果公司的HLS协议服务器需要切片出TS文件并进行AES加密,生成m3u8索引文件然后客户端下载到本地给播放器播放。

(2)、文件前中后加密

这三段文件加密都涉及到文件的读取尤其是对大文件的读取,我们使用java的RandomAccessFile(随机访问文件)这个类来进行文件的加密解密

21、App 是如何沙箱化,为什么要这么做

Android是一个多用户系统,每个应用是一个独立的用户系统为每个应用分配一个唯一的用户标識(UID),并为应用中所有的文件设置该用户才能访问的权限。每个进程中有一个独立的VM每个应用在自己的进程中运行,应用组件需要执行時系统创建该进程,当系统内存不足时系统会销毁该进程。

在很多情况下源自同一开发者或同一开发机构的应用程序,相互间存在信任关系Android系统提供一种所谓的共享UID(SharedUserID)机制,使具备信任关系的应用程序可以运行在同一进程空间

沙箱是为app提供隔离环境的一种安全机制,严格控制执行的程序所访问的资源以确保系统的安全,让app在独立的进程中执行任务让其不能访问外部进程的资源,这样一个应用出問题了其他的应用进程能够保障不被影响。

22、权限管理系统(底层的权限是如何进行 grant 的)

应用程序在应用层的AndroidManifest.xml中所申请的权限将会在Android系统启动时,经过解析后逐步映射到内核层的组ID和用户ID,最终由内核层setgid()和setuid()函数设置后才能执行;在进行权限申请时6.0以上需要动态代码申请,6.0以下直接在AndroidManifest.xml中注册即可

1、sqlite升级,增加字段的语句

(1)、将表A重命名重命名为A_temp。

(3)、将表A_temp中的数据插入到新表A中

2、数据库框架对比和源码分析

greenDao是一种Android数据库ORM框架,与OrmLite、ActiveOrm、LitePal等数据库相比单位时间内可以插入、更新和查询更多数据,而且提供了大量的灵活通用的接口

(1)、批量事务插入,提升数据插入的性能

(2)、单条sql由于多条sql

(3)、读和写操作是互斥的,写操作过程中可以休眠让读操作进荇

(6)、勿使用过多索引

(8)、提前将字段的index映射好。

(1)、通过冗余换取查询速度

(2)、减少数据来提升查询速度

(3)、避免大数據多表的联合查询。

4、数据库数据迁移问题

(1)、将表A重命名重命名为A_temp。

(3)、将表A_temp中的数据插入到新表A中

从第一个数开始,相邻元素两两对比小的数放前面。(每循环一次最后一个数都会被确定下来,为每轮的最大数)

从第一个数开始循环一圈找最小的数交换位置。(每循环一圈第一个数都会被确定下来,为每轮最小的值)

从第二个数开始跟前一个数比较,若比前一个数小则交换位置,接着跟前一个数比较直到比前一个数大为止。(从第一张开始整理扑克牌小的往前插)(可能会出现一个数从最后比较到最前面,比较费時)

    希尔排序属于插入类排序是将整个有序序列分割成若干个小的子序列分别进行插入排序。

    排序过程:先取一个正整数d1<n把所有序号相隔d1的数组元素放一组,组内进行直接插入排序然后取d2<d1,重复上述分组和排序操作直至d1=1,即所有记录放进一个组中排序为止(将每间隔一定步距的数取出来进行比较,比如gap=5就是把第1个、第6个、第11个...数取出来进行插入排序)

    优点:当n值很大时,数据项每一趟排序需要移動的个数很少但数据项的距离很长;当n值减小时,每一趟需要移动的数据增多此时已经接近于它们排序后的最终位置。

        希尔排序是按照不同步长对元素进行插入排序当刚开始元素很无序的时候,步长最大所以插入排序的元素个数很少,速度很快;当元素基本有序了步长很小,插入排序对于有序的序列效率很高所以,希尔排序的时间复杂度会比o(n^2)好一些

 归并排序有两种实现方法:自上而下的递归;自下而上的迭代。下面讲递归法:

    将原数组用二分法一直分到两个数为一组然后通过比较将较小的数放到前面(通过一个中间数组排序);然后一层层向上排序。

    (就是两个数比较进行排序然后两组(四个数)进行比较排序,然后两组(八个数)进行比较排序…)

快速排序思想:先找到一个基准点(一般指数组的中部)然后数组被该基准点分为两部分,依次与该基准点数据比较如果比它小,放左邊;反之放右边。 左右分别用一个空数组去存储比较后的数据最后递归执行上述操作,直到数组长度<=1

    特点:快速,常用缺点是需偠另外声明两个数组,浪费了内存空间资源

2、最快的排序算法是哪个?

快速排序时最快的排序算法

5、快速排序的过程、时间复杂度、涳间复杂度

(1)、定义一个基准元素base(我这里定义最左边的元素定位基准元素)

(2)、定义两个变量i和j

(3)、j先从右向左遍历,找到第一个比base尛的数就停止

(4)、i从左往右遍历,找到第一个比base大的数就停止

(5)、如果i和j不相等,交换i和j指向的元素

(6)、直到i和j指向同一元素,将这个元素与基准元素交换

7、堆排序过程、时间复杂度及空间复杂度

将待排序的序列构造成一个大顶堆此时,这个序列最大值就是堆顶的根节点将其与数组末尾元素进行交换,此时末尾元素就是最大值然后将剩余的n-1个序列重新构造成一个堆,这样就可以得到n-1个元素的次大值如此反复执行,便能得到一个有序序列了

8、写出你所知道的排序算法及时空复杂度,稳定性

9、二叉树给出根节点和目标节點找出从根节点到目标节点的路径

10、给阿里2万多名员工按年龄排序应该选择哪个算法?

11、GC算法(各种算法的优缺点以及应用场景)

优点:实現简单;与保守式GC算法兼容;

缺点:碎片化;分配速度;与写时复制技术不兼容

优点:优秀的吞吐量;可实现告诉分配;不会发生碎片化;与缓存兼容

缺点:堆使用效率低下;不兼容保守式GC算法;递归调用函数

缺点:压缩花费计算成本

优点:缩短了最大暂停时间;降低了吞吐量

12、蚁群算法与蒙特卡洛算法

13、子串包含问题(KMP 算法)写代码实现

在匹配阶段,若是模式串和文本串相同那就继续匹配下一位,若是不楿同就去找next数组记录的位置,继续匹配这也就是KMP算法和普通暴力算法的主要区别,暴力是从头开始匹配而KMP是通过next数组,发现前面可鉯跳过大量重复计算的东西

next数组计算方法:

next数组的计算主要和模式串相关,与文本串没有关系因为,模式串前后公共最长子序列这樣才会让我们跳过大量的重复计算,next数组的主要实现方法有很多就是要找到前后最长公共子序列的长度,比如:

模式串的各个子串:前綴:后缀:最大公共元素长度:

如上图next数组的元素就是00,12,3

kmp算法的核心就是就算next数组

14、一个无序,不重复数组输出N个元素,使得N個元素的和相加为M给出时间复杂度、空间复杂度。手写算法

15、万亿级别的两个URL文件A和B如何求出A和B的差集C(提示:Bit映射->hash分组->多文件读写效率->磁盘寻址以及应用层面对寻址的优化)

16、百度POI中如何试下查找最近的商家功能(提示:坐标镜像+R树)。

17、两个不重复的数组集合中求共同的え素。

18、两个不重复的数组集合中这两个集合都是海量数据,内存中放不下怎么求共同的元素?

先遍历数组A对每个元素求取hash(元素)%1000,嘫后根据所取到的值将元素分别存储在1000个数组中

遍历数组B,采取和A相同的方式将元素分别存储在1000个数组中,这样处理后所有可能相哃的元素都在对应的小数组中(a0VSb0,a1VSb1...a999VSb999),不对应的小数组不可能有相同的元素然后只要求出1000对小数组中相同的元素即可。

19、一个文件中有100万個整数由空格分开,在程序中判断用户输入的整数是否在此文件中说出最优的方法

使用位图方法,申请足够的内存一个bit位代表一个unsigned int徝。读入100万数据设置响应的bit位,读入要查询的数查看响应bit位是否为1,为1表示存在为0表示不存在。

20、一张Bitmap所占内存以及内存占用的计算

一张图片(Bitmap)占用的内存=图片长度*图片宽度*单位像素占用的字节数(图片长度和图片宽度的单位是像素)。

21、2000万个整数找出第五十夶的数字?

采用最小堆首先读入前50个数字,来创建大小为50的最小堆建堆的时间复杂度O(50log50),然后遍历后续数字并与堆顶(最小)的数字進行比较,如果比最小的数小则继续读取后续数字,如果比最小值大则替换对顶元素,并重新调整堆为最小堆重复这个过程直到2000万個整数遍历完成。此时采用中序遍历的方式输出所有的50个数字,就是前50大的数字第一个即为第50大的数字。

22、烧一根不均匀的绳从头燒到尾总共需要1个小时。现在有若干条材质相同的绳子问如何用烧绳的方法来计时一个小时十五分钟呢?

先用两根绳子一根绳子一头點火,另一根绳子两头点火当第二根绳子燃烧完毕的时候(即半个小时),点燃第一根绳子的另一头当第一根绳子燃烧完毕的时候,此时正好45分钟然后再点燃第三根绳子的两头,等第三根绳子烧完则正好是一个小时十五分钟。

23、求1000以内的水仙花数以及40亿以内的水仙婲数

24、5枚硬币2正3反如何划分为两堆然后通过翻转让两堆中正面向上的硬8币和反面向上的硬币个数相同

25、时针走一圈,时针分针重合几次

26、N*N的方格纸,里面有多少个正方形

27、x个苹果一天只能吃一个、两个、或者三个,问吃完有多少种吃法

(五)插件化、模块化、组件化、熱修复、增量更新、Gradle

1、对热修复和插件化的理解

插件化和热修复不是同一概念,插件化顾名思义就是把需要实现的模块或是功能当做一个獨立的提取出来减少宿主的规模,当需要使用到响应的功能时再去加载相应的模块。

热修复则往往是从修复bug的角度出发强调的是不需要二次安装应用的前提下修复已知的bug。

3、模块化实现(好处原因)

(1)、结构清晰,各个模块的代码实现分离不会搅在一起。在代碼review或者二次开发的时候一目了然不会满世界去找代码。

(2)、协同开发的时候更灵活不用再等同组的其他同事的模块开发完成后才能運行app,自己负责的模块稍加修改就可以当做主App直接跑起来

(3)、便于维护。每个模块的代码、布局文件、资源文件可以随时从项目中通過gradle配置去掉

Android插件化----指将一个程序划分成不同的部分,比如一般App的皮肤样式就可以看成一个插件

Android组件化-----这个概念和上边相差不是那么明顯,组件和插件最大的区别在于:组件是指通用和复用性较高的构建比如图片缓存就可以看成一个组件被多个App调用。

热修复----从bug角度出发强调的是在不需要二次安装应用的前提下修复已知的bug。

除了有commonLib和app模块外还包括按功能划分的各个业务组件模块,之前的包变成现在的組件模块增加了层次感;每个模块可以单独编译,加快了编译速度也为提供单元模块测试提供了支持;多人开发只负责自己开发的模塊,直接避免了版本管理的冲突

(1)、设置模块间的依赖,且使得业务模块可单独编译--通过配置gradle即可解决

(2)、业务模块之间的跳转鉯及通信--使用阿里开源的ARouter即可解决。

Android Studio点击build后就会编译整个项目并将apk安装到手机上,这个过程就是android工程编译打包的过程

(1)、打包资源攵件,生成R.java文件

输入:Resource文件(即工程的res文件)

(2)、处理AIDL文件(没有可以省略),生成对应的.java文件

输出:对应的.java文件

(3)、编译java文件苼成对应的.class文件。

输入:源码文件(包括第一步生成的R.java和第二步生成的aidl.java文件)

输出:对应的.class文件

输入:第三步生成的.class文件(包括AIDL、R.java、源代碼生成的.class文件)

输出:对应的.dex文件

(5)、打包生成未签名的.apk文件

输入:打包后的资源文件(包括本地和第三方库里的)

输出:未签名的.apk文件

(6)、对未签名的.apk文件进行签名

输入:未签名的.apk文件

输出:签名的.apk文件

(7)、对签名后的.apk文件进行对齐处理

输入:签名的.apk文件

输出:对齊后的.apk文件

(3)、用jd-gui工具将jar文件转换成java文件

(4)、用apktool这个工具用于最大幅度的还原apk中9-patch图片、布局、字符串等等一系列的资源。命令apktool d Demo.apk

(陸)架构设计和设计模式

1、谈谈你对Android设计模式的理解

MVC是指Modle,View和Controller将界面,业务逻辑和控制器分开是一种低耦合的设计方式,适用于简单嘚应用开发

这种设计模式最简单,但问题有三:

(1)、View和Model相互可见耦合度高。

(2)、如果程序复杂那么Activity这个Controller将十分繁琐复杂,不容噫维护

MVP模式容易维护,可拆卸可扩展,耦合性叫MVC较小结构清晰。

MVP的缺点在于开发开销相对较大。与MVC相比需要维护更多的接口。

MVVM嘚侧重点在于数据与UI的联动自动更新,而非降低耦合度对于耦合度的问题,其实还是需要结合MVP模式来解决

3、你所知道的设计模式有哪些?

4、项目中常用的设计模式

定义一个操作中的算法的骨架而将一些步骤延迟到子类中,如jdbcTemplate

定义对象的一种一对多的依赖关系当一個对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

使用了java的继承和多态

解决了一个全局使用的类频繁的创建与销毁

分为三种:简单工厂,工厂方法抽象工厂。

5、手写生产者/消费者模式

生产者消费者问题是线程模型中的经典问题:生产者和消费者在哃一时间段内共用同一存储空间生产者向空间里生产数据,而消费者取走数据

实现生产者消费者模式有三点:

(1)、一般使用队列作為缓冲区,给生产者和消费者解耦平衡了生产者和消费者的处理能力。

(2)、构建生产者队列满使得生产者线程阻塞。

(3)、构建消費者队列空使得消费者线程阻塞。

BlockingQueue是一个阻塞队列它的存取可以保证只有一个线程在进行,所以根据逻辑生产者在内存满的时候进荇等待,并唤醒消费者队列反过来消费者在饥饿状态下,等待并唤醒生产者生产

6、写出观察者模式的代码

从上边的例子可以看出,定義了四个订阅者一个发布者,当发布者更新一个消息时四个订阅者都收到消息,根据发布者更新的信息执行对应的更新操作

7、适配器模式,装饰者模式外观模式的异同?

装饰器模式:能动态的新增或组合对象的行为

适配器模式:是对其他对象接口的一种转换行为,将原接口转换为目标接口达到适配的效果。

外观模式:外观对象提供对子系统各元件功能的简化为共同层次的调用接口它主要起简囮作用。

装饰者是“新增行为”适配器模式是“转换行为”,外观者模式是“简化行为”

8、用到的一些开源框架,介绍一个看过源码嘚内部实现过程。

EventBus是一款在Android开发中使用的发布/订阅事件总线框架基于观察者模式,将事件的接收者和发送者分开简化了组件之间的通信,使用简单、效率高体积小。

EventBus以反射开始--注册以反射结束--事件的消费。

RxJava说到底本质可以压缩为异步一个词。它就是一个异步操莋的库其他定于都是基于这之上的。

RxJava的异步实现是通过一种扩展的观察者模式来实现的

10、RxJava的功能与原理实现

RxJava原理就是创建一个Observable对象来幹活,然后使用各种操作符建立起来的链式操作就如同流水线一样,把你想要处理的数据一步一步加工成你想要的成品然后发射给Subscriber处悝。

11、RxJava的作用与平时使用的异步操作来比的优缺点

异步操作有Handler、AsyncTask等,但使用Rxjava就算再多的异步操作,代码逻辑越来越复杂RxJava依然可以保歭清晰的逻辑。

EventBus作用:简化各组件间的通信让我们书写代码更简单,能有效的分离事件发送方和事件接收方(也就是解耦合)能避免複杂和容易出错的依赖性和生命周期的问题。

13、从0设计一款App整体架构如何去做?

(2)、网络框架:包括网络请求图片异步加载,图片緩存网络缓存,力求简单易用

14、说一款你认为当前比较火的应用并设计(比如:直播APP,P2P金融小视频等)

15、谈谈对java状态机理解

状态机包含┅个状态集合,定义当状态机处于某一个状态的时候它所能接受的事件以及可执行的行为执行完后,状态机所处的状态

每个Android进程,只能运行在自己进程所拥有的虚拟地址空间对应一个4GB的虚拟地址空间,其中3GB是用户空间1GB是内核空间,当然内核空间的大小可以通过参数配置进行调整对于用户空间,不同进程之间彼此是不共享的而内核空间确实可共享的。Client进程向Server进程通信恰恰是利用了进程间可共享內核空间来完成底层通信工作的,Client端与Server端进程往往采用ioctl等方法跟内核空间的驱动进行交互

Binder通信的四个角色:

Client进程:使用服务的进程。

Server进程:提供服务的进程

Binder驱动:驱动负责进程之间Binder通信的建立,Binder在进程之间的传递Binder引用计数管理,数据包在进程间的传递交互等一系列底層支持

18、对于应用更新这块是如何做的?(解答:灰度强制更新,分区域更新)

19、实现一个Json解析器(可以通过正则提高速度)

20、统计启动时長,标准

(1)、冷启动:application没有被创建,需要先创建进程然后启动MainActivity。由于这个过程需要fork一个新进程所以耗时。

(2)、热启动:同上面对照已经启动过application,并驻留在系统内存内只是需要唤醒该进程,并启动MainActivity

1、如何对Android 应用进行性能分析以及优化?

TraceView是一个图形化工具,最终它会產生一个图表用于对性能分析进行说明。

TraceView原理:TraceView通过修改code在需要调试的起始位置加入调试函数,程序运行之后会在SD的根目录下产生*.trace文件来保存运行时数据然后把*.trace文件拷贝到PC机上,通过traceview命令对*.trace文件进行分析

(1)、查看进程的堆栈使用情况。

(2)、跟踪对象的内存分配

(3)、操作仿真器或设备的文件系统

(4)、检查线程信息。

(6)、使用的网络流量工具

(8)、模拟电话业务和位置

(9)、模拟来电或SMS文夲信息

(10)、设置手机地理位置

3、性能优化如何分析systrace?

Systrace原理:在系统一些关键链路(比如System Service虚拟机,Binder驱动)插入一些信息(这里称为Label)通过Label的开始和结束来确定某个核心过程的执行时间,然后把这些Label信息收集起来得到系统关键路径的运行时间信息进而得到整个系统的運行性能信息。

4、用IDE如何分析内存泄漏

(2)、使用java heap分析工具,找出内存占用超出预期的嫌疑对象

(3)、必要时,需要分析嫌疑对象和其他对象的引用关系

(4)、查看程序的源代码,找出嫌疑对象数量过多的原因

5、Java多线程引发的性能问题,怎么解决

创建线程的方式:继承Thread类;实现Runnable接口

两种方式的主要区别在于多线程访问同一资源的情况下,用Runnable创建的线程可以处理同一资源而Thread类创建的线程则各自独竝处理,各自拥有自己的资源

(1)、线程的创建和销毁都需要时间,当有大量的线程创建和销毁时那么这些时间的消耗则比较明显,將导致性能上的缺失

(2)、大量的线程创建、执行和销毁是非常耗CPU和内存的,这样直接影响系统的吞吐量导致性能急剧下降,如果内存资源占用的比较多还很可能造成OOM。

(3)、大量的线程的创建和销毁很容易导致GC频繁的执行从而发生内存抖动现象,而发生内存抖动对移动端来讲,最大的影响就是造成页面卡顿

重用已有的线程,从而减少线程的创建和销毁这就需要使用线程池,线程池的基本作鼡就是进行线程的复用

6、启动页白屏及黑屏解决?

onCreate----setContentView这个并不是发生在窗体绘制的第一步系统会在执行这个步骤前,先绘制窗体这时候布局资源还没有加载,于是就使用默认背景色

这种亮色系造成白色闪屏。

这种暗色系主题造成黑色闪屏。

(1)、把启动图bd_splash设置为窗體背景避免刚刚启动App时出现黑/白屏。

(2)、设置为背景bd_splash显示时后台负责加载资源,同时去下载广告广告图下载成功或超时时,显示SplashActivity嘚真实样子

7、启动太慢怎么解决?

应用启动速度取决于application中做了什么事情比如继承了很多sdk,并且sdk的init操作都需要在主线程中实现那自然僦慢了。在非必要的情况下可以把加载延后,或丢给子线程

8、怎么保证应用启动不卡顿?

同上边是一个道理也可以做一个闪屏页当緩冲时间。

9、App启动崩溃异常捕捉

10、自定义View注意事项

(3)、初始化时创建对象;不要在onDraw方法内创建绘制对象一般都在构造函数里初始化对潒。

(4)、状态存储和恢复:如果内存不足时而恰好我们的Activity置于后台,不行被重启或者用户旋转屏幕造成Activity重启,我们的View也应该尽量的詓保存自己的属性

11、现在下载速度很慢,试从网络协议的角度分析原因,并优化(提示:网络的5层都可以涉及)。

12、Https请求慢的解决办法(提示:DNS携带数据,直接访问IP)

13、如何保持应用的稳定性

需要借助内存分析工具防止内存泄漏

convertView的使用,主要优化加载布局问题

给item设置点击事件和长按事件。

给item中的控件设置点击事件和长按事件

18、Bitmap如何处理大图,如一张30M的大图如何预防OOM

需要将这张大图进行压缩。

19、java中的四种引用的区别以及使用场景

强引用:如果一个对象具有强引用那么垃圾回收器绝不会回收它。

软引用:如果一个对象具有软引用则内存涳间足够,垃圾回收器不会回收它如果内存空间不足了,就会回收这些对象

弱引用:弱引用与软引用的区别在于,只具有弱引用的对潒拥有更短暂的生命周期

虚引用:如果一个对象仅持有虚引用,那么它就和没有任何引用一样在任何时候都可能被垃圾回收器回收。

總结:弱引用和软引用都可以用来保存对象的实例引用这两个类与垃圾回收有关。

弱引用其中保存的对象实例可以被GC回收掉这个类通瑺用于在某处保存对象的引用,而又不干扰该对象被GC回收通常用于Debug、内存监视工具等程序中。

强引用保存的对象实例除非JVM即将OutOfMemory,否则僦不会被GC回收

20、强引用置为null,会不会被回收

会,GC执行时就会被回收掉,前提是没有被引用的对象

作用:快速开发C/C++的动态库,并自動将so和应用一起打包成apk

4、如何在jni中注册native函数,有几种注册方式?

静态方法:这种方法比较常见大致流程如下:

(1)、先创建java类,声明Native方法编译成.class文件

(2)、使用javah命令生成C/C++的头文件。

(3)、创建.h的源文件实现对应的native方法。

JNI中有一个叫JNINativeMethod的结构体来保存这个对应的关系实現动态注册就需要这个结构体。

直接调用java中的native方法即可

6、jni如何调用java层代码?

C调用java中的方法使用的是反射

(3)、通过字节码文件创建一个object對象(该方法可选方法中已经传递了一个object,如果需要调用的方法与本地方法不在同一个文件夹则需要创建新的object(jobject(AllocObject)(JNIEvn,jclass);)如果需要反射调用的java方法与本地方法不在同一个类中,需要创建该方法但是如果是这样,并且需要更新UI操作这个时候就会报空指针异常,因为这个时候调用嘚方法只是一个方法没有Activity声明周期)。

7、进程间通信的方式

(1)、AIDL:功能强大,支持进程间一对多的实时并发通信并可实现RPC(远程過程调用)

(2)、Messenger:支持一对多的串行实时通信,AIDL的简化版本

(3)、Bundle:四大组件的进程通信方式,只能传输Bundle支持的数据类型

(4)、ContentProvider:強大的数据源访问支持,主要支持CRUD操作一对多进程间数据共享。

(5)、Broadcast Receiver:广播但只能单向通信,接收者只能被动接受信息

(6)、文件共享:在非高并发的情况下共享简单的数据。

(7)、Socket:通过网络传输数据

每个Android进程,只能运行在自己进程所拥有的虚拟地址空间对應一个4GB的虚拟地址空间,其中3GB是用户空间1GB是内核空间,当然内核空间的大小可以通过参数配置进行调整对于用户空间,不同进程之间彼此是不共享的而内核空间确实可共享的。Client进程向Server进程通信恰恰是利用了进程间可共享内核空间来完成底层通信工作的,Client端与Server端进程往往采用ioctl等方法跟内核空间的驱动进行交互

Binder通信的四个角色:

Client进程:使用服务的进程。

Server进程:提供服务的进程

Binder驱动:驱动负责进程之間Binder通信的建立,Binder在进程之间的传递Binder引用计数管理,数据包在进程间的传递交互等一系列底层支持

IPC是Interface Process Connection的缩写,含义为进程间通信或跨进程通信指两个进程间进行数据交换的过程。

AIDL是Android中IPC的方式的一种AIDL的作用是让你可以在自己的APP里绑定一个其他的APP的Service,这样你的APP可以与其他APP茭互

11、AIDL解决了什么问题?

只有当你允许来自不同的客户端访问你的服务并且需要处理多线程问题时才必须用AIDL

(1)、定义一个*.aidl的文件

(2)、实现AIDL文件生成的java接口

(3)、定义一个自己的Service,在实现Service时为了其他应用可以通过bindService来和我们的Service进行交互,我们都要实现Service中的onBind()方法并且返回一个继承了Binder的内部类。

(1)、客户端要想使用该服务需要知道服务在aidl文件中提供了什么服务,所以需要将服务端的aidl文件拷贝到客户端且包名和文件名需要与服务端一致。

(2)、通过bindService方法与Service交互该方法中有一个ServiceConnection类型的参数,主要代码便是在该接口中实现

Client进程向Server进程通信,恰恰是利用了进程间可共享内核空间来完成底层通信工作的Client端与Server端进程往往采用ioctl等方法跟内核空间的驱动进行交互。

14、多进程場景遇见过么

前台进程:需要用户当前正在进行的操作

可视进程:做用户当前意识到的工作。

缓存/后台进程:系统如有内存需要可随意杀死。

进程的生命周期优先级从高到底

(2)、可见进程,比如主Activity上弹出一个对话框该Activity的进程状态就为可见进程。

(3)、服务进程仳如正在运行的Service的状态。

(4)、后台进程比如Activity,按Home键之后的状态

(5)、空进程,该进程状态主要用来缓存进程保存一些进程的数据,方便下次启动的时候直接从缓存读取数据。

(1)、onCreate在创建应用程序时调用可以重写这个方法来实现实例化应用程序单态,以及创建囷实例化任何程序状态变量和共享资源

(2)、onLowMemory当系统处于资源匮乏的时候,具有良好行为的应用程序可以释放额外的内存这个方法一般只会在后台进程已经终止,但是前台应用程序仍然缺少内存时调用可以重写这个处理程序来清空缓存或释放不必要的资源。

(3)、onTrimMemory作為onLowMemory的一个特定于应用程序的替代选择在Android4.0时引入。当运行时决定当前应用程序应该尝试减少其内存开销时调用它包含一个level参数,用于提供请求的上下文

(4)、onConfigurationChanged与Activity不同,在配置改变时应用程序对象不会被终止和重启。如果应用程序使用的值依赖于特定的配置则重写这個方法来重新加载这些值,或在应用程序级别处理配置改变

(4)、进程adj调度

18、谈谈对进程共享和线程安全的认识

可以通过uid实现进程共享。

线程安全:如果代码所在的进程中有多个线程在同时运行而这些线程有可能同时运行这段代码。如果每次运行结果和单线程运行结果昰一样的而且其他变量的值也和预期的是一样的,就是线程安全的

19、谈谈对多进程开发的理解以及多进程应用场景

在开发中,我们通瑺会使用修改清单文件的android:process来达到多进程的目的如果android:process的value值以冒号开头的话,那么该进程就是私有进程如果以其他字符开头,则是公有进程这样拥有相同ShareUID的不同应用可以跑在同一进程中。

多进程应用场景:做音乐播放器(在新的进程中启动前台Service,播放音乐);多模块应鼡

协程提供了一种新的异步执行方式。

1、java虚拟机的特性

2、谈谈对jvm的理解

JVM是java的核心和基础在java编译器和os平台之间的虚拟处理器。

(2)、管悝并分配内存

(3)、执行垃圾收集。

3、JVM内存区域开线程影响哪块内存

每当有线程创建的时候,JVM就需要为其在内存中分配虚拟机栈和本哋方法栈来记录调用方法的内容分配程序计数器记录指令执行的位置,这样的内存消耗就是创建线程的内存代价

4、对Dalvik、ART虚拟机有什么叻解?

DVM执行的是由.class文件转化来的dex文件

DVM可执行文件更小JVM基于栈,DVM基于寄存器

ART虚拟机执行的是本地机器码

DVM运行的是dex文件ART运行的是本地机器碼

ART在应用第一次安装的时候字节码就会预编译成机器码,使其成为真正的本地应用这个过程叫做预编译。这样应用的启动(首次)和执荇都会更快

dex不能直接被ART虚拟机执行Google已经放弃了DVM,可以直接研究ART

6、虚拟机原理,如何自己设计一个虚拟机(内存管理类加载,双亲委派)

7、谈谈你对双亲委派模型理解

上图中类加载器之间的这种层次关系称为类加载器的双亲委派模型。双亲委派模型要求除了顶层的启动类加载器其余的类加载器都应该有自己的父类加载器。这里类加载器之间的父子关系一般不会以继承关系来实现而是使用组合关系来复鼡父加载器的代码。

双亲委托模型的工作过程是:如果一个类加载器收到了类加载器的请求它首先不会自己尝试加载这个类,而是把这個请求委托给父类加载器去完成每一个层次的类加载器都是如此,因此所有的加载请求最后都应该传送到顶层的启动类加载器中只有當父类加载器反馈自己无法完成这个加载请求(它的搜索范围内没有找到所需的类时),子类才会尝试自己去加载

8、JVM内存模型,内存区域

类从被加载到虚拟机的内存开始到卸载出内存为止,整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七大阶段

程序启动的时候,并不会一次性加载程序所要用的所有的class文件而是根据程序需要,通过java的类加载机制(ClassLoader)来动态的加载某个class文件到内存當中去从而只有class文件被加载到内存之后,才能被其他的class所引用所以ClassLoader就是动态的加载class文件到内存中的。

11、谈谈对动态加载(OSGI)的理解

12、內存对象的循环引用及避免

两个实例对象相互引用就会造成循环引用

13、内存回收机制、GC回收策略、GC原理时机以及GC对象

对象回收使用引用計数法和可达性算法

GC原理时机:为新对象分配内存时,Eden区没有足够空间时会发生MinorGC

老年代没有足够空间时,会进行Full GC

System.gc()显示的通知jvm进行一次垃圾回收但垃圾回收机制具体在什么时间运行是无法预知的。

17、大体说清一个应用程序安装到手机上时发生了什么

19、App启动流程从点击桌媔开始

20、逻辑地址与物理地址,为什么使用逻辑地址

逻辑地址:在具有地址变换功能的计算机中,访问指令给出的操作数

物理地址:鼡于内存芯片级单元寻址,与CPU连接的地址总线相对应

任何一个独立运行的程序,都需要系统分配单独的内存空间大多数情况下这个工莋是由系统完成的,方便程序访问变量程序不需要关心变量的物理地址。现代操作系统都提供了一种内存管理的抽象即虚拟内存。进程使用虚拟内存的逻辑地址范文操作系统协助转换成真正的物理地址。

21、Android为每个应用程序分配的内存大小是多少

22、Android中进程内存的分配,能不能自己分配定额内存

黑色保活:不同app进程,用广播相互唤醒(包括利用系统提供的广播进行唤醒)

白色保活:启动前台Service

灰色保活:利用系统漏洞启动前台Service

24、如何保证一个后台服务不被杀死?(相同问题:如何保证service在后台不被kill)比较省电的方式是什么?

(1)、提升进程的优先级降低进程被杀死的概率。

(2)、在进程被杀死后进行拉活

25、App中唤醒其他进程的实现方式

(3)、直接通过包名唤起app

附;性能调优+前沿技术+NDK技术大纲

}

本篇是结合我之前面试别人的经驗以及跟一些在BAT上班的朋友,讨论总结出的一份很全面的大公司需要用到的一些高端Android技术这里也专门整理了一个文档,重点和难点都囿详细解析这些题目有点技术含量,需要好点时间去研究一下的
在文末有领取,收集整理了更多关于Android面试专题包括初级,中级高級不同水平以及不同专题所涉及到的常问范围,及面试专题和答案和系统学习视频资料免费分享给大家,省去网上到处搜索资料的麻烦文末有领取!


后面根据一些小伙伴的建议,面试资料进阶学习PDF资料,视频教程补充并且更新了,希望今天遇见你简谱对大家进阶学習有更好的帮助谢谢

五.插件化、模块化、组件化、热修复、增量更新、Gradle

六.架构设计和设计模式

4、自己去实现图片库,怎么做
6、Glide使用什麼缓存?
7、Glide内存缓存如何控制大小

1.网络框架对比和源码分析
2.自己去设计网络请求框架,怎么做
3.网络请求缓存处理,okhttp如何处理网络缓存嘚;
4.从网络加载一个10M的图片说下注意事项
5.TCP的3次握手和四次挥手
11.HTTP与HTTPS的区别以及如何实现安全性
12.如何验证证书的合法性?
13.https中哪里用了对称加密,哪里用了非对称加密对加密算法(如RSA)等是否有了解?
17.谈谈你对安卓签名的理解。
18.请解释安卓为啥要加签名机制?
20.App 是如何沙箱化为什么偠这么做?
21.权限管理系统(底层的权限是如何进行 grant 的)

1.sqlite升级,增加字段的语句
2.数据库框架对比和源码分析
4.数据库数据迁移问题

2.最快的排序算法是哪个
5.快速排序的过程、时间复杂度、空间复杂度
7.堆排序过程、时间复杂度及空间复杂度
8.写出你所知道的排序算法及时空复杂度,稳定性
9.二叉树给出根节点和目标节点找出从根节点到目标节点的路径
10给阿里2万多名员工按年龄排序应该选择哪个算法?
11.GC算法(各种算法嘚优缺点以及应用场景)
12.蚁群算法与蒙特卡洛算法
13.子串包含问题(KMP 算法)写代码实现
14一个无序不重复数组,输出N个元素使得N个元素的和相加為M,给出时间复杂度、.空间复杂度手写算法
15.万亿级别的两个URL文件A和B,如何求出A和B的差集C(提示:Bit映射->hash分组->多文件读写效率->磁盘寻址以及应鼡层面对寻址的优化)
16.百度POI中如何试下查找最近的商家功能(提示:坐标镜像+R树)
17.两个不重复的数组集合中,求共同的元素
18.两个不重复的数組集合中,这两个集合都是海量数据内存中放不下,怎么求共同的元素
19.一个文件中有100万个整数,由空格分开在程序中判断用户输入嘚整数是否在此文件中。说出最优的方法
20.一张Bitmap所占内存以及内存占用的计算

21.2000万个整数找出第五十大的数字?
22.烧一根不均匀的绳从头烧箌尾总共需要1个小时。现在有若干条材质相同的绳子问如何用烧绳的方法来计时一个小时十五分钟呢?
23.求1000以内的水仙花数以及40亿以内的沝仙花数

24.5枚硬币2正3反如何划分为两堆然后通过翻转让两堆中正面向上的硬8币和反面向上的硬币个数相同
25.时针走一圈,时针分针重合几次
26.N*N嘚方格纸,里面有多少个正方形
27.x个苹果一天只能吃一个、两个、或者三个,问多少天可以吃完

五.插件化、模块化、组件化、热修复、增量更新、Gradle

1.对热修复和插件化的理解
3.模块化实现(好处,原因)

六.架构设计和设计模式

1.谈谈你对Android设计模式的理解
3.你所知道的设计模式有哪些
4.项目中常用的设计模式
5.手写生产者/消费者模式
6.写出观察者模式的代码
7.适配器模式,装饰者模式外观模式的异同?
8.用到的一些开源框架介绍一个看过源码的,内部实现过程
11.RxJava的作用,与平时使用的异步操作来比的优缺点
13.从0设计一款App整体架构如何去做?
14.说一款你认为当湔比较火的应用并设计(比如:直播APPP2P金融,小视频等)
15.谈谈对java状态机理解
18.对于应用更新这块是如何做的(解答:灰度,强制更新分区域更噺)?
19.实现一个Json解析器(可以通过正则提高速度)
20.统计启动时长,标准

1.如何对Android 应用进行性能分析以及优化?
4.用IDE如何分析内存泄漏
5.Java多线程引发的性能問题,怎么解决
6.启动页白屏及黑屏解决?
7.启动太慢怎么解决
8.怎么保证应用启动不卡顿?
9.App启动崩溃异常捕捉
10自定义View注意事项
11.现在下载速喥很慢,试从网络协议的角度分析原因,并优化(提示:网络的5层都可以涉及)
12.Https请求慢的解决办法(提示:DNS,携带数据直接访问IP)
13.如何保持应鼡的稳定性
18.Bitmap如何处理大图,如一张30M的大图如何预防OOM
19.java中的四种引用的区别以及使用场景
20.强引用置为null,会不会被回收

2.谈谈对jvm的理解
3.JVM内存区域,开线程影响哪块内存
6.虚拟机原理如何自己设计一个虚拟机(内存管理,类加载双亲委派)
7.谈谈你对双亲委派模型理解
8.JVM内存模型,内存區域
11.谈谈对动态加载(OSGI)的理解
12.内存对象的循环引用及避免
13.内存回收机制、GC回收策略、GC原理时机以及GC对象
17.大体说清一个应用程序安装到手機上时发生了什么
19.App启动流程从点击桌面开始
20.逻辑地址与物理地址,为什么使用逻辑地址

发是面向对象。找工作是面向面试这里我在收集了一套最新的Android面试专题合集。这些题目是今年群友去百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到嘚题目并且大多数都整理了答案,熟悉这些知识点会大大增加通过前两轮技术面试的几率

视频教程面试资料分享;3.20更新

  • 这些视频是针對3年以上Android开发者进阶学习的。处于初级水平建议先打好基础哦

可以在评论区留言或者简信我学习我看到都会回复的。

当程序员容易当┅个优秀的程序员是需要不断学习的,从初级程序员到高级程序员从初级架构师到资深架构师,或者走向管理从技术经理到技术总监,每个阶段都需要掌握不同的能力早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人

}

介绍一下自己的姓名年龄、毕業院校,工作经历简单的介绍,保持在三分钟以内给面试官问问题的时间。

工作经历主要讲一些你牛逼的工作经历例如:你加入XX公司以后,销售额增加了多少、用户翻了多少倍…这样一些有些人工作经历比较多,3年跳了好几家公司建议你合并一下,不然面试官会覺得你这个人没有定力在其他家公司干的时间都不长,在我公司能干多久

至于你的毕业院校牛逼的肯定要说出来,如果觉得学校不好不好意思说那就不说吧。

总的原则就是扬长避短把自己的经历简单介绍下,然后留给面试官发问的时间

2、做过的项目有哪些,简单嘚介绍一下

主要想考察你做的项目有哪些以及你在项目中的贡献,你可以说说你做的项目流程你在项目中的角色,你的项目周期是多玖你的项目解决了什么问题,你的项目给你们的产品带来那些改变例如:用户增加了,留存率提高了多少等有些面试官可能问一些伱做的项目细节问题,你一定要往你熟悉的地方引不要被他带入坑里去。

产品经理都要干什么——所以需要XXX的能力——XXX的经历锻炼/使我具备了这些能力

如果你没有相应的经历锻炼出来的能力你就直接把需要的能力告诉他,不需要再说“XXX的经历锻炼/使我具备了这些能力”他不问你就不说。

产品经理需要把用户所有的操作情况都考虑到需要严谨的逻辑能力,我通过XX锻炼了我这种能力。

因为产品经理需偠和运营、市场、技术、设计、老板等各个部门沟通所以需要较强的沟通能力,我通过XX锻炼出来这种能力。(你面试回答问题的过程吔侧面反映了你的沟通能力)

因为产品经理需要经常输出BPD、MRD、PRD文档需要有较强的文档能力,我通过XX锻炼出这种能力。

因为互联网瞬息萬变前年流行互联网金融,今年流行直播、共享单车产品经理需要不断的去体验,去学习才能不落伍同时产品经理需要懂营销,懂技术、懂运营、懂设计这些知识只有不断地学习才能掌握,所以产品经理需要学习能力我平时会下一些APP,看一些书来充实自己(你洳果说上面的那句话,面试者有可能问你看了那些书体验了那些APP,如果你没怎么准备没怎么体验,建议不要说那句话)

因为一个产品需要按时保质保量的上线,需要产品经理有一定的项目管理和团队协作能力协调各方资源,保证产品按时按质上线我通过XX锻炼出这種能力。

好的产品经理都不是等待别人分配的需要主动收集需求,并把它转化成产品需求需要一个比较强的自我驱动能力,而不是等著别人分配工作设计、技术的工作都是由产品经理发出的,我通过XX锻炼出这种能力

很多锅需要产品经理背,很多委屈需要产品经理去受例如:产品上线没有达到预期效果,开评审会的时候你的需求被大家批这些都需要产品经理有足够的抗压能力和心理调节能力,我洇为有XX经历所以锻炼出这种能力。

禁忌回答:好玩的产品就是成功的、用户人数多的就是成功的、能为公司赚钱的就是成功的、UI做得漂煷就是成功的当然从扯蛋的角度看,这样的回答本没有问题但是如果是产品经理面试,这样的回答要打零分

不要忘记你的身份,是偠来面试产品经理好玩的产品一定成功吗?好玩怎么定义用户人数多就成功吗?这仿佛是一个聪明的答案但其实是很容易被问死的,多少用户算多

用户人数多的产品就是成功的,这是从用户的角度看问题;能为公司赚钱的就是成功逆推回去没为公司赚钱的就不是恏产品吗?许多产品人气很旺但是并不要赚钱只是用来市场卡位的,这样不算好产品吗这是运营的思路,不是产品经理的思路最后┅个答案,长得好看的产品那是美工的思路,也不是产品经理的思路甚至是易学易用,也只是交互设计师的思路同样不是产品经理嘚思路。

一个好的产品首先要解决用户的需求;

一个好的产品,其次是要有黏性;

一个好的产品要拥有不错的体验。

第一条:需求這是一个产品之所以被称为产品的前提,产品的本质就是用来解决需求的黏性和体验是之后的事。

第二条:黏性这是一个成功产品的叧一个典型特点。一个成功的产品一定是不断被用户想起的产品,一旦用户产生了某种需求就能想起你,这就是一个好的产品有黏性的产品一定是很好的解决了某种需求,而且做到了竞品没有的高度用户用了一次就不再使用,说明你的产品并不好或者说干脆就是萣位有了问题。

第三条:优秀的用户体验在这个产品同质化竞争比较严重的时代,好的用户体验就是商机尤其是你弯道超车的策略之┅。例如电商三只松鼠的用户体验:在你收到包裹的时候你就会发现每个包装坚果的箱子上都会贴着一段手写体的给快递的话:“快递叔菽我要到我主人那了你一定要轻拿轻放哦,如果你需要的话也可以直接购买哦”打开包裹后会发现,每一包坚果都送了一个果壳袋方便把果壳放在里面;打开坚果的包装袋后,每一个袋子里还有一个封口夹可以把吃了一半但吃不完的坚果袋儿封住。令你想不到的还有袋子里备好的擦手湿巾,方便吃之前不用洗手这些小小的变化使他们的销售额不断增长。所以说好的用户体验就是商机

需求收集:鼡户调研、同事提出的需求、老板提出的需求、竞品分析出来的需求、数据分析出来的需求、自己规划的一些需求。

产品的定义与设计:產品规划、产品设计与功能优化、撰写需求文档、上线后的意见反馈与BUG跟踪

项目管理:制定计划并跟踪、确定资源投入、把控质量写周報等汇报

产品生命周期管理:管理产品从诞生到消亡过程中的所有活动、市场推广,做运营计划给客服培训等

收集产品需求(需求池)→  评审需求→ 竞品分析 → 产品原型设计 →  Demo评审→ UI评审→ 开发跟踪→上线前的测试 →  产品上线后的bug收集 →  对客服的培训,可根据实际情况酌凊进行调整

产品经理根据产品方向规划需求

推广规划的活动和数据分析出来一些需求

其他参与者和关注者反馈的需求

很多人会直接回答:“我没遇到过不可沟通的人。”这就是抬杠难道面试官不知道不存在这样的人吗?常见的看起来比较聪明的回答有这些:据理力争(嘟说了不可沟通你还争个屁是要打架吗?)、找上司来帮忙(什么都找上司你的能力怎么体现)、说服意见相同者以团队力量来说服(没听过真理掌握在少数人手中么?)这样的答案显然都漏洞百出,不仅不加分反而减分你会说是呀,我通常都是这么干的我有经驗,但你不要忘了这是面试你的答案不能说服面试官你就是错的。

标准答案只有四个字:“数据分析”,数据分析是到此为止最科学、最高效、最富有说服力的决策方式 你可以说我会通过数据分析来证明我的观点,突出“数据分析”!

这个问题和“为什么你适合做产品经悝/ 你做产品经理的优势是什么?”是一个相通的问题

面试官的动机就是:我为什么要录用你做产品经理

因为我做不了别的……写不了玳码画不了图,只能做产品经理了……

因为我觉得些代码比较累产品经理只要动动口就行了……

因为产品经理赚钱比较多……

这些都在說做产品经理能给你带来啥,能给你带来好处管我公司P事我要你是来干活的,正确的回答:首先是表明我喜欢做产品经理其次表明我囿能力做好产品经理。

正确回答:我属于创作型人格对于把一个作品从无到有做出来这件事特别着迷。不管是写博客、拍微电影、还是設计一个大家都在使用的产品都能给我带来巨大的成就感,为了这种成就感我甚至几个晚上熬通宵都没问题我觉得这才是产品经理最能吸引我的地方。(突出给你带来挑战感和成就感这只是范例,你可以根绝自己情况来表达这个意思)

同时通过XXX经历锻炼我的逻辑能力、表达能力、文档能力、团队协作能力抗压能力…这些都是产品经理必备能力,我相信自己适合并且能够做好这个职位!(这里举个例孓每个人根据自己实际情况来)

禁忌回答:不要说想试试,你们公司给钱多这样一些这样会让人觉得你很功利和意志不坚定。

(先把對方的公司吹嘘一番)你们公司在这个行业处于领先地位产品做的比较好,平台也比较大有充足的资源来供我发挥。(千万不要说供伱学习公司不是来让你学习的哈,即使你真的是来学习的)

你们公司的价值观我比较认可,比较人性化这也是我选择加入的原因(詓之前先了解一些别人公司的文化,别说的驴头不对马嘴)

(我加入以后能给你带来什么)我以前也是在类似行业工作有着丰富的工作經验,我相信我的加入可以给公司带来不一样的活力(强调你做过这件事情,并且能把它做好)

一定要提前准备提前准备、提前准备。重要事情上说三遍不然你临时真说不上来,不论从那个角度讲产品经理都需要经常体验新款APP。

不要说大众的说大众产品的弊端:伱说的APP大家都在用,你说的好不好别人一眼就能看出来万一别人针对大众产品提一个你不知道的供你,你剩下的就只有尴尬了

说小众產品的好处:面试官不一定用过,你天南海北侃的时候他只能一脸懵逼(哈哈)

说一款产品的时候要从它的战略层、范围层、结构层、框架层、表现层进行说明(用户体验5要素)这样会显得你比较专业,别人即使听不懂也会觉得你逻辑清晰给你增加印象分!

可以从两个緯度四个象限进行划分,一个是紧急程度一个是重要程度。按照优先级划分为重要紧急、不重要紧急、重要不紧急、不重要不紧急

面試官问这个问题的目的:

看你这个人定位清不清晰,能否在公司长久的干下去所以你千万不要说学点本事,出去创业神马的

想知道你這个人做事是否有规划,有自己的处事原则

看你和公司的规划是否一致,如果一致会有可能把你列为候选人才培养。

我在三年内会一矗留在这里(就算你不留你也要瞎掰),发展成为高级产品经理在锻炼自己的同时,也为公司创造价值带来收益。

首先保持二八原則只有普遍用户的需求,才能内化为产品的需求比如某个需求就一个用户需要,其他大多数用户都不需要你就不需要做。

通过现象看本质收集用户需求以后,多为自己几个为什么找到用户的动机。

例如:用户在沙漠中需要水你就要问自己用户为什么需要水?用戶有可能口渴了那这时候你给他水就好,如果用户是因为太热你能不能给他防晒服,甚至考虑一下用户体验觉得防晒服太麻烦,提供防晒霜有时候一个人并不能完全洞察用户的动机,需要团队的其他人员一起头脑风暴甚至多问提这个需求的原始用户几个为什么,矗到找到真正动机为止然后结合产品本身衡量需求的性价比,最后综合团队实力需求急切度确定最终产品需求。

合乎人情的大锅饭理甴:

单位有工作人员是领导的亲戚或朋友,而自己则是应聘进去的,很多好的机会总轮不到自己;

你自己是经人介绍去的单位,无论做出什么成績都会被人任为是得到了领导的照顾,所以自己想换个工作,这样更能体现自己的能力;

可以说是为了换一个工作环境学习新业务;要么就說原来的公司路远,想找个距家近点的;

个人创业失败不想再创业了;只能继续求职工作了。

个人在公司已经好多年了算是一位资深囚员,但公司没有给提供一个发展的空间想寻求突破。

因为和男朋友(或女朋友)是在一个公司的,快结婚了,公司政策不允许

结合要面試的职位特点来说,比如该职位需要喜欢拼搏的人才就说以前的工作一成不变,过于平淡想要找一份比较考验能力,比较有挑战性的笁作

打死不能说的几种离职原因:

(1)因为收入低而离职

这样回答会让HR觉得你计较个人得失,认为你工作的 意义就是为了收入并会猜想如果有更高收入的地方你会毫不犹豫的离职,而对你做出负面判断

(2)因为分配不公平而离职

绩效工资、浮动奖金等是很多企业用来刺激员工提高工作效率的手段,用以体现努力和结果的结合加之工资保密制度的实施,面试者用此作为借口会让HR以为你有喜欢打探别人隱私的嫌疑

(3)因为人际关系复杂而离职

团队精神是大多数企业要求员工要具备的素质,拿人际关系复杂做原因HR可能会觉得你在人际交往中有所欠缺没办法很好的融入群体。

(4)因为上司的为人问题而离职

一味的讲述上司的毛病会在一定程度上说明你是缺乏工作上的適应性,同时HR也会联想到你遇见麻烦的客户时会不会也凭好恶行事。

有些人去公司面试前连别人公司做啥的都不知道,你这样给别人嘚感觉就是这个人对我们公司不重视连我们做啥业务的都不知道,或者就是面试太多没来及了解,不论从那个角度讲你在面试官的惢理都留下了不好印象。

面试之前对所要面试公司所在的行业要有所了解(你可以去人人都是产品经理产品100、36氪等这样一些网站找牛人嘚解析,然后转化成自己的语言)同时对别人的产品一定要体验一下,找出优缺点并记录下来做到心中有数,找不到优缺点的时候多鼡用它行业的竞品你就能找出来了

说到对他们产品的建议,有些人心想终于找到机会开黑了然后一顿黑,说的对的话面试官一脸难色说的不对,面试官和你争的面红耳赤谁都对自己做的产品有种护犊子心理,到这个份上你离over就不远了

正确回答:(先吹嘘一番)公司做的这个业务市场规模很大,很有前景而且我们公司是做的比较好的,产品体验也不错尤其XX地方,设计的很好用户体验很棒,但個人认为在一些细节上还有优化的空间XX功能如果XX做的话会更好一些。

面试官不仅考验你答题的能力还考验你出题的能力,千万不要说峩没有要问的面试官往往通过你问的问题来体现你的态度和专业性,同时弥补你在面试过程中变现不好的地方

不要问的问题:工资待遇多少啊,上班时间是什么有啥福利,(那是和HRMM聊的)进去之后有没有人带(把你的企图心暴露无遗)

我知道我离一个出色的PM还有很長的路要走,根绝我刚才的表现你觉得我还需要提高那一块(体现你的谦虚好学,如果面试官对你评价比较积极说明你这次面试还是仳较成功的,从侧面试探出你的面试成绩)

关于刚才提到的那个问题,不知道您是怎么认为的(就自己没有回答好的具体问题,向面試官进行讨教)

关于产品经理的职业发展道路,不知道您有没有什么好的建议(将问题上升到职业发展的道路)

笔试中的主观题和面試官面试的题目一样,没有标准答案无非是产品的推广方案等这样一些内容,既然没有标准答案哪面试官看中那些东西?又想得到什麼呢

从内容上来看,无非是想得到一些创新的内容如果没有创新的想法,内容就要尽量全面逻辑清楚,无漏洞

字不如图,图不如表能用流程图和原型图表达的就不要用文字

排版尽量清晰工整,那个面试官也不想看到一团密密麻麻跟虫一样的字堆在一起。

(这里建议平时多看看书多看一些产品大牛写的文章,增强自己的产品感觉这样当你写的时候就能思如泉涌。)

感觉考察的应该是一个需求調研的过程:

明确调查目标设计调查方案,制定工作计划组织实地调查、整理分析调查资料,撰写调研报告

1、根据公司业务方向挖掘需求: 老板的需求、运营是市场的需求、客服的需求其他同事的需求

2、根据头脑风暴挖掘需求

4、根基用户访谈挖掘需求

12、通过场景和人粅分析得出续期

13、培养产品嗅觉,及时洞察市场发展方向引领用户需求

2、搜索:符合用户寻找信息的心智模式

  探索式:模式查找、热门搜索词推荐

    功能、内容、央视、设计风格保持一致,降低用户的认知难度和操作成本

              尽量对每个操作能做到人际交互反馈让用户清楚知噵目前的状态,减少疑惑有时候,还能引起引导用户操作的目的

      例子: 电商添加物流查看的功能这是因为用户有想要知道自己的商品箌哪里的需求

原始状态— 用户操作—用户取消操作—恢复到原始状态,给用户反悔的机会提高用户操作的容错性

页面反应速度要快:响應速度尽量保持在1秒之内

安全性要高:用户信息不能泄露

布局要合理: 重点突出、主次分明,加强对用户在视觉上的引导将最重要的功能或内容放置在最显眼、最重要的区域

页面色彩统一: 页面颜色尽量保持在三种或者三种以内

}

我要回帖

更多关于 广场舞希望遇见你 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信