前言
大概从五月底开始,我就开始从各种渠道找各大公司内推、提前批实习了,大大小小投了很多家公司,除了一些记不起来的问题,这里把至今所有遇到的经典问题涉及到的知识点整理下来,希望对各位Android开发者有所帮助

整理如下:

一.说下冷启动与热启动是什么,区别,如何优化,使用场景等。

答:
app冷启动:
当应用启动时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用, 这个启动方式就叫做冷启动(后台不存在该应用进程)。冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。

app热启动:
当应用已经被打开, 但是被按下返回键、Home键等按键时回到桌面或者是其他程序的时候,再重新打开该app时, 这个方式叫做热启动(后台已经存在该应用进程)。
热启动因为会从已有的进程中来启动,所以热启动就不会走Application这步了,而是直接走MainActivity(包括一系列的测量、布局、绘制),所以热启动的过程只需要创建和初始化一个MainActivity就行了,而不必创建和初始化Application

冷启动的流程
当点击app的启动图标时,安卓系统会从Zygote进程中fork创建出一个新的进程分配给该应用,之后会依次创建和初始化Application类、创建MainActivity类、加载主题样式Theme中的windowBackground等属性设置给MainActivity以及配置Activity层级上的一些属性、再inflate布局、当onCreate/onStart/onResume方法都走完了后最后才进行contentView的measure/layout/draw显示在界面上

冷启动的生命周期简要流程:
Application构造方法 –>attachBaseContext()–>onCreate –>Activity构造方法 –>onCreate() –> 配置主体中的背景等操作 –>onStart()–> onResume()–> 测量、布局、绘制显示

冷启动的优化主要是视觉上的优化,解决白屏问题,提高用户体验,所以通过上面冷启动的过程。能做的优化如下:
1、减少onCreate()方法的工作量
2、不要让Application参与业务的操作
3、不要在Application进行耗时操作
4、不要以静态变量的方式在Application保存数据
5、减少布局的复杂度和层级
6、减少主线程耗时

二.Android中的线程有那些,原理与各自特点

AsyncTask,HandlerThread,IntentService

AsyncTask原理:
内部是 Handler和两个线程池实现的,Handler用于将线程切换到主线程,两个线程池一个用于任务的排队,一个用于执行任务,当AsyncTask执行execute方法时会封装出一个FutureTask对象,将这个对象加入队列中,如果此时没有正在执行的任务,就执行它,执行完成之后继续执行队列中下一个任务,执行完成通过Handler将事件发送到主线程。AsyncTask必须在主线程初始化,因为内部的Handler是一个静态对象,在AsyncTask类加载的时候他就已经被初始化了。在Android3.0开始,execute方法串行执行任务的,一个一个来,3.0之前是并行执行的。如果要在3.0上执行并行任务,可以调用executeOnExecutor方法

HandlerThread原理:
继承自Thread,start开启线程后,会在其run方法中会通过Looper创建消息队列并开启消息循环,这个消息队列运行在子线程中,所以可以将HandlerThread中的Looper实例传递给一个Handler,从而保证这个Handler的handleMessage方法运行在子线程中,Android中使用HandlerThread的一个场景就是IntentService

IntentService原理:
继承自Service,它的内部封装了HandlerThread和Handler,可以执行耗时任务,同时因为它是一个服务,优先级比普通线程高很多,所以更适合执行一些高优先级的后台任务,HandlerThread底层通过Looper消息队列实现的,所以它是顺序的执行每一个任务。可以通过Intent的方式开启IntentService,IntentService通过handler将每一个intent加入HandlerThread子线程中的消息队列,通过looper按顺序一个个的取出并执行,执行完成后自动结束自己,不需要开发者手动关闭

三.ANR的原因

1.耗时的网络访问
2.大量的数据读写
3.数据库操作
4.硬件操作(比如camera)
5.调用thread的join()方法、sleep()方法、wait()方法或者等待线程锁的时候
6.service binder的数量达到上限
7.system server中发生WatchDog ANR
8.service忙导致超时无响应
9.其他线程持有锁,导致主线程等待超时
10.其它线程终止或崩溃导致主线程一直等待

