面试,一个老生常谈的话题,相信新手去面试都会灰常的紧张,怎么办呐?紧张的原因基本都是没有准备好,所以今天代码君打算结合以往自己的经历,给大家总结下Android面试中常问的问题,希望对你们有帮助。
Java部分总结
-
静态内部类、内部类、匿名内部类区别
- 静态内部类:使用static修饰的内部类
- 内部类:就是在某个类的内部又定义了一个类,内部类所嵌入的类称为外部类
- 匿名内部类:使用new生成的内部类
-
String、StringBuffer与StringBuilder的区别
- String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象
- StringBuffer和StringBuilder底层是 char[]数组实现的
- StringBuffer是线程安全的,而StringBuilder是线程不安全的
-
Java有哪几种引用
- 强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM 也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象
- 软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。
- 弱引用:具有弱引用的对象拥有的生命周期更短暂。因为当 JVM 进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象
- 虚引用:顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。
Java回收机制是怎么样的?
Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。-
ArrayList与LinkedList的区别
- ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
- 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
- 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
Android 部分总结
-
Android 线程间通信有哪几种方式
- 共享内存(变量);
- 文件,数据库;
- Handler;
- Java 里的 wait(),notify(),notifyAll()
-
Activity和Fragment生命周期有哪些?
- Activity——onCreate->onStart->onResume->onPause->onStop->onDestroy
- Fragment——onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume->onPause->onStop->onDestroyView->onDestroy->onDetach
-
Activity的几种LaunchMode及使用场景
- standard 模式:这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。使用场景:大多数Activity。
- singleTop 模式:如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。使用场景如新闻类或者阅读类App的内容页面。
- singleTask 模式:如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。使用场景如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。
- singleInstance 模式:一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。使用场景如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。
View的绘制过程
一个View要显示在界面上,需要经历一个View树的遍历过程,这个过程又可以分为三个过程,也就是自定义View中的三要素:大小,位置,画什么,即onMesure(),onLayout(),onDraw()。-
Touch事件的传递机制
- dispatchTouchEvent(MotionEventev); //用来分派event
- onInterceptTouchEvent(MotionEventev);//用来拦截event
- onTouchEvent(MotionEventev);//用来处理event
-
ListView卡顿的原因,如何进行性能优化?
- 重用converView: 通过复用converview来减少不必要的view的创建,另外Infalte操作会把xml文件实例化成相应的View实例,属于IO操作,是耗时操作。
- 使用 RecycleView 代替listview: 每个item内容的变动,listview都需要去调用notifyDataSetChanged来更新全部的item,太浪费性能了。RecycleView可以实现当个item的局部刷新,并且引入了增加和删除的动态效果,在性能上和定制上都有很大的改善
-
如何避免内存泄漏?
- 适配器里的Item复用
- 广播注册后不用及时关闭
- 长时间持有垃圾对象,导致回收不了
- 尽量使用application里的context
-
常用的设计模式有几种?
- 单例模式
- 建造者模式
- 装饰模式
- 动态代理
- 适配器模式
- 策略模式
- 工厂模式
图片加载框架有几种,各自的优缺点?
- Glide的优点
- Glide默认bitmap格式是GB565,内存占用小
- Glide更易用除了传递context,还可以传递activity和fragment
- Glide存储的是imageview的大小,就省了重新调整图片大小的步骤,加载速度会变快
- glide是基于Picasso的,进行大量的优化改进
- Fresco
- 优点:图片渐进式呈现 ,通过在Native做处理大大减少OOM
- 缺点:功能强大但是相比于其他体积过大,除非需要图片社交,不然大材小用,使用比较复杂
- Picasso 图片过期采用LRU淘汰算法 glide完胜他
总结
找工作是每个人都会遇到的难题,代码君前几天出了一篇如何写简历的文章,今天又写了一篇面试问题总结,相信结合着两篇文章,应该会对职场新人找工作有很大帮助的,最后祝大家找到理想的工作。