Android面试

写在前面:

最近在找工作,面试的时候被问到一些很基础的问题,明明知道怎么实现的但是就是说不完整,归根结底还是自己基础不够扎实,特此将遇到的或者可能会遇到的这些问题记录下来。

1. Java 基础之 String、StringBuilder、StringBuffer、CharSequence 区别
  1. CharSequence接口:是一个字符序列.String StringBuilder 和 StringBuffer都实现了它.
  1. String类:是常量,不可变.
  2. StringBuilder类;只可以在单线程的情况下进行修改(线程不安全).
  3. StringBuffer类:可以在多线程的情况下进行改变(线程安全).

PS:Stringbuilder比StringBuffer效率高,应该尽量使用StringBuilder.

2. Android开发中何时使用多进程
  1. 一般情况下,Android中一个应用程序就是一个进程,这个进程名称就是应用程序包名。
  1. 创建新进程:我们的四大组件在AndroidManifest文件中注册的时候,有个属性是android:process:
  2. 再设置android:process属性时候,有个地方需要注意:如果是android:process=":deamon",以:开头的名字,则表示这是一个应用程序的私有进程,否则它是一个全局进程。一般我们都是有私有进程,很少使用全局进程
3. 设备横竖屏切换的时候,接下来会发生什么
  1. 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏是会执行两次。
  1. 设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。
  2. 设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
  3. 特别说明:当API >12时,需要加入screenSize属性,否则屏幕切换时即使设置了orientation系统也会重建Activity
4. ListView优化
  1. 复用convertView
  1. 使用ViewHolder
  2. item中有图片时,异步加载,对图片进行适当压缩
  3. 快速滑动时,不加载图片
  4. 数据多时进行分批和分页加载
5. Android 关于安全的问题,你所知道的所有的安全问题
  1. 错误导出组件
  1. 参数校验不严
  2. WebView引入各种安全问题
  3. 不混淆、不防二次打包
  4. 明文存储关键信息
  5. 错误使用HTTPS
  6. 山寨加密方法
6. Android 应用第二次登录实现自动登录
  1. 第一次登陆getUserInfo里带有一个长效token,该长效token用来判断用户是否登陆和换取短token
  1. 把长效token保存到SharedPreferences
  2. 接口请求用长效token换取短token,短token服务端可以根据你的接口最后一次请求作为标示,超时时间为一天。
  3. 所有接口都用短效token
  4. 如果返回短效token失效,执行3再直接当前接口
  5. 如果长效token失效(用户换设备或超过两周),提示用户登录。

7. 静态内部类、内部类、匿名内部类,为什么内部类会持有外部类的引用?持有的引用是this?还是其它?

1.静态内部类:使用static修饰的内部类
2.匿名内部类:使用new生成的内部类
3.因为内部类的产生依赖于外部类,持有的引用是类名.this。

8. DVM与JVM分别是什么,他们之间有什么区别

  1. DVM(Dalvik Virtual Machine)是Android的虚拟机,我们都知道,Android也是用Java开发的,但是最终编译的时候不是生成.class文件,而是生成.dex文件,DVM负责执行的就是.dex文件,而JVM(Java Virtual Machine)是Java的虚拟机,它执行的就是.class文件。
  1. DVM是基于寄存器的虚拟机,而JVM执行是基于虚拟栈的虚拟机。寄存器存取速度比栈快的多,DVM可以根据硬件实现最大的优化,比较适合移动设备。
  2. .class文件存在很多的冗余信息,dex工具会去除冗余信息,并把所有的.class文件整合到.dex文件中。减少了I/O操作,提高了类的查找速度。

9. 引起内存泄漏的情况

  1. 对于使用了BraodcastReceiver,ContentObserver,File,游标 Cursor,Stream,Bitmap等资源的使用,应该在Activity销毁时及时关闭或者注销。
  1. 静态内部类持有外部成员变量(或context):可以使用弱引用或使用ApplicationContext。
  2. 内部类持有外部类引用,异步任务中,持有外部成员变量。
  3. 集合中没用的对象没有及时remove。
    不用的对象及时释放,如使用完Bitmap后掉用recycle(),再赋null。
  4. handler引起的内存泄漏,MessageQueue里的消息如果在activity销毁时没有处理完,就会引起内存的泄漏,可以使用弱引用解决。
  5. 构造Adapter时,没有使用缓存的convertView。
  6. 设置过的监听不用时,及时移除。如在Destroy时及时remove。尤其以addListener开头的,在Destroy中都需要remove。
  7. activity泄漏可以使用LeakCanary。

10. 网络优化

  1. 不用域名,直接ip直连:省去DNS大约几百毫秒的解析时间,同时也防止域名劫持的这种危险。
  1. 连接复用:节省连接建立时间,如开启keep-alive。
  2. 请求合并:将多个请求合并为一个请求。
  3. 减小请求数据大小,减小返回数据大小。
  4. 数据缓存:缓存获取到的数据,在一定有效时间内再次请求可以从存中读取数据。
  5. 使用Gzip压缩request和response。

11. Java中ArrayList和LinkedList区别

  1. ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
  1. 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
  2. 对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。

12. hashMap与hashTable的区别

  1. HashMap不是线程安全的,HashTable是线程安全的一个Collection。
  1. HashMap允许null key和null value,而hashtable不允许。
  2. HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。

写在最后

持续更新,未完待续。。。

你可能感兴趣的:(Android面试)