四.三级缓存原理

当Android端需要获得数据时比如获取网络中的图片,首先从内存中查找(按键查找),内存中没有的再从磁盘文件或sqlite中去查找,若磁盘中也没有才通过网络获取

五.LruCache底层实现原理:

LruCache中Lru算法的实现就是通过LinkedHashMap来实现的。LinkedHashMap继承于HashMap,它使用了一个双向链表来存储Map中的Entry顺序关系,
对于get、put、remove等操作,LinkedHashMap除了要做HashMap做的事情,还做些调整Entry顺序链表的工作。
LruCache中将LinkedHashMap的顺序设置为LRU顺序来实现LRU缓存,每次调用get(也就是从内存缓存中取图片),则将该对象移到链表的尾端。
调用put插入新的对象也是存储在链表尾端,这样当内存缓存达到设定的最大值时,将链表头部的对象(近期最少用到的)移除。

六.说下你对Collection这个类的理解。

Collection是集合框架的顶层接口,是存储对象的容器,Colloction定义了接口的公用方法如add remove clear等等,它的子接口有两个,List和Set,List的特点有元素有序,元素可以重复,元素都有索引(角标),典型的有

Vector:
内部是数组数据结构,是同步的(线程安全的)。增删查询都很慢。

ArrayList:
内部是数组数据结构,是不同步的(线程不安全的)。替代了Vector。查询速度快,增删比较慢。

LinkedList:
内部是链表数据结构,是不同步的(线程不安全的)。增删元素速度快。
而Set的是特点元素无序,元素不可以重复

HashSet:
内部数据结构是哈希表,是不同步的。Set集合中元素都必须是唯一的,HashSet作为其子类也需保证元素的唯一性。
判断元素唯一性的方式:
通过存储对象(元素)的hashCode和equals方法来完成对象唯一性的。
如果对象的hashCode值不同,那么不用调用equals方法就会将对象直接存储到集合中;

如果对象的hashCode值相同,那么需调用equals方法判断返回值是否为true,若为false, 则视为不同元素,就会直接存储;
若为true, 则视为相同元素,不会存储。

如果要使用HashSet集合存储元素,该元素的类必须覆盖hashCode方法和equals方法。一般情况下,如果定义的类会产生很多对象,通常都需要覆盖equals,hashCode方法。建立对象判断是否相同的依据。

TreeSet:
保证元素唯一性的同时可以对内部元素进行排序,是不同步的。
判断元素唯一性的方式:
根据比较方法的返回结果是否为0,如果为0视为相同元素,不存;如果非0视为不同元素,则存。

TreeSet对元素的排序有两种方式:
方式一:使元素(对象)对应的类实现Comparable接口,覆盖compareTo方法。这样元素自身具有比较功能。
方式二:使TreeSet集合自身具有比较功能,定义一个比较器Comparator,将该类对象作为参数传递给TreeSet集合的构造函数

七.JVM老年代和新生代的比例

Java 中的堆是 JVM所管理的最大的一块内存空间,主要用于存放各种类的实例对象。
在 Java中,堆被划分成两个不同的区域:新生代 ( Young )、老年代( Old )。新生代( Young )又被划分为三个区域:Eden、From Survivor、To Survivor。
这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。
堆大小 = 新生代 + 老年代。其中,堆的大小可以通过参数 –Xms、-Xmx 来指定。
(本人使用的是 JDK1.6,以下涉及的 JVM 默认值均以该版本为准。)
默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) = 1/3 的堆空间大小。老年代 ( Old ) = 2/3 的堆空间大小。其中,新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域,这两个 Survivor 区域分别被命名为 from 和 to,以示区分。
默认的,Edem : from : to = 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorRatio 来设定 ),即: Eden = 8/10 的新生代空间大小,from = to = 1/10 的新生代空间大小。
JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务,所以无论什么时候,总是有一块 Survivor 区域是空闲着的。
因此,新生代实际可用的内存空间为 9/10 ( 即90% )的新生代空间

