记一次 Android 面试

最近老同事给内推了链家网的 Android 职位,由于时间仓促,加上近半年多一直处于忙碌地开发状态中,还没能复习便接到了电话面试。

虽然大部分问题都答上来了,原理性的问题基本都把大体流程说出来了,但是时间间隔太久不少具体细节记不太清了,描述得不够详细,因此并没能达到面试官的期望值。

对于自己的表现,基本在自己的预期中,谈不上好,也谈不上太差,还算中规中矩,只是一面都没过,自己还是挺失落的(自己真的是有点自信过了头,觉得不复习也能轻松过一面 o(╥﹏╥)o )

之前在内推的简历前还特意对一些项目的功能实现加了些描述,因为功能其实挺复杂的,需要结合很多知识点,并且自己做了最大化的优化,遗憾的是面试官竟然没有问到任何一个跟项目相关的问题(这点跟我面试别人的时候完全不同,我喜欢根据项目去拓展问题)。

总的来说面试的问题并不是太难,但是需要静下心来花时间好好复习,趁着面试刚过去两三天,还能记得大部分面试问题,抽了些时间将电话面试中的问题做了下整理(后续会补上答案),方便自己后续复习,也希望能帮助到大家。

题目整理

  1. StringBuilder 和 StringBuffer 区别

StringBuilder 跟 StringBuffer 一样,都是用来处理可变的字符序列 , 区别在于 StringBuilder 是线程不安全的 ,而 StringBuffer 是线程安全的
在运行效率上,StringBuilder 比 StringBuffer 要高, 因此在不考虑线程安全的情况下,推荐使用 StringBuilder。

  1. String 在 jvm 中的设计原理

深入理解Java:String

  1. synchronized Lock 区别

详解synchronized与Lock的区别与使用
深入研究 Java Synchronize 和 Lock 的区别与用法

  1. java 中 sleep() 跟 wait() 区别,项目中 Thread sleep 的应用场景
  • sleep() 属于 Thread 类
    线程调用此方法后,会休眠一段时间,休眠期间,会暂时释放cpu,但并不释放对象锁
  • wait() 属于 Object 类
    释放占有的对象锁,线程进入等待池,释放cpu,而其他正在等待的线程即可抢占此锁,获得锁的线程即可运行程序
  1. sychronized 锁住方法后方法能被中断吗?

不能被中断,Lock 可以被中断

  1. java 中 final 修饰方法和修饰类的作用

  2. ArrayList 和 LinkedList 区别

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

Java集合---ArrayList的实现原理

  1. Java 动态代理 Proxy 类的使用

详解java动态代理机制以及使用场景(一)

  1. Java的反射机制,原理,应用场景,getDeclaredField和getField 的 区别

  2. java 单例设计模式,双重检测写法中两个判空的原因

  3. Android 整个界面布局,父子组件的绘制流程以及单个子 View 的绘制流程

  4. Android 事件分发机制原理相关代码,如何处理父子布局的嵌套滚动

  5. 自定义 View 中,onMeasure 中 MeasureSpec 的 Spec 有几种类型, 以及他们的作用,在其值为 EXACTLY 的情况下, 当子 View 超过父 View 大小时, 返回的宽高值是什么,是否会超过父布局

  6. Activity 的启动渲染流程, AMS, ActivityThread 相关概念

  7. Android 解析 XML 有几种方式? LayoutInflate 是如何解析 XML 并创建对象的(面试官是想问这里用的反射的方式创建的对象)

  8. Android 中代理模式的应用场景

  9. Android 中 Binder 的原理机制, 其中 ServiceManager 传递给 Client 的进程是否为真实进程

  10. Android 中 Handler 的原理机制

  11. Android 中 Service 的概念, IntentService 和 Service 区别,在 IntentService 中是否需要手动终止 Service, Service 的使用场景

  12. Android 中跨进程通信的方式, 应用场景, aidl 相关概念

  13. Dalvik 和 JVM 的区别

1.Dalvik指令集是基于寄存器的架构,执行特有的文件格式——dex字节码(适合内存和处理器速度有限的系统)。而JVM是基于栈的。相对于基于栈的JVM而言,基于寄存器的Dalvik VM实现虽然牺牲了一些平台无关性,但是它在代码的执行效率上要更胜一筹。
2.每一个Android 的App是独立跑在一个VM中的。因此一个App crash只会影响到自身的VM,不会影响到其他。Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个 Dalvik应用作为一个独立的Linux进程执行。

  1. pathclassloader, dexclassloader 区别

DexClassLoader和PathClassLoader的区别

  1. Android 插件化的实现原理机制

  2. Android 热修复的主流框架对比及实现原理

  3. 一个界面中需要请求多个接口,所有接口数据获取后再进行界面渲染,请问如何来实现

  4. RxJava 中 merge, zip 的实现原理

  5. 自定义 View 中如何实现圆形图片

  6. 说说你常用的图片框架以及实现原理(glide, fresco)

  7. Android 中 65535 问题中 MultiDex 的实现原理

  8. Android 中内存泄漏的常见场景(我回答了项目中遇到的非静态内部类/匿名内部类,Handler,异步操作引用了 Context,面试官多次询问是否还有其他场景后补充了自定义 View 中 TypeArray 使用后未调用 recycle()方法也会泄漏)

  9. Android 中如何开启新的进程,Manifest 中 process 参数命名加 “:” 什么作用

  10. 如何快速将一个单向链表反序操作

  11. 冒泡排序的实现

推荐阅读更多精彩内容