前言:
前一段时间和大牛们交流了一下,据反馈现在Android岗位也没有以前那么多了,没这么好找了,面临着互联网的寒冬,不仅仅是Android,大量公司模仿O2O模式导致死掉企业的很多,在加之培训机构大量的培训人,导致供大于求,当然这不意味着饱和,只是市场更趋于合理一些(只要技术好不用怕的)。最近结合一些面试的同学和大牛们反馈,前几天有大牛去阿里面试顺便整理了下一些面试题目。希望对大家有所帮助,后期会不断更新添加新的面试题。可以帮大家查漏不缺。以下是(阿里、腾讯、百度、华为、和字节跳动的试题汇集)
就算写出答案也没必要(我写了部分面试答案,有需要的朋友可以浏览文末资料领取全部),因为开发与实际答案会有所不同,再者怕误导大家,所以这些面试题答案还是自己去理解吧!切记:不要背答案,多理解。
Android高级总结
1.说下你所知道的设计模式与使用场景
2.Java语言的特点与OOP思想3.说下java中的线程创建方式,线程池的工作原理。4.说下handler原理5.内存泄漏的场景和解决办法**6.如何避免OOM? **答:1.使用更加轻量的数据结构:如使用ArrayMap/SparseArray替代HashMap,HashMap更耗内存,因为它需要额外的实例对象来记录Mapping操作,SparseArray更加高效,因为它避免了Key Value的自动装箱,和装箱后的解箱操作
2.便面枚举的使用,可以用静态常量或者注解@IntDef替代3.Bitmap优化:a.尺寸压缩:通过InSampleSize设置合适的缩放b.颜色质量:设置合适的format,ARGB_6666/RBG_545/ARGB_4444/ALPHA_6,存在很大差异c.inBitmap:使用inBitmap属性可以告知Bitmap×××去尝试使用已经存在的内存区域,新解码的Bitmap会尝试去使用之前那张Bitmap在Heap中所占据的pixel data内存区域,而不是去问内存重新申请一块区域来存放Bitmap。利用这种特性,即使是上千张的图片,也只会仅仅只需要占用屏幕所能够显示的图片数量的内存大小,但复用存在一些限制,具体体现在:在Android 4.4之前只能重用相同大小的Bitmap的内存,而Android 4.4及以后版本则只要后来的Bitmap比之前的小即可。使用inBitmap参数前,每创建一个Bitmap对象都会分配一块内存供其使用,而使用了inBitmap参数后,多个Bitmap可以复用一块内存,这样可以提高性能4.StringBuilder替代String: 在有些时候,代码中会需要使用到大量的字符串拼接的操作,这种时候有必要考虑使用StringBuilder来替代频繁的“+”5.避免在类似onDraw这样的方法中创建对象,因为它会迅速占用大量内存,引起频繁的GC甚至内存抖动6.减少内存泄漏也是一种避免OOM的方法
7.说下Activity的启动模式,生命周期,两个Activity跳转的生命周期,如果一个Activity跳转另一个Activity再按下Home键在回到Activity的生命周期是什么样的
8.onRestart的调用场景9.是否了SurfaceView,它是什么?他的继承方式是什么?他与View的区别(从源码角度,如加载,绘制等)。10.如何实现进程保活答:a: Service设置成START_STICKY kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样
b: 通过 startForeground将进程设置为前台进程, 做前台服务,优先级和前台应用一个级别,除非在系统内存非常缺,否则此进程不会被 killc: 双进程Service: 让2个进程互相保护对方,其中一个Service被清理后,另外没被清理的进程可以立即重启进程d: 用C编写守护进程(即子进程) : Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影响(Android5.0以上的版本不可行)联系厂商,加入白名单e.锁屏状态下,开启一个一像素Activity
11.说下冷启动与热启动是什么,区别,如何优化,使用场景等。
12.为什么冷启动会有白屏黑屏问题?13.Android中的线程有那些,原理与各自特点14.ANR的原因15.三级缓存原理16.LruCache底层实现原理:17.说下你对Collection这个类的理解。18.JVM老年代和新生代的比例19.jvm,jre以及jdk三者之间的关系?JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。20.谈谈你对 JNIEnv 和 JavaVM 理解?21.Serializable与Parcable的区别?Android多线程总结
1.什么是线程
2.线程的状态3.线程的创建4.线程中断5.Thread为什么不能用stop方法停止线程答:1.即刻抛出ThreadDeath异常,在线程的run()方法内,任何一点都有可能抛出ThreadDeath Error,包括在catch或finally语句中。
2.释放该线程所持有的所有的锁。调用thread.stop()后导致了该线程所持有的所有锁的突然释放,那么被保护数据就有可能呈现不一致性,其他线程在使用这些被破坏的数据时,有可能导致一些很奇怪的应用程序错误。
6.重入锁与条件对象,同步方法和同步代码块
7.volatile关键字8.java内存模型9.原子性 可见性 有序性10.线程池ThreadPoolExecutor11.线程池的种类12.线程同步机制与原理,举例说明13.arrayList与linkedList的读写时间复杂度14.为什么HashMap线程不安全(hash碰撞与扩容导致)答:HashMap的底层存储结构是一个Entry数组,每个Entry又是一个单链表,一旦发生Hash冲突的的时候,HashMap采用拉链法解决碰撞冲突,因为hashMap的put方法不是同步的,所以他的扩容方法也不是同步的,在扩容过程中,会新生成一个新的容量的数组,然后对原数组的所有键值对重新进行计算和写入新的数组,之后指向新生成的数组。当多个线程同时检测到hashmap需要扩容的时候就会同时调用resize操作,各自生成新的数组并rehash后赋给该map底层的数组table,结果最终只有最后一个线程生成的新数组被赋给table变量,其他线程的均会丢失。而且当某些线程已经完成赋值而其他线程刚开始的时候,就会用已经被赋值的table作为原始数组,这样也会有问题。扩容的时候 可能会引发链表形成环状结构
15.进程线程的区别
16.Binder的内存拷贝过程17.传统IPC机制的通信原理(2次内存拷贝)18.Java内存模型(记住堆栈是内存分区,不是模型)19.类的加载过程20.什么情况下会触发类的初始化21.双亲委托模式22.双亲委托模式的好处23.死锁的产生条件,如何避免死锁24.App启动流程25.Android单线程模型26.RecyclerView在很多方面能取代ListView,Google为什么没把ListView划上一条过时的横线?27.HashMap如何保证元素均匀分布Android View总结
1.View的滑动方式
2.View的事件分发机制3.View的加载流程4.View的measure layout 和 draw流程5.自定义view需要注意的几点HR问题汇总
1您在前一家公司的离职原因是什么?
2讲一件你印象最深的一件事情;3介绍一个你影响最深的项目;4介绍你最热爱最擅长的专业领域;5公司实习最大的收获是什么;6与上级意见不一致时,你将怎么办;7自己的优点和缺点是什么?并举例说明?8你的学习方法是什么样的?实习过程中如何学习?实习项目中遇到的最大困难是什么以及如何解决的;9说一件最能证明你能力的事情;10针对你你申请的这个职位,你认为你还欠缺什么;11如果通过这次面试我们单位录用了你,但工作一段时间却发现你根本不适合这个职位,你怎么办;12项目中遇到最大的困难是什么?如何解决的;13你的职业规划以及个人目标;未来发展路线及求职定位;14如果你在这次面试中没有被录用,你怎么打算;15评价下自己,评价下自己的技术水平,个人代码量如何;16通过哪些渠道了解的招聘信息,其他同学都投了哪些公司;17业余都有哪些爱好;18你做过的哪件事最令自己感到骄傲;19假如你晚上要去送一个出国的同学去机场,可单位临时有事非你办不可,你怎么办;20就你申请的这个职位,你认为你还欠缺什么;21当前的offer状况;如果BATH都给了offer该如何选;22你对一份工作更看重哪些方面?平台,技术,氛围,城市,money;23理想薪资范围;杭州岗和北京岗选哪个;24理想中的工作环境是什么;25谈谈你对跳槽的看法;26说说你对行业、技术发展趋势的看法;27实习过程中周围同事/同学有哪些值得学习的地方;28家人对你的工作期望及自己的工作期望;29如果你的工作出现失误,给本公司造成经济损失,你认为该怎么办;30若上司在公开会议上误会你了,该如何解决;31是否可以实习,可以实习多久;32在五年的时间内,你的职业规划;33你看中公司的什么?或者公司的那些方面最吸引你。我是以专题的形式来分析关于Android面试通过秘籍,整理资料不易,在Android学习或者在面试方面有需要提升,准备的朋友可以加入我的技术交流群里面不仅仅有Android各类专题面试资料,BAT高级源码面试题,还有提供学习的系统进阶视频资料,现在面对找工作的困境,需要提升自己的朋友们推荐加入。