八.jvm,jre以及jdk三者之间的关系?

JDK(Java Development Kit)
是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。

Java Runtime Environment(JRE)
是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。

JVM
是Java Virtual Machine(Java虚拟机)的缩写,是整个java实现跨平台的最核心的部分,能够运行以Java语言写作的软件程序。

九.谈谈你对 JNIEnv 和 JavaVM 理解?

1.JavaVm
JavaVM是虚拟机在 JNI 层的代表,一个进程只有一个 JavaVM,所有的线程共用一个 JavaVM。

2.JNIEnv
JNIEnv表示 Java调用native 语言的环境,是一个封装了几乎全部 JNI方法的指针。
JNIEnv只在创建它的线程生效,不能跨线程传递,不同线程的 JNIEnv彼此独立。
native环境中创建的线程,如果需要访问JNI,必须要调用 AttachCurrentThread 关联,并使用DetachCurrentThread 解除链接。

十.Serializable与Parcable的区别?

1.Serializable (java 自带)
方法:对象继承 Serializable类即可实现序列化,就是这么简单,也是它最吸引我们的地方

2.Parcelable(Android专用):
Parcelable方式的实现原理是将一个完整的对象进行分解,用起来比较麻烦
1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。
2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性,在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable。
4)android上应该尽量采用Parcelable,效率至上,效率远高于Serializable

关于我学习开发的道路

其实当你沉醉于一件事的时候,就会发现时间过的是真的快,不知不觉我已经从事开发好几年了。初生牛犊不怕虎,还记得刚出来工作的时候我觉得自己非常的牛逼,没有完不成的项目,现在回想起来那时候的我真的很傻很无知,当你觉得自己懂了很多的时候往往自己是有很多的缺陷的。

人只有不断的学习才能强化自己去到更远的地方拿更高的工资。

一路走来我从网上找资料,到现在我i整理了可以快速学习的方法。
这里我放上了我这些年整理的资料,我还总结了自己的工作经验,告诉你们怎样才能少走弯路,说不定现在的你就在走弯路。

最后针对Android程序员,除了上面的知识体系,我也分享一份私货,分享我从网络上收录整理的 Android学习PDF+架构视频+面试文档+源码笔记 ,还有Android开发面试专题资料,高级进阶架构资料供大家学习进阶
学习资料可以进群自取:434543138
点击链接加入【Java/android技术交流】:https://jq.qq.com/?_wv=1027&k=gSnfY0m7

《Android开发核心知识点笔记》

视频资料

