zoukankan      html  css  js  c++  java
  • 分享几个重要的Android面试题

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

    于哥在这里只讲多态,其他自己上网体会

    对于多态的定义

    不同类的对象对统一函数做出不同对的响应或者动作。

    作用

    主要是消除类之间的耦合性,灵活性比较强,利于代码的编写和修改。尤其在处理大量的运算和操作时,可以灵活地简化,替换或者是修改代码!

    三个必要条件

    1、一个凳子(继承extends)

    2、重写

    3、父类引用指向子类对象

    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.选择路线有两种方式:
      • 1.无代理,那么在本地使用DNS查找到ip,注意结果是数组,即一个域名有多个IP,这就是自动重连的来源
      • 2.有代理HTTP:设置socket的ip为代理地址的ip,设置socket的端口为代理地址的端口
      • 3.代理好处:HTTP代理会帮你在远程服务器进行DNS查询,可以减少DNS劫持。
    • 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.数据和界面绑定了,不用写垃圾代码,但是复用起来不舒服

    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

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

    APK瘦身:

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

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

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

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

     

  • 相关阅读:
    Python Revisited Day 13 (正则表达式)
    Python Revisited Day 06 (面向对象程序设计)
    Python Revisited (变量)
    Python Revisited Day 05(模块)
    Python Revisited Day 04 (控制结构与函数)
    Python Revisited Day 03 (组合数据类型)
    Numpy
    Python Revisited Day 01
    Python3使用openpyxl读写Excel文件
    Python3操作YAML文件
  • 原文地址:https://www.cnblogs.com/876013676ch/p/10187267.html
Copyright © 2011-2022 走看看