`

把面试官唬住了,就要50K。没唬住,就要5K!Android开发社招面试

阅读更多

记录之前一次面试。

先说一下面试问到的需要的点:tcp/udp.volatile关键字.多进程.hashmap.anr.activity.MVP.算法题.自定义view.OKHTTP.java相关.数据结构.性能优化.

为此我整理了一份983页的PDF,把自己平时收集的面试题,和平时工作中碰到的都融合进去了


(更多完整项目下载。未完待续。源码。图文知识后续上传github。)
可以点击关于我联系我获取完整PDF
(VX:mm14525201314)

 

  • 自定义view的过程
  • java线程,安卓线程池
  • handle
  • gc,gc的使用方式
  • okhttp源码
  • 设计模式
  • hashmap源码
  • 线程安全性
  • hash运算过程
  • java相关(面向对象的理解 多态的实习 接口和抽象类 内存模型 多线程 线程池原理)
  • 性能优化相关

问到的问题中,还是性能优化相关的对我的印象比较深刻,所以着重讲一下(答案仅供参考)

1、图片的三级缓存中,图片加载到内存中,如果内存快爆了,会发生什么?怎么处理

首先我们要清楚图片的三级缓存是如何的

 

如果内存足够时不回收。内存不够时就回收软引用对象

2、内存中如果加载一张 500*500 的 png 高清图片.应该是占用多少的内存?

  • 不考虑屏幕比的话: 占用内存=500 * 500 * 4 = 1000000B ≈
    0.95MB
  • 考虑屏幕比的的话: 占用内存= 宽度像素 x (inTargetDensity/inDensity) x 高度像素 x(inTargetDensity / inDensity)x 一个像素所占的内存字节
    大小
  • inDensity 表示目标图片的 dpi(放在哪个资源文件夹下),
    inTargetDensity表示目标屏幕的 dpi

3、WebView 的性能优化 ?

一个加载网页的过程中,native、网络、后端处理、CPU 都会
参与,各自都有必要的工作和依赖关系;让他们相互并行处理
而不是相互阻塞才可以让网页加载更快:

  • WebView 初始化慢,可以在初始化同时先请求数据,
    让后端和网络不要闲着。
  • 常用 JS 本地化及延迟加载,使用第三方浏览内核
  • 后端处理慢,可以让服务器分 trunk 输出,在后端计算
    的同时前端也加载网络静态资源。
  • 脚本执行慢,就让脚本在最后运行,不阻塞页面解析。
  • 同时,合理的预加载、预缓存可以让加载速度的瓶颈更
    小。
  • WebView 初始化慢,就随时初始化好一个 WebView
    待用。
  • DNS 和链接慢,想办法复用客户端使用的域名和链接。


4、Bitmap 如何处理大图,如一张 30M 的大图,如何预防 OOM?

参考回答: 避免 OOM 的问题就需要对大图片的加载进行管理,主要通
过缩放来减小图片的内存占用。

  • BitmapFactory 提供的加载图片的四类方法(decodeFile
    decodeResourcedecodeStreamdecodeByteArray
    都支持 BitmapFactory.Options 参数,通过 inSampleSize 参
    数就可以很方便地对一个图片进行采样缩放
  • 比如一张 10241024 的高清图片来说。那么它占有的内存为
    102410244,即 4MB,如果 inSampleSize 为 2,那么采样后
    的图片占用内存只有 512512*4,即 1MB(注意:根据最新的官
    方文档指出,inSampleSize 的取值应该总是为 2 的指数,即
    1、2、4、8 等等,如果外界输入不足为 2 的指数,系统也会默
    认选择最接近 2 的指数代替,比如 2)
  • 综合考虑。通过采样率即可有效加载图片,流程如下
    • 将 BitmapFactory.Options 的
      inJustDecodeBounds 参数设为 true 并加载图片
    • 从 BitmapFactory.Options 中取出图片的原始宽高信
      息,它们对应 outWidth 和 outHeight 参数
    • 根据采样率的规则并结合目标 View 的所需大小计算出
      采样率 inSampleSize
    • 将 BitmapFactory.Options 的
      inJustDecodeBounds 参数设为 false,重新加载图片

5、内存回收机制与 GC 算法(各种算法的优缺点以及应用场景);GC 原理时机以及 GC 对象

参考回答:

内存判定对象可回收有两种机制:

  • 引用计数算法: 给对象中添加一个引用计数器,每当有
    一个地方引用它时,计数器值就加 1;当引用失效时,
    计数器值就减 1;任何时刻计数器为 0 的对象就是不可
    能再被使用的。然而在主流的 Java 虚拟机里未选用引用
    计数算法来管理内存,主要原因是它难以解决对象之间相互循环引用的问题,所以出现了另一种对象存活判定
    算法。

  • 可达性分析法: 通过一系列被称为『GCRoots』的对象
    作为起始点,从这些节点开始向下搜索,搜索所走过的
    路径称为引用链,当一个对象到 GC Roots 没有任何引
    用链相连时,则证明此对象是不可用的。其中可作为 GC
    Roots 的对象:虚拟机栈中引用的对象,主要是指栈帧
    中的本地变量*、本地方法栈中 Native 方法引用的对
    象、方法区中类静态属性引用的对象、方法区中常量引
    用的对象

GC 回收算法有以下四种:

  • 分代收集算法: 是当前商业虚拟机都采用的一种算法,
    根据对象存活周期的不同,将 Java 堆划分为新生代和老
    年代,并根据各个年代的特点采用最适当的收集算法。
  • 新生代: 大批对象死去,只有少量存活。使用『复制算
    法』,只需复制少量存活对象即可。
    • 复制算法: 把可用内存按容量划分为大小相等的
      两块,每次只使用其中的一块。当这一块的内存
      用尽后,把还存活着的对象『复制』到另外一块
      上面,再将这一块内存空间一次清理掉。实现简单,运行高效。在对象存活率较高时就要进行较多的复制操作,效率将会变低
  • 老年代: 对象存活率高。使用『标记—清理算法』或者
    『标记—整理算法』,只需标记较少的回收对象即可。
    • 标记-清除算法: 首先『标记』出所有需要回收
      的对象,然后统一『清除』所有被标记的对象。
      标记和清除两个过程的效率都不高,清除之后会
      产生大量不连续的内存碎片,空间碎片太多可能
      会导致以后在程序运行过程中需要分配较大对象
      时,无法找到足够的连续内存而不得不提前触发
      另一次垃圾收集动作。
    • 标记-整理算法: 首先『标记』出所有需要回收
      的对象,然后进行『整理』,使得存活的对象都
      向一端移动,最后直接清理掉端边界以外的内
      存。标记整理算法会将所有的存活对象移动到一
      端,并对不存活对象进行处理,因此其不会产生
      内存碎片

6、内存泄露和内存溢出的区别 ?AS 有什么工具可以检测内存泄露

  • 内存溢出(out of memory): 是指程序在申请内存时,没有足
    够的内存空间供其使用,出现 out of memory;比如申请了一
    个 integer,但给它存了 long 才能存下的数,那就是内存溢
    出。
  • 内存泄露(memory leak): 是指程序在申请内存后,无法释放
    已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露
    堆积后果很严重,无论多少内存,迟早会被占光。memory leak
    会最终会导致 out of memory!
  • 查找内存泄漏可以使用 Android Studio 自带的
    AndroidProfiler 工具或 MAT

7、性能优化,怎么保证应用启动不卡顿? 黑白屏怎么处理?

  • 应用启动速度,取决于你在 application 里面时候做了什么事
    情,比如你集成了很多 sdk,并且 sdk 的 init 操作都需要在主
    线程里实现所以会有卡顿的感觉。在非必要的情况下可以把加
    载延后或则开启子线程处理

  • 另外,影响界面卡顿的两大因素,分别是界面绘制和数据处
    理。

    • 布局优化(使用 include,merge 标签,复杂布局推荐使
      用 ConstraintLayout等)
    • onCreate() 中不执行耗时操作 把页面显示的 View 细
      分一下,放在 AsyncTask 里逐步显示,用 Handler
      更好。这样用户的看到的就是有层次有步骤的一个个的
      View 的展示,不会是先看到一个黑屏,然后一下显示
      所有 View。最好做成动画,效果更自然。
    • 利用多线程的目的就是尽可能的减少 onCreate() 和
      onReume() 的时间,使得用户能尽快看到页面,操作
      页面。
    • 减少主线程阻塞时间。
    • 提高 Adapter 和 AdapterView 的效率。
  • 黑白屏产生原因: 当我们在启动一个应用时,系统会去检查是
    否已经存在这样一个进程,如果不存在,系统的服务会先检查
    startActivity 中的 intent 的信息,然后在去创建进程,最后启
    Acitivy,即冷启动。而启动出现白黑屏的问题,就是在这段
    时间内产生的。系统在绘制页面加载布局之前,首先会初始化
    窗口(Window),而在进行这一步操作时,系统会根据我们设
    置的 Theme 来指定它的 Theme 主题颜色,我们在 Style 中的
    设置就决定了显示的是白屏还是黑屏。

    • windowIsTranslucent和 windowNoTitle,将这两个
      属性都设置成 true (会有明显的卡顿体验,不推荐)
    • 如果启动页只是是一张图片,那么为启动页专一设置一
      个新的主题,设置主题的
      android:windowBackground 属性为启动页背景图即
  • 使用 layer-list 制作一张图片 launcher_layer.xml,将其
    设置为启动页专一主题的背景,并将其设置为启动页布
    局的背景。

8、强引用置为 null,会不会被回收?

不会立即释放对象占用的内存。 如果对象的引用被置为 null,
只是断开了当前线程栈帧中对该对象的引用关系,而 垃圾收集
器是运行在后台的线程,只有当用户线程运行到安全点(safe
point)或者安全区域才会扫描对象引用关系,扫描到对象没有被
引用则会标记对象,这时候仍然不会立即释放该对象内存,因
为有些对象是可恢复的(在 finalize 方法中恢复引用 )。只有
确定了对象无法恢复引用的时候才会清除对象内存。

9、ListView 跟 RecyclerView 的区别

动画区别:

  • 在 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 缓存机制基本一致,但缓存
    使用不同

10、ListView 的 adapter 是什么 adapter

  • BaseAdapter:抽象类,实际开发中我们会继承这个类并且重
    写相关方法,用得最多的一个适配器!
  • ArrayAdapter:支持泛型操作,最简单的一个适配器,只能展
    现一行文字〜
  • SimpleAdapter:同样具有良好扩展性的一个适配器,可以自
    定义多种效果!
  • SimpleCursorAdapter:用于显示简单文本类型的 listView
    一般在数据库那里会用到,不过有点过时,不推荐使用!

11、LinearLayout、FrameLayout、RelativeLayout 性能对比,为什么?

  • RelativeLayout 会让子 View 调用 2 次 onMeasure
    LinearLayout 在有 weight 时,也会调用子 View 2 次
    onMeasure
  • RelativeLayout 的子 View 如果高度和RelativeLayout 不同,
    则会引发效率问题,当子 View 很复杂时,这个问题会更加严
    重。如果可以,尽量使用 padding 代替 margin。 o 在不影响层级深度的情况下,使用 LinearLayout 和
    FrameLayout 而不是 RelativeLayout

 


请查看完整的PDF版
(更多完整项目下载。未完待续。源码。图文知识后续上传github。)
可以点击关于我联系我获取完整PDF
(VX:mm14525201314)

 

分享到:
评论

相关推荐

    大数据面试题,唬住50k.pdf

    【大数据面试题】这份文档包含了多个关于大数据领域,特别是Hadoop相关的问题,旨在考察候选人的专业知识。以下是其中涉及的关键知识点: 1. **HDFS组件**: - **NameNode**:负责元数据管理,不存储实际数据。 -...

    ntc热敏电阻5k,10k,50k,100k阻值与温度对.pdf

    该文档似乎提供了5kΩ、10kΩ、50kΩ和100kΩ四种不同阻值的NTC热敏电阻在不同温度下的电阻值变化表。 首先,让我们了解这些参数的意义: - **阻值**:5kΩ、10kΩ、50kΩ和100kΩ代表NTC热敏电阻在特定温度(通常...

    golang 50k 高阶面试题

    标题 "golang 50k 高阶面试题" 指出了文章内容将围绕Go语言高级面试题的范围,尤其是针对有一定难度和深度的问题。描述 "go大厂都面试什么" 表明文章的内容会贴近那些一线科技公司(通常被称作大厂)在招聘Go语言...

    热敏电阻-温度阻值表(5K、10K、15K、20K、50K、100K、R100=3.3KB0/100=3970)

    热敏电阻-温度阻值表(5K、10K、15K、20K、50K、100K、R100=3.3KB0/100=3970)

    Honeywell PDA Android SDK以及开发方法和样例工程

    <uses-permission android:name="com.honeywell.decode.permission.DECODE" /> 3、在Activity类(如MainActivity)的声明中加入BarcodeListener和TriggerListener,以便进行扫描键触发处理和条码事件处理。

    honeywell霍尼韦尔 EDA50K SDK.zip

    2.自己的项目引用.jar包, 需增加<uses-permission android:name="com.honeywell.decode.permission.DECODE" /> 3.Automatic 不会触发 onTriggerEvent 事件, 触发需使用Client模式 4.onBarcodeEvent 的 event....

    USPTO-50K.csv

    USPTO-50k数据集。 来自美国专利局公布(1976年~2016年9月)的化学反应的子集和预处理版本。它包括50K个随机选择的反应,这些反应后来被 Nadine Schneider 等人分为10个反应类别。

    经过预处理的IC03 IC13 IIIT5K SVT数据集和50k-words Hunspell词典.zip

    本项目实践聚焦于数据预处理,提供了经过处理的IC03、IC13、IIIT5K和SVT数据集,以及一个包含50k单词的Hunspell词典,这些都是用于文本识别和自然语言处理任务的基础资源。 IC03、IC13、IIIT5K和SVT数据集是四个...

    2024前端面试八股文

    ### 2024前端面试八股文精要解析 #### CSS部分 1. **display的block、inline和inline-block的区别** - **block**:此类元素会独占一行,这意味着在同一行上不能存在其他的block元素。block元素可以设置宽度(`...

    k8s及其相关组件面试题大全,包含docker、etcd等组件面试题

    K8s在云原生环境下,已经承担了一个操作系统的绝大部分功能!更是已经成为云计算领域中平台层当仁不让的事实标准!...本资源模拟面试官提问的各种docker,k8s问题,一整理成word文档,方便大家自行修改和增加问题。

    码神之路Java独家面试宝典(第二版)2022最新版,大厂真题全收录,并有详细答案

    【码神之路Java独家面试宝典(第二版)2022最新版,大厂真题全收录,并有详细答案】这份资料集合了最新的大厂Java面试真题,旨在为不同薪资水平(10-50K)的Java程序员提供全方位的面试准备。第二版增加了分类处理和...

    码神之路独家Java面试宝典(第二版)

    【码神之路独家Java面试宝典(第二版)】是一本专门为Java开发者准备的面试指南,旨在帮助求职者顺利通过10-50K薪资范围的面试。这本书包含了超过50万字的内容,总计300多道题目,涵盖了从基础到高级的Java知识体系...

    Android apk 反编译

    Android APK反编译是一个复杂而重要的过程,它涉及到对Android应用程序的源代码进行逆向工程,以便理解其内部工作原理、提取资源或者进行修改。在Android应用开发中,APK文件是应用程序的打包形式,包含了所有的代码...

    50K 数字电位器

    ### 50K 数字电位器:详细解析与应用 #### 一、产品概述 数字电位器是一种可以通过数字信号来控制其阻值变化的电子元件,它结合了传统模拟电位器的功能与现代数字控制技术的优势。本文将重点介绍Intersil公司生产...

    holopix50k:Holopix50k

    Holopix50k:大规模的野生立体声图像数据集 在发表 | , , *, *, , , *表示同等贡献 随着双摄像头手机在大众市场的普及,在计算机视觉中利用立体声信息变得越来越重要。 当前最先进的方法利用基于学习的算法...

    作为一名Android开发者,怎样才能进入阿里,拿到30-50K

    2.Android框架开发和维护,SDK开发 3. 技术架构升级优化,提升业务研发效率 二丶岗位要求 1、3年以上Android客户端开发经验 2丶JAVA基础扎实,理解io、多线程、集合等基础框架,对JVM原理有一定的了解 3、掌握...

    直接用于在android系统下运行的iozone可执行文件

    直接用于在android系统下运行的iozone可执行文件。使用方法: 1.将下载的iozone文件通过ADB拷贝到android平台的/data下. 2.进入/data下,执行iozone文件,如:./iozone -t 2 -s 3m -r 50k -F test1.txt test2.txt -...

    海信电视刷机数据 LED50K680X3DU(0000) 生产用软件数据 务必确认机编一致 强制刷机 整机USB升级程序

    2、电视关机,插入U盘,把U盘插到电视机的USB3上,按电视机机身开关键开机 3、电视会自动进行刷机,无需人为操作,耐心8-20分钟 4、拔下U盘以必免再次刷机或者备份好固件,刷完电视会自动重启,等电视进入桌面 注意...

    海信电视刷机数据 LED50K20JD(0001) 生产用软件数据 务必确认机编一致 强制刷机 整机USB升级程序

    务必确认机身编号与文件名机编一致,如不一致,请勿下载 机身编号一般在机子背面的贴纸上 MT5505机芯升级方法: 1、下载数据,压缩包解压,升级软件文件夹名字为Hisense_5505,文件夹下包含“机型名.pkg”以及...

    预测年收入是否大于50K美元--adults.txt

    预测年收入是否大于50K美元--adults.txt;数据分析入门之KNN-预测年收入

Global site tag (gtag.js) - Google Analytics