金九银十之际,用这套高级面试题你会更加成功!(持续更新)相关推荐

  1. 【金九银十】软件测试中的高频面试题梳理(内附答案)

    写数据库语句:一个老师表 一个学生表,(1) 查李老师班的小明(2)并将小明的年纪改成26. select t1.* from 学生表 t1 jion 老师表 t2 on t1.班级=t2.班级 wh ...

  2. 金九银十求职季,美团高频面试题和答案都帮你准备好啦

    前言 八月底了,马上到大家的找工作的高峰期了!为了帮助大家更好的备战面试和跳槽,可以在众多求职者中脱颖而出,我帮大家准备了丰富的企业真实面试题,大家赶紧收藏吧! 1.说下你最近做的项目,你主要负责什么 ...

  3. 2022金九银十 —— 招聘有感,给各位测试同学的一些建议

    前言 前段时间因公司的业务扩展需要,测试部人员编制开始扩招. 这里简单介绍一下团队的基本编制与架构: 团队编制1+3+12(经理+组长+执行),执行包括业务.测开等角色. 博主在测试行业摸鱼了十余年, ...

  4. 金九银十,做一个百度喜欢的淘宝客网站

    随着淘宝销售旺季-金九银十的到来,淘宝客一词似乎又一次火爆起来,这一群人似乎依然热情高涨,无论新手,老鸟,都忘乎所以的奔向这片炙手可热的红海,毕竟类似淘宝客这种超低门槛的网赚手段还是十分的吸引人,更不 ...

  5. java输入输出流_金九银十准备季:Java异常+Java IO与NIO面试题(含答案)

    写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下! GitHub地址:abel-max/Java-Study ...

  6. 闭关30天,献上【Java一线大厂高岗面试题解析合集】,冲刺金九银十!

    概述 时间不等人,2022年转眼就要过去大半了,春招在疫情中度过,不知有多少人还在惋惜... 马上又是秋招的高峰"金九银十",估计现在就已经有不少的程序猿(媛)朋友早就踏上提前批之 ...

  7. 阿里内网最新发布“M8”级Java面试笔记,助力金九银十

    眼下虽然才6月份,但真正的金九银十已经悄然开始.从认识的HR那得知,有些公司甚至在过年前就开始布局了..而年前偃旗息鼓的,年后也势必加速进入这波抢人大战! 附面试思维导图: 因此,真的要等到9.10月 ...

  8. 金九银十的你准备好了吗?Python 100道基础面试题先收藏!【附答案】

    眼看九月份就要到了, 不知道屏幕前的你做好找工作的准备了吗? 人才市场的"金九银十"是什么呢? 每年到了9.10月份, 一方面正是各大企业为第二年拓展业务而大量吸纳人才的关键时期, ...

  9. 备战金九银十,腾讯 T4 梳理 2022 年最全 999 道 Java 岗必备面试题答案

    前言 今年马上又准备迎接金九银十了,你是否还在寻找没有"996"的公司,或者你在面试上面摘了跟头?准备了体体面面的自我介绍,败在了技术深度上:又或者技术知识背得完完全全,却输在了面 ...

最新文章

  1. C# 打印 长字符串自动换行
  2. IE9 CTP发布了?改名 IE Platform Preview?
  3. python 3389爆破机
  4. oracle返回表id,在Oracle的函数中,返回表类型的语句
  5. 利用IPC$空连接进行入侵及防范的方法
  6. Python开源人脸识别库,识别率达99.38%!内附教程+源码分享
  7. 三菱FX5U和变频器走485通讯连接,程序是FB块写好的,硬件一样可以直接调用
  8. 如何查看oracle隐含参数,Oracle如何查看隐含参数
  9. 北京地铁乘坐路线查询
  10. echarts图例动态置灰
  11. Python tkinter改变光标样式
  12. AirTest Poco定位 和启动方式
  13. 抖音最常见的4种违规方式,不注意很可能会被封号!
  14. ATH9K Driver Learning Part III: Data packet transmission
  15. Cocos Creator之H5版Web版上传头像
  16. 【历史上的今天】11 月 9 日:TensorFlow 问世;Mozilla Firefox 发布标准版;Intel 和微软分道扬镳
  17. 红米3s运行linux,小米红米3S 3X(Redmi 3S)刷机教程,看教程刷机
  18. 【毕业设计】 微信小程序购物商城系统 【含代码】
  19. cnn程序流程图_C# VISIO 画流程图
  20. 瀚晖制药与梅斯医学建立战略合作

热门文章

  1. singleTask 特性
  2. 还在用纸质表格打钩盘点固定资产吗?
  3. 巨杉数据库与京东云携手,共筑PaaS新生态
  4. 杨焘鸣:请求帮忙 开场白话术
  5. 写一个微信朋友圈的测试用例
  6. FOUND_ROWS总是返回1
  7. 计算机win10添加用户名和密码是什么情况,win10系统添加网络打印机提示输入用户名和密码的图文方法...
  8. 使用BloomFilter优化scrapy-redis去重
  9. 仿支付宝蚂蚁森林水滴浮动效果
  10. JDBC连接数据库步骤