oppo的面试题
collection和collections的区别
map遍历过程中删除数据会发生什么如何解决
1,Android为什么使用Dalvik 不用JVM Dalvik和ART的演变
2.双重锁单例 volitile关键字,sync锁
3.binder通信流程,跨进成通信方式,binder的大小
4.代理模式的实现
5.热修复原理 (双亲委托)。
oppo的面试题
1.tcp怎么保证数据传输的可靠性
2.多进程的好处和缺点
3.Service和Thread的区别
4.Socket有什么优化点
5.偏向锁的实现原理
6.CAS的实现原理
7.设计模式的设计原则
8.jvm的多线程机制
9.rsa加密原理
10.hashmap和treemap有什么区别
HashMap:基于哈希表实现 .优化HashMap空间的使用,可以调优初始容量和负载因子。适用于在Map中插入、删除和定位元素。
TreeMap:基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。适用于按自然顺序或自定义顺序遍历键(key)。
1.为什么ThreadLocalMap使用弱引用存储ThreadLocal?
假如使用强引用,当ThreadLocal不再使用需要回收时,发现某个线程中ThreadLocalMap存在该ThreadLocal的强引用,无法回收,造成内存泄漏。
因此,使用弱引用可以防止长期存在的线程(通常使用了线程池)导致ThreadLocal无法回收造成内存泄漏。
2.那通常说的ThreadLocal内存泄漏是如何引起的呢?
我们注意到Entry对象中,虽然Key(ThreadLocal)是通过弱引用引入的,但是value即变量值本身是通过强引用引入。
这就导致,假如不作任何处理,由于ThreadLocalMap和线程的生命周期是一致的,当线程资源长期不释放,即使ThreadLocal本身由于弱引用机制已经回收掉了,但value还是驻留在线程的ThreadLocalMap的Entry中。即存在key为null,但value却有值的无效Entry。导致内存泄漏。
ANR导致原因?
- cpu过载导致,全量logcat日志里会有相关的打印,各个进程cpu占用情况,这种一般不需要分析trace文件
- 频繁gc导致,全量日志anr之前会有频繁的gc打印,trace文件头部也会统计gc单次耗时,总次数和总耗时
主线程也会进入wait状态,之后就是一系列的gc相关的线程 wait - 死锁,这种我遇到的很少,就讲了下一般会打印资源is heldby xxx进程会形成互相持有的状态
Handler在源码中的使用场景你能举一两个例子吗
1.ANR的消息都是通过handler发送给AMS里的ServerThread来处理的
2.长按事件的触发,在PhoneWindowManager里边, 也是handler发送的延时消息
3.HandlerThread 继承thread run方法中Looper.prepare(); Looper.loop();调用quit或quitSafely停掉。
java方面 集合
List,Map,Set
arraylist linklist的区别
MAP的原理
Set原理
android方面就是activity生命周期,启动方式的区别 service启动方式
IPC的原理 Binder原理
事件传递机制
自定义VIEW的三个复写方法的作用
android源码的了解程度
讲解HashMap的原理?HashMap的扩容过程,以及为什么扩容时必须是2的幂次方?
HasmMap与ArrayMap有什么区别?
数组和链表的区别?
系统讲解一下Android端涉及到的性能优化?以及项目中有做过哪些性能优化?
UI优化、内存优化、帧率及卡顿优化、APP启动优化等
如何监控卡顿与帧率?
讲解Handler消息机制
讲解ViewGroup事件传递机制?
讲解View的绘制流程
APP的启动流程,从点击图标到应用启动都经历了哪些过程?
Apk打包流程?
JVM内存模型
Java垃圾回收机制
Java ClassLoader双亲委派机制?
Java Volatile底层实现原理?
如何构建线程池?
newFixedThreadPool与newCachedThreadPool的区别?
多线程中的死锁?
AsyncTask内部维护了一个线程池是串行还是并行的?如何维护的?
OSI网络模型与TCP/IP网络模型
TCP和UDP的区别
开发过程中遵循哪些设计原则?
开发过程中都用过哪些设计模式,为了解决什么问题?
做过哪些项目重构?重构的原因是什么,最后实现了怎样的效果?
MVC/MVP/MVVM架构模式?
策略模式与状态模式有什么不同?分别为了解决什么问题?
Serializable和Parcelable哪个性能高,为什么?
Parcelable性能高
Serializable IO流完成的。
Parcelable C++对象指针 共享内存指针挪动保存数据。
内部类使用外部的变量 为什么要加final?
内部类的生命周期长于方法。 方法弹栈就没了,但是匿名内部类还是活着的,这样在内部类修改局部变量时候,局部变量就不存在了
view的渲染机制,事件传递,卡顿检测的原理,常用的优化方法
字节面试题
一个面试题,先从A界面跳转到B界面,当从B界面返回A界面时,什么情况,B界面的onStop和onDestroy不会回调
算法题 1.链表是否相交,找出相交节点 2.链表是否有环
ondraw里面打印log会打印几次,怎么让他随着屏幕刷新频率打印
插件化需要解决哪些问题,插件app怎么引用宿主资源
glide第一次加载一张网络图片的过程
怎么监测卡顿
leakcanary的原理
hashmap的内存结构和查找过程
什么时候Activity单独走onPause()不走onStop()?
如果要调用onPause(),Activity必须leavesforeground,也就是离开前台或者离开栈顶,那么除非start一个设置为
android:theme=”Theme.Dialog”的Activity,当前Activity才会直走onPause().
什么时候Activity不执行onDestroy()?
栈里面的第一个没有销毁的ativity会执行ondestroy方法,其他的不会执行。
从mainActivity跳转到activityA,这时候,后台枪杀,只会执行mainActivity的onDestroy方法,activityA的
onDestroy方法不会执行。
Jvm是基于栈,davik是基于寄存器的
SYN–SYN ACK-ACK
SYN=1 seq=client_isn
SYN=1 seq=server_isn ack=client_isn+1
SYN=0 seq=client_isn+1 ack=server_isn+1
seq 为自身序列ack 为对方序列+1 复制代码
FIN–ACK–FIN-ACK
【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server 端收到Client 端的SYN 连接请求报文后,可以直接发送SYN+ACK 报
文。其中ACK 报文是用来应答的,SYN 报文是用来同步的。但是关闭连接时,当
Server 端收到FIN 报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个
ACK 报文,告诉Client 端,”你发的FIN 报文我收到了”。只有等到我Server 端所
有的报文都发送完了,我才能发送FIN 报文,因此不能一起发送。故需要四步握
手。
【问题2】为什么TIME_WAIT 状态需要经过2MSL(最大报文段生存时间)才能返
回到CLOSE 状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE 状态了,但是
我们必须假象网络是不可靠的,有可以最后一个ACK 丢失。所以TIME_WAIT 状
态就是用来重发可能丢失的ACK 报文。