分享一些重要的Android面试题,字节跳动最新开源

2.自增操作有三步,此时多线程写会出现问题
4.cas

1.操作:内存值V、旧的预期值A、要修改的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做并返回false。
2.解释:本地副本为A,共享内存为V,线程A要把V修改成B。某个时刻线程A要把V修改成B,如果A和V不同那么就表示有其他线程在修改V,此时就表示修改失败,否则表示没有其他线程修改,那么把V改成B。
3.局限:如果V被修改成V1然后又被改成V,此时cas识别不出变化,还是认为没有其他线程在修改V,此时就会有问题
4.局限解决:将V带上版本。
5.线程不安全到底是怎么回事:

1.一个线程写,多个线程读的时候,会造成写了一半就去读
2.多线程写,会造成脏数据
ASYNCTASK和线程池,GC相关(怎么判断哪些内存该GC,GC算法)

1.Asynctask:异步任务类,单线程线程池+Handler

2.线程池:

1.ThreadPoolExecutor:通过Executors可以构造单线程池、固定数目线程池、不固定数目线程池。

2.ScheduledThreadPoolExecutor:可以延时调用线程或者延时重复调度线程。

3.GC相关:重要

1.搜索算法:

1.引用计数

2.图搜索,可达性分析

2.回收算法:

1.标记清除复制:用于青年代

2.标记整理:用于老年代

3.堆分区:

1.青年区eden 80%、survivor1 10%、survivor2 10%

2.老年区

4.虚拟机栈分区:

1.局部变量表

2.操作数栈

3.动态链接

4.方法返回地址

5.GC Roots:

1.虚拟机栈(栈桢中的本地变量表)中的引用的对象

2.方法区中的类静态属性引用的对象

3.方法区中的常量引用的对象

4.本地方法栈中JNI的引用的对象

JAVA类加载过程:

1.加载时机:创建实例、访问静态变量或方法、反射、加载子类之前
2.验证:验证文件格式、元数据、字节码、符号引用的正确性
3.加载:根据全类名获取文件字节流、将字节流转化为静态储存结构放入方法区、生成class对象
4.准备:在堆上为静态变量划分内存
5.解析
:将常量池中的符号引用转换为直接引用
6.初始化:初始化静态变量
MVC、MVP、MVVM:

1.mvc:数据、View、Activity,View将操作反馈给Activity,Activitiy去获取数据,数据通过观察者模式刷新给View。循环依赖
1.Activity重,很难单元测试
2.View和Model耦合严重
2.mvp:数据、View、Presenter,View将操作给Presenter,Presenter去获取数据,数据获取好了返回给Presenter,Presenter去刷新View。PV,PM双向依赖
1.接口爆炸
2.Presenter很重
3.mvvm:数据、View、ViewModel,View将操作给ViewModel,ViewModel去获取数据,数据和界面绑定了,数据更新界面更新。
1.viewModel的业务逻辑可以单独拿来测试
2.一个view 对应一个 viewModel 业务逻辑可以分离,不会出现全能类
3.数据和界面绑定了,不用写垃圾代码,但是复用起来不舒服
APK瘦身:

1.classes.dex:通过代码混淆,删掉不必要的jar包和代码实现该文件的优化

2.资源文件:通过Lint工具扫描代码中没有使用到的静态资源

3.图片资源:使用tinypng和webP,下面详细介绍图片资源优化的方案,矢量图

4.SO文件将不用的去掉,目前主流app一般只放一个arm的so包

ANR的形成,各个组件上出现ARN的时间限制是多少

1.只要是主线程耗时的操作就会ARN 如io

2.broadcast超时时间为10秒 按键无响应的超时时间为5秒 前台service无响应的超时时间为20秒,后台service为200秒

SERIALIZABLE和PARCELABLE 的区别

1.P 消耗内存小

2.网络传输用S 程序内使用P

3.S将数据持久化方便

4.S使用了反射 容易触发垃圾回收 比较慢

SHAREDPREFERENCES源码简述

1.储存于硬盘上的xml键值对,数据多了会有性能问题

2.ContextImpl记录着SharedPreferences的重要数据,文件路径和实例的键值对

3.在xml文件全部内加载到内存中之前,读取操作是阻塞的,在xml文件全部内加载到内存中之后,是直接读取内存中的数据

4.apply因为是异步的没有返回值, commit是同步的有返回值能知道修改是否提交成功

5.多并发的提交commit时,需等待正在处理的commit数据更新到磁盘文件后才会继续往下执行,从而降低效率; 而apply只是原子更新到内存,后调用apply函数会直接覆盖前面内存数据,从一定程度上提高很多效率。 3.edit()每次都是创建新的EditorImpl对象.

ANR的形成,各个组件上出现ARN的时间限制是多少

1.只要是主线程耗时的操作就会ARN 如io
存,后调用apply函数会直接覆盖前面内存数据,从一定程度上提高很多效率。 3.edit()每次都是创建新的EditorImpl对象.

ANR的形成,各个组件上出现ARN的时间限制是多少

1.只要是主线程耗时的操作就会ARN 如io

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值