头条一面:
1.最近公司做的项目?性能优化做了哪些工作?
网络请求回来,Activity被销毁了,怎么避免?取消回调;
LifeCircle.addObserver()设置标识位,回调时判断
总结:优化项目要说明背景,收益。
2.Fragment和Activity如何通信?
除了ViewModel,直接定义方法调用;接口回调;发广播;EventBug消息总线;
View预加载,异步加载(AsyncInflate)
3.ConstraintLayout去除,如何本地衡量优化结果?(onFrame回调,messageQueue.dispatchMessage方法前后日志)
4.内存泄漏怎么发生的?举例?如何避免呢?Handler消息内存泄漏原理
内部类为什么持有外部类的引用?
编译器会为非静态内部类生成单独的class文件,构造方法中将外部类实例作为参数传递进去。
解决:静态内部类+弱引用;handler.removeCallback;
// OuterClass$InnerClass.class
class OuterClass$InnerClass {
private OuterClass$InnerClass(OuterClass var1) {
this.this$0 = var1;
}
}
5.内存优化怎么做的,什么工具?
LeakCanary;MAT;LeakCanary原理?
6.如何实现一个半圆形抽奖转盘?
7.Activity启动模式:SingleTop/SingleTask区别,适用场景
8.二叉树的最大深度.递归和迭代
Okhttp?Robust?LeakCanary原理
Https协议怎么握手的?对称加密和非对称加密细节?
HashCode和equals 方法
1.如果两个对象相同,那么它们的hashCode值一定要相同;
2.如果两个对象的hashCode相同,它们并不一定相同(这里说的对象相同指的是用eqauls方法比较)。
如不按要求去做了,会发现相同的对象可以出现在Set集合中,同时,增加新元素的效率会大大下降。
3.equals()相等的两个对象,hashcode()一定相等;equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。
换句话说,equals()方法不相等的两个对象,hashcode()有可能相等(我的理解是由于哈希码在生成的时候产生冲突造成的)。反过来,hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。
二,三面:
开发过程中遇到的问题?
LifeCircle用在MVP上?
注解 /字节码使用 ?Dagger?
AppBundle , Hotfix 原理?
Robust原理?
插桩:方法数增加 导致不能内联问题--->某些行数少的方法就不插桩,
super调用-->java字节码指令invokeSuper
NIO java I/O 对比:
I/O面向数据流,NIO面向缓存区
I/O是阻塞的,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。
NIO是非阻塞的 ,一个单独的线程现在可以管理多个输入和输出通道
Serializable vs parcelable
Serializalbe会使用反射,序列化和反序列化过程需要大量I/O操作,Parcelable自已实现封装和解封(marshalled &unmarshalled)操作不需要用反射,数据也存放在Native内存中,效率要快很多。
反射效率为什么低:
反射操作 主要通过JVM执行,所以时间成本会高于直接执行相同操作的时间
- 因为接口的通用性,Java的invoke方法是传object和object[]数组的。基本类型参数需要装箱和拆箱,产生大量额外的对象和内存开销,频繁促发GC。
- 编译器难以对动态调用的代码提前做优化,比如方法内联。
- 反射需要按名检索类和方法,有一定的时间开销。
mmap什么时候用 ?
匿名共享内存:
open,文件描述符fd, mmap使得进程之间通过映射同一个普通文件实现内存共享。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用write(),read()等操作。
SharedPreference的替代?
腾讯的 MMKV原理:
利用mmap内存映射文件,提供一段可随时写入的内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心 crash 导致数据丢失。
使用protobuf 协议,pb 在性能和空间占用上都有不错的表现
Android数据存储方法都有哪些?如何优化性能
异步加载View遇到问题?handler ? view的context?
插件化?模块动态加载
App的整体架构? 中台?功能feature。
线程池几个参数作用
性能优化?造成卡顿都有什么原因?
内存优化怎么做的?内存泄漏。。。LeakCanary原理
H5白屏怎么检测?端上怎么埋点?
WebView SDK都有哪些功能?jsBridge 怎么实现?WebView兼容性问题?
MVP/MVVM场景?差异
技术需求占比?团队最近在做的一些事情?
关注团队其他成员的任务,比如MKVM?模块动态加载。
App 有几个进程?
Content Provider 用过吗?回答没怎么用过。应该说一下即使没用过,但是还是了解过一些。
项目经验,平时开发过程中总结很重要!
关注组里其他成员的任务并了解原理。
多看优秀源码,学习总结框架思想
四面:
1.印象最深刻的项目?最有成就的项目?遇到问题如何解决的
2.为什么离职?不符合预期原因是什么?
3.学习源码或平时开发过程中有没有设计得特别好的框架?
4.性能优化工具都有什么?TraceView和Systrace区别
5.如何判断一个字符串是合法IP地址,考察是否仔细,能够考虑到异常case
用到的Integer.valueOf()具体实现是怎样的
回答:空判断;长度判断;是否包含”\.“;分割后数组长度;是否包含非数字的字符等
知识点:
String a = "....";
String[] arr = a.split('\\.'); //arr是空的
String b = ".1.2.3";
String[] arr = b.split('\\.'); //arr=['''',"1","2","3"];
String c = ".1.2.3.";
String[] arr = c.split('\\.'); //arr=['''',"1","2","3"];
//分割符如果在第一个字符位置,则会有一个空字符作为分割后的一个元素;如果在最后一个位置,则不会。
网友评论