最近老同事给内推了链家网的 Android 职位,由于时间仓促,加上近半年多一直处于忙碌地开发状态中,还没能复习便接到了电话面试。
虽然大部分问题都答上来了,原理性的问题基本都把大体流程说出来了,但是时间间隔太久不少具体细节记不太清了,描述得不够详细,因此并没能达到面试官的期望值。
对于自己的表现,基本在自己的预期中,谈不上好,也谈不上太差,还算中规中矩,只是一面都没过,自己还是挺失落的(自己真的是有点自信过了头,觉得不复习也能轻松过一面 o(╥﹏╥)o )
之前在内推的简历前还特意对一些项目的功能实现加了些描述,因为功能其实挺复杂的,需要结合很多知识点,并且自己做了最大化的优化,遗憾的是面试官竟然没有问到任何一个跟项目相关的问题(这点跟我面试别人的时候完全不同,我喜欢根据项目去拓展问题)。
总的来说面试的问题并不是太难,但是需要静下心来花时间好好复习,趁着面试刚过去两三天,还能记得大部分面试问题,抽了些时间将电话面试中的问题做了下整理(后续会补上答案),方便自己后续复习,也希望能帮助到大家。
题目整理
- StringBuilder 和 StringBuffer 区别
StringBuilder 跟 StringBuffer 一样,都是用来处理可变的字符序列 , 区别在于 StringBuilder 是线程不安全的 ,而 StringBuffer 是线程安全的
在运行效率上,StringBuilder 比 StringBuffer 要高, 因此在不考虑线程安全的情况下,推荐使用 StringBuilder。
- String 在 jvm 中的设计原理
- synchronized Lock 区别
详解synchronized与Lock的区别与使用
深入研究 Java Synchronize 和 Lock 的区别与用法
- java 中 sleep() 跟 wait() 区别,项目中 Thread sleep 的应用场景
- sleep() 属于 Thread 类
线程调用此方法后,会休眠一段时间,休眠期间,会暂时释放cpu,但并不释放对象锁- wait() 属于 Object 类
释放占有的对象锁,线程进入等待池,释放cpu,而其他正在等待的线程即可抢占此锁,获得锁的线程即可运行程序
- sychronized 锁住方法后方法能被中断吗?
不能被中断,Lock 可以被中断
java 中 final 修饰方法和修饰类的作用
ArrayList 和 LinkedList 区别
- ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
- 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
- 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
- ArrayList 的实现原理,是否允许数据重复
- Java 动态代理 Proxy 类的使用
Java的反射机制,原理,应用场景,getDeclaredField和getField 的 区别
java 单例设计模式,双重检测写法中两个判空的原因
Android 整个界面布局,父子组件的绘制流程以及单个子 View 的绘制流程
Android 事件分发机制原理相关代码,如何处理父子布局的嵌套滚动
自定义 View 中,onMeasure 中 MeasureSpec 的 Spec 有几种类型, 以及他们的作用,在其值为 EXACTLY 的情况下, 当子 View 超过父 View 大小时, 返回的宽高值是什么,是否会超过父布局
Activity 的启动渲染流程, AMS, ActivityThread 相关概念
Android 解析 XML 有几种方式? LayoutInflate 是如何解析 XML 并创建对象的(面试官是想问这里用的反射的方式创建的对象)
Android 中代理模式的应用场景
Android 中 Binder 的原理机制, 其中 ServiceManager 传递给 Client 的进程是否为真实进程
Android 中 Handler 的原理机制
Android 中 Service 的概念, IntentService 和 Service 区别,在 IntentService 中是否需要手动终止 Service, Service 的使用场景
Android 中跨进程通信的方式, 应用场景, aidl 相关概念
Dalvik 和 JVM 的区别
1.Dalvik指令集是基于寄存器的架构,执行特有的文件格式——dex字节码(适合内存和处理器速度有限的系统)。而JVM是基于栈的。相对于基于栈的JVM而言,基于寄存器的Dalvik VM实现虽然牺牲了一些平台无关性,但是它在代码的执行效率上要更胜一筹。
2.每一个Android 的App是独立跑在一个VM中的。因此一个App crash只会影响到自身的VM,不会影响到其他。Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个 Dalvik应用作为一个独立的Linux进程执行。
- pathclassloader, dexclassloader 区别
Android 插件化的实现原理机制
Android 热修复的主流框架对比及实现原理
一个界面中需要请求多个接口,所有接口数据获取后再进行界面渲染,请问如何来实现
RxJava 中 merge, zip 的实现原理
自定义 View 中如何实现圆形图片
说说你常用的图片框架以及实现原理(glide, fresco)
Android 中 65535 问题中 MultiDex 的实现原理
Android 中内存泄漏的常见场景(我回答了项目中遇到的非静态内部类/匿名内部类,Handler,异步操作引用了 Context,面试官多次询问是否还有其他场景后补充了自定义 View 中 TypeArray 使用后未调用 recycle()方法也会泄漏)
Android 中如何开启新的进程,Manifest 中 process 参数命名加 “:” 什么作用
如何快速将一个单向链表反序操作
冒泡排序的实现