记录以前一次面试。
先说一下面试问到的须要的点:tcp/udp.volatile关键字.多进程.hashmap.anr.activity.MVP.算法题.自定义view.OKHTTP.java相关.数据结构.性能优化.前端
为此我整理了一份983页的PDF,把本身平时收集的面试题,和平时工做中碰到的都融合进去了
(更多完整项目下载。未完待续。源码。图文知识后续上传github。)
能够点击关于我联系我获取完整PDF
(VX:mm14525201314)java
问到的问题中,仍是性能优化相关的对个人印象比较深入,因此着重讲一下(答案仅供参考)android
首先咱们要清楚图片的三级缓存是如何的git
若是内存足够时不回收。内存不够时就回收软引用对象github
0.95MB面试
inTargetDensity
/ inDensity
) x 高度像素 x(inTargetDensity
/ inDensity
)x 一个像素所占的内存字节大小算法
inTargetDensity
表示目标屏幕的 dpi数据库
一个加载网页的过程当中,native、网络、后端处理、CPU 都会
参与,各自都有必要的工做和依赖关系;让他们相互并行处理
而不是相互阻塞才可让网页加载更快:后端
让后端和网络不要闲着。设计模式
的同时前端也加载网络静态资源。
小。
待用。
参考回答: 避免 OOM 的问题就须要对大图片的加载进行管理,主要通
过缩放来减少图片的内存占用。
BitmapFactory
提供的加载图片的四类方法(decodeFile
、decodeResource
、decodeStream
、decodeByteArray
)
都支持 BitmapFactory.Options
参数,经过 inSampleSize
参
数就能够很方便地对一个图片进行采样缩放
102410244,即 4MB,若是 inSampleSize 为 2,那么采样后
的图片占用内存只有 512512*4,即 1MB(注意:根据最新的官
方文档指出,inSampleSize
的取值应该老是为 2 的指数,即
一、二、四、8 等等,若是外界输入不足为 2 的指数,系统也会默
认选择最接近 2 的指数代替,好比 2)
综合考虑。经过采样率便可有效加载图片,流程以下
BitmapFactory.Options
的inJustDecodeBounds
参数设为 true 并加载图片
BitmapFactory.Options
中取出图片的原始宽高信息,它们对应 outWidth 和 outHeight 参数
采样率 inSampleSize
BitmapFactory.Options
的inJustDecodeBounds
参数设为 false,从新加载图片
参考回答:
内存断定对象可回收有两种机制:
一个地方引用它时,计数器值就加 1;当引用失效时,
计数器值就减 1;任什么时候刻计数器为 0 的对象就是不可
能再被使用的。然而在主流的 Java 虚拟机里未选用引用
计数算法来管理内存,主要缘由是它难以解决对象之间相互循环引用的问题,因此出现了另外一种对象存活断定
算法。
做为起始点,从这些节点开始向下搜索,搜索所走过的
路径称为引用链,当一个对象到 GC Roots 没有任何引
用链相连时,则证实此对象是不可用的。其中可做为 GC
Roots 的对象:虚拟机栈中引用的对象,主要是指栈帧
中的本地变量*、本地方法栈中 Native 方法引用的对
象、方法区中类静态属性引用的对象、方法区中常量引
用的对象
GC 回收算法有如下四种:
根据对象存活周期的不一样,将 Java 堆划分为新生代和老
年代,并根据各个年代的特色采用最适当的收集算法。
法』,只需复制少许存活对象便可。
两块,每次只使用其中的一块。当这一块的内存
用尽后,把还存活着的对象『复制』到另一块
上面,再将这一块内存空间一次清理掉。实现简单,运行高效。在对象存活率较高时就要进行较多的复制操做,效率将会变低
『标记—整理算法』,只需标记较少的回收对象便可。
的对象,而后统一『清除』全部被标记的对象。
标记和清除两个过程的效率都不高,清除以后会
产生大量不连续的内存碎片,空间碎片太多可能
会致使之后在程序运行过程当中须要分配较大对象
时,没法找到足够的连续内存而不得不提早触发
另外一次垃圾收集动做。
的对象,而后进行『整理』,使得存活的对象都
向一端移动,最后直接清理掉端边界之外的内
存。标记整理算法会将全部的存活对象移动到一
端,并对不存活对象进行处理,所以其不会产生
内存碎片
够的内存空间供其使用,出现 out of memory;好比申请了一
个 integer,但给它存了 long 才能存下的数,那就是内存溢
出。
已申请的内存空间,一次内存泄露危害能够忽略,但内存泄露
堆积后果很严重,不管多少内存,早晚会被占光。memory leak
会最终会致使 out of memory!
AndroidProfiler
工具或 MAT
情,好比你集成了不少 sdk,而且 sdk 的 init 操做都须要在主
线程里实现因此会有卡顿的感受。在非必要的状况下能够把加
载延后或则开启子线程处理
理。
用 ConstraintLayout
等)
onCreate()
中不执行耗时操做 把页面显示的 View 细分一下,放在 AsyncTask
里逐步显示,用 Handler
更好。这样用户的看到的就是有层次有步骤的一个个的
View 的展现,不会是先看到一个黑屏,而后一下显示
全部 View。最好作成动画,效果更天然。
onCreate()
和onReume()
的时间,使得用户能尽快看到页面,操做
页面。
AdapterView
的效率。否已经存在这样一个进程,若是不存在,系统的服务会先检查startActivity
中的 intent 的信息,而后在去建立进程,最后启
动 Acitivy
,即冷启动。而启动出现白黑屏的问题,就是在这段
时间内产生的。系统在绘制页面加载布局以前,首先会初始化
窗口(Window),而在进行这一步操做时,系统会根据咱们设
置的 Theme 来指定它的 Theme 主题颜色,咱们在 Style 中的
设置就决定了显示的是白屏仍是黑屏。
windowIsTranslucent
和 windowNoTitle
,将这两个属性都设置成 true (会有明显的卡顿体验,不推荐)
个新的主题,设置主题的android:windowBackground
属性为启动页背景图即
可
设置为启动页专注主题的背景,并将其设置为启动页布
局的背景。
不会当即释放对象占用的内存。 若是对象的引用被置为 null,
只是断开了当前线程栈帧中对该对象的引用关系,而 垃圾收集
器是运行在后台的线程,只有当用户线程运行到安全点(safe
point)或者安全区域才会扫描对象引用关系,扫描到对象没有被
引用则会标记对象,这时候仍然不会当即释放该对象内存,因
为有些对象是可恢复的(在 finalize 方法中恢复引用 )。只有
肯定了对象没法恢复引用的时候才会清除对象内存。
动画区别:
RecyclerView
中,内置有许多动画 API,例如:notifyItemChanged()
, notifyDataInserted()
,notifyItemMoved()
等等;若是须要自定义动画效果,
能够经过实现(RecyclerView.ItemAnimator
类)完成
自定义动画效果,而后调用RecyclerView.setItemAnimator();
ListView
并无实现动画效果,但咱们能够在Adapter 本身实现 item 的动画效果;
刷新区别:
ListView
中一般刷新数据是用全局刷新notifyDataSetChanged()
,这样一来就会很是消耗资
源;自己没法实现局部刷新,可是若是要在 ListView 实 现局部刷新,依然是能够实现的,当一个 item 数据刷新
时,咱们能够在 Adapter 中,实现一个onItemChanged()
方法,在方法里面获取到这个 item
的 position(能够经过 getFirstVisiblePosition()
),然
后调用 getView()
方法来刷新这个 item 的数据;
RecyclerView
中能够实现局部刷新,例如:notifyItemChanged();
缓存区别:
RecyclerView
比 ListView
多两级缓存,支持多个离ItemView
缓存,支持开发者自定义缓存处理逻辑,支
持全部 RecyclerView
共用同一个RecyclerViewPool
(缓存池)。
ListView
和 RecyclerView
缓存机制基本一致,但缓存使用不一样
BaseAdapter
:抽象类,实际开发中咱们会继承这个类而且重写相关方法,用得最多的一个适配器!
ArrayAdapter
:支持泛型操做,最简单的一个适配器,只能展现一行文字〜
SimpleAdapter
:一样具备良好扩展性的一个适配器,能够自定义多种效果!
SimpleCursorAdapter
:用于显示简单文本类型的 listView
,通常在数据库那里会用到,不过有点过期,不推荐使用!
RelativeLayout
会让子 View 调用 2 次 onMeasure
,LinearLayout
在有 weight 时,也会调用子 View 2 次onMeasure
RelativeLayout
的子 View 若是高度和RelativeLayout
不一样,则会引起效率问题,当子 View 很复杂时,这个问题会更加严
重。若是能够,尽可能使用 padding 代替 margin。 o 在不影响层级深度的状况下,使用 LinearLayout
和FrameLayout
而不是 RelativeLayout
。
请查看完整的PDF版
(更多完整项目下载。未完待续。源码。图文知识后续上传github。)
能够点击关于我联系我获取完整PDF
(VX:mm14525201314)