敲黑板,作笔记!金三银四时去面试,这几个重要的面试题千万别忘记!

快春节了,又到了使人兴奋的年终奖环节了,而程序员的年终奖,每每使人羡慕java

作了个盘点:互联网大厂的年终奖vs咱们的年终奖,真酸!换个公司还来得及吗?git

大厂程序员的年终奖,实在使人羡慕!程序员

可是不能光羡慕啊,立刻就到金三银四了,面试的黄金时节,还不许备起来。github

有可能,2020年末你也有了呢。web

BATJ、字节跳动面试专题,算法专题,高端技术专题,混合开发专题,java面试专题,Android,Java小知识,到性能优化.线程.View.OpenCV.NDK等已经上传到了的个人GitHub面试

你们点击个人GitHub地址:https://github.com/Meng997998/AndroidJX点下star一块儿学习算法

敲黑板,作笔记!金三银四时去面试,这几个重要的面试题千万别忘记!

下面就来说讲Android面试中很重要的面试题数组

说一下java多态的理解,以及接继承,和接口的理解

对于多态的定义
不一样类的对象对统一函数作出不一样对的响应或者动做。
做用
主要是消除类之间的耦合性,灵活性比较强,利于代码的编写和修改。尤为在处理大量的运算和操做时,能够灵活地简化,替换或者是修改代码!缓存

三个必要条件
一、一个凳子(继承extends)
二、重写
三、父类引用指向子类对象安全

for example 敲黑板,作笔记!金三银四时去面试,这几个重要的面试题千万别忘记!

敲黑板,作笔记!金三银四时去面试,这几个重要的面试题千万别忘记!

敲黑板,作笔记!金三银四时去面试,这几个重要的面试题千万别忘记!

敲黑板,作笔记!金三银四时去面试,这几个重要的面试题千万别忘记!

敲黑板,作笔记!金三银四时去面试,这几个重要的面试题千万别忘记!

敲黑板,作笔记!金三银四时去面试,这几个重要的面试题千万别忘记!

**测试结果:敲黑板,作笔记!金三银四时去面试,这几个重要的面试题千万别忘记!

oKhttp的 原理

1.同步和异步:

  • 1.异步使用了Dispatcher来将存储在 Deque 中的请求分派给线程池中各个线程执行。

  • 2.当任务执行完成后,不管是否有异常,finally代码段总会被执行,也就是会调用Dispatcher的finished函数,它将正在运行的任务Call从队列runningAsyncCalls中移除后,主动的把缓存队列向前走了一步。

2.链接池:

  • 1.一个Connection封装了一个socket,ConnectionPool中储存s着全部的Connection,StreamAllocation是引用计数的一个单位

  • 2.当一个请求获取一个Connection的时候要传入一个StreamAllocation,Connection中存着一个弱引用的StreamAllocation列表,每当上层应用引用一次Connection,StreamAllocation就会加一个。反之若是上层应用不使用了,就会删除一个。

  • 3.ConnectionPool中会有一个后台任务定时清理StreamAllocation列表为空的Connection。5分钟时间,维持5个socket

3.选择路线与创建链接

  • 1.选择路线有两种方式:

  • 3.代理好处:HTTP代理会帮你在远程服务器进行DNS查询,能够减小DNS劫持。

  • 1.无代理,那么在本地使用DNS查找到ip,注意结果是数组,即一个域名有多个IP,这就是自动重连的来源

  • 2.有代理HTTP:设置socket的ip为代理地址的ip,设置socket的端口为代理地址的端口

  • 2.创建链接

  • 1.链接池中已经存在链接,就从中取出(get)RealConnection,若是没有命中就进入下一步

  • 2.根据选择的路线(Route),调用Platform.get().connectSocket选择当前平台Runtime下最好的socket库进行握手

  • 3.将创建成功的RealConnection放入(put)链接池缓存

  • 4.若是存在TLS,就根据SSL版本与证书进行安全握手

  • 5.构造HttpStream并维护刚刚的socket链接,管道创建完成

4.职责链模式:缓存、重试、创建链接等功能存在于拦截器中网络请求相关,主要是网络请求优化。网络请求的时候遇到的问题

线程同步的问题,经常使用的线程同步

1.sycn:保证了原子性、可见性、有序性
2.锁:保证了原子性、可见性、有序性

  • 1.自旋锁:可使线程在没有取得锁的时候,不被挂起,而转去执行一个空循环。

  • 1.优势:线程被挂起的概率减小,线程执行的连贯性增强。用于对于锁竞争不是很激烈,锁占用时间很短的并发线程。

  • 2.缺点:过多浪费CPU时间,有一个线程连续两次试图得到自旋锁引发死锁

  • 2.阻塞锁:没获得锁的线程等待或者挂起,Sycn、Lock

  • 3.可重入锁:一个线程可屡次获取该锁,Sycn、Lock

  • 4.悲观锁:每次去拿数据的时候都认为别人会修改,因此会阻塞所有其余线程 Sycn、Lock

  • 5.乐观锁:每次去拿数据的时候都认为别人不会修改,因此不会上锁,可是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可使用版本号等机制。cas

  • 6.显示锁和内置锁:显示锁用Lock来定义、内置锁用synchronized。

  • 7.读-写锁:为了提升性能,Java提供了读

3.volatile

  • 1.只能保证可见性,不能保证原子性

  • 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.数据和界面绑定了,不用写垃圾代码,可是复用起来不舒服

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
2.broadcast超时时间为10秒 按键无响应的超时时间为5秒 前台service无响应的超时时间为20秒,后台service为200秒

apk瘦身:

1.classes.dex:经过代码混淆,删掉没必要要的jar包和代码实现该文件的优化
2.资源文件:经过Lint工具扫描代码中没有使用到的静态资源
3.图片资源:使用tinypng和webP,下面详细介绍图片资源优化的方案,矢量图
4.SO文件将不用的去掉,目前主流app通常只放一个arm的so包

#最后

敲黑板,作笔记!别忘了

不够话还有整理好的Android面试指导文档
敲黑板,作笔记!金三银四时去面试,这几个重要的面试题千万别忘记!

领取方式:关注一下,私聊我

相关文章
相关标签/搜索