前言

不清楚你是不是知道,咱们中国有相当大的一部分软件公司,他们的软件开发团队都小的可怜,甚至只有1-3个人,连一个项目小组都算不上,而这样的团队却要承担一个软件公司所有的软件开发任务,在软件上线和开发的关键阶段需要团队的成员没日没夜的加班,还需要为测试出的BUG和不能按时提交的软件模块功能而心怀忐忑,有的时候如果你不幸加入现场开发的团队你则需要背井离乡告别你的女友,进行封闭开发,你平时除了编码之外就是吃饭和睡觉(有钱的公司甚至请个保姆为你做饭,以让你节省出更多的时间来投入到工作中,让你一直在那种累了就休息,不累就立即工作的状态)

Android面试中有哪些常见问题汇总&答题思路

目录:

1.网络
2.Java 基础&容器&同步&设计模式
3.Java 虚拟机&内存结构&GC&类加载&四种引用&动态代理
4.Android 基础&性能优化&Framwork
5.Android 模块化&热修复&热更新&打包&混淆&压缩
6.音视频&FFmpeg&播放器

1、网络

网络协议模型

应用层:负责处理特定的应用程序细节
HTTP、FTP、DNS

传输层:为两台主机提供端到端的基础通信
TCP、UDP

网络层:控制分组传输、路由选择等
IP

链路层:操作系统设备驱动程序、网卡相关接口

TCP 和 UDP 区别

TCP 连接;可靠;有序;面向字节流;速度慢;较重量;全双工;适用于文件传输、浏览器等

  • 全双工:A 给 B 发消息的同时,B 也能给 A 发
  • 半双工:A 给 B 发消息的同时,B 不能给 A 发

UDP 无连接;不可靠;无序;面向报文;速度快;轻量;适用于即时通讯、视频通话等

TCP 三次握手

A:你能听到吗?
B:我能听到,你能听到吗?
A:我能听到,开始吧

A 和 B 两方都要能确保:我说的话,你能听到;你说的话,我能听到。所以需要三次握手

TCP 四次挥手

A:我说完了
B:我知道了,等一下,我可能还没说完
B:我也说完了
A:我知道了,结束吧

B 收到 A 结束的消息后 B 可能还没说完,没法立即回复结束标示,只能等说完后再告诉 A :我说完了。

POST 和 GET 区别

Get 参数放在 url 中;Post 参数放在 request Body 中
Get 可能不安全,因为参数放在 url 中

HTTPS

HTTP 是超文本传输协议,明文传输;HTTPS 使用 SSL 协议对 HTTP 传输数据进行了加密

HTTP 默认 80 端口;HTTPS 默认 443 端口

优点:安全
缺点:费时、SSL 证书收费,加密能力还是有限的,但是比 HTTP 强多了

2、Java 基础&容器&同步&设计模式

StringBuilder、StringBuffer、+、String.concat 链接字符串:

  • StringBuffer 线程安全,StringBuilder 线程不安全
  • +实际上是用 StringBuilder 来实现的,所以非循环体可以直接用 +,循环体不行,因为会频繁创建 StringBuilder
  • String.concat 实质是 new String ,效率也低,耗时排序:StringBuilder < StringBuffer < concat < +

Java 泛型擦除

  • 修饰成员变量等类结构相关的泛型不会被擦除
  • 容器类泛型会被擦除

ArrayList、LinkedList

ArrayList

基于数组实现,查找快:o(1),增删慢:o(n)
初始容量为10,扩容通过 System.arrayCopy 方法

LinkedList

基于双向链表实现,查找慢:o(n),增删快:o(1)
封装了队列和栈的调用

HashMap 、HashTable

HashMap

  • 基于数组和链表实现,数组是 HashMap 的主体;链表是为解决哈希冲突而存在的
  • 当发生哈希冲突且链表 size 大于阈值时会扩容,JAVA 8 会将链表转为红黑树提高性能
    允许 key/value 为 null

HashTable

  • 数据结构和 HashMap 一样
  • 不允许 value 为 null
  • 线程安全

ArrayMap、SparseArray

ArrayMap

1.基于两个数组实现,一个存放 hash;一个存放键值对。扩容的时候只需要数组拷贝,不需要重建哈希表
2.内存利用率高
3.不适合存大量数据,因为会对 key 进行二分法查找(1000以下)

SparseArray

1.基于两个数组实现,int 做 key
2.内存利用率高
3.不适合存大量数据,因为会对 key 进行二分法查找(1000以下)

volatile 关键字

  • 只能用来修饰变量,适用修饰可能被多线程同时访问的变量
  • 相当于轻量级的 synchronized,volatitle 能保证有序性(禁用指令重排序)、可见性;后者还能保证原子性
  • 变量位于主内存中,每个线程还有自己的工作内存,变量在自己线程的工作内存中有份拷贝,线程直接操作的是这个拷贝
  • 被 volatile 修饰的变量改变后会立即同步到主内存,保持变量的可见性。

双重检查单例,为什么要加 volatile?

1.volatile想要解决的问题是,在另一个线程中想要使用instance,发现instance!=null,但是实际上instance还未初始化完毕这个问题

2.将instance =newInstance();拆分为3句话是。1.分配内存2.初始化3.将instance指向分配的内存空

3.volatile可以禁止指令重排序,确保先执行2,后执行3

wait 和 sleep

  • sleep 是 Thread 的静态方法,可以在任何地方调用
  • wait 是 Object 的成员方法,只能在 synchronized 代码块中调用,否则会报 IllegalMonitorStateException 非法监控状态异常
  • sleep 不会释放共享资源锁,wait 会释放共享资源锁

lock 和 synchronized

  • synchronized 是 Java 关键字,内置特性;Lock 是一个接口
  • synchronized 会自动释放锁;lock 需要手动释放,所以需要写到 try catch 块中并在 finally 中释放锁
  • synchronized 无法中断等待锁;lock 可以中断
  • Lock 可以提高多个线程进行读/写操作的效率
  • 竞争资源激烈时,lock 的性能会明显的优于 synchronized

可重入锁

  • 定义:已经获取到锁后,再次调用同步代码块/尝试获取锁时不必重新去申请锁,可以直接执行相关代码
  • ReentrantLock 和 synchronized 都是可重入锁

公平锁

  • 定义:等待时间最久的线程会优先获得锁
  • 非公平锁无法保证哪个线程获取到锁,synchronized 就是非公平锁
  • ReentrantLock 默认时非公平锁,可以设置为公平锁

乐观锁和悲观锁

  • 悲观锁:线程一旦得到锁,其他线程就挂起等待,适用于写入操作频繁的场景;synchronized 就是悲观锁
  • 乐观锁:假设没有冲突,不加锁,更新数据时判断该数据是否过期,过期的话则不进行数据更新,适用于读取操作频繁的场景
  • 乐观锁 CAS:Compare And Swap,更新数据时先比较原值是否相等,不相等则表示数据过去,不进行数据更新
  • 乐观锁实现:AtomicInteger、AtomicLong、AtomicBoolean

死锁 4 个必要条件

  • 互斥
  • 占有且等待
  • 不可抢占
  • 循环等待

synchronized 原理

  • 每个对象都有一个监视器锁:monitor,同步代码块会执行 monitorenter 开始,motnitorexit 结束
  • wait/notify 就依赖 monitor 监视器,所以在非同步代码块中执行会报 IllegalMonitorStateException 异常

3、Java 虚拟机&内存结构&GC&类加载&四种引用&动态代理

JVM

  • 定义:可以理解成一个虚构的计算机,解释自己的字节码指令集映射到本地 CPU 或 OS 的指令集,上层只需关注 Class 文件,与操作系统无关,实现跨平台
  • Kotlin 就是能解释成 Class 文件,所以可以跑在 JVM 上

JVM 内存模型

  • Java 多线程之间是通过共享内存来通信的,每个线程都有自己的本地内存
  • 共享变量存放于主内存中,线程会拷贝一份共享变量到本地内存
  • volatile 关键字就是给内存模型服务的,用来保证内存可见性和顺序性

JVM 内存结构

线程私有

1.程序计数器:记录正在执行的字节码指令地址,若正在执行 Native 方法则为空
2.虚拟机栈:执行方法时把方法所需数据存为一个栈帧入栈,执行完后出栈
3.本地方法栈:同虚拟机栈,但是针对的是 Native 方法

线程共享

1.堆:存储 Java 实例,GC 主要区域,分代收集 GC 方法会吧堆划分为新生代、老年代
2.方法区:存储类信息,常量池,静态变量等数据

GC

回收区域:只针对堆、方法区;线程私有区域数据会随线程结束销毁,不用回收

最后

说一千道一万,不如自己去行动。要想在移动互联网的下半场是自己占有一席之地,那就得从现在开始,从今天开始,马上严格要求自己,既重视业务实现能力,也重视基础和原理。基础夯实好了,高楼才能够平地而起,稳如泰山。

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节

还有 高级架构技术进阶脑图、Android开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

点击:

《Android架构视频+BAT面试专题PDF+学习笔记​》

即可免费获取~

视频+BAT面试专题PDF+学习笔记](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)​》**

即可免费获取~

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

来看看移动端小程序技术的前世今生!小白也能看明白相关推荐

  1. 小程序技术始于微信?来看看移动端小程序技术的前世今生!

    本文由DCloud 公司创始人王安原创发布于CSDN,原题<小程序技术演进史>,即时通讯网收录时有改动,感谢原作者. 1.引言 微信的成功,并非特定于某个具体的功能,微信的成功实际上是一大 ...

  2. android音视频开发面试,来看看移动端小程序技术的前世今生!真香

    前言 想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. 学算法真的很痛苦,虽然大数据现在很火,但找到适合自己定位的职业也未尝不是一种合理选择. ...

  3. 小程序技术,打开跨端管理的思路,提高客户满意度和忠诚度

    小程序容器作为跨端管理的有效工具,已经成为越来越多企业的选择.通过小程序容器,企业可以实现跨平台部署,提供一致的用户体验,整合多种渠道实现全渠道协同,进行个性化营销,以及通过数据分析和监控等手段优化产 ...

  4. 独家!支付宝小程序技术架构全解析

    在轻应用混战的当下,小程序已经成为巨头们角逐的焦点,阿里自然也不甘落后.据阿里官方的数据,截止到今年1月28日为止,支付宝小程序应用数已经达到12万,总用户数突破5亿,日活跃用户数突破2.3亿,用户通 ...

  5. qml如何发布程序_首创PC端小程序直播发布会,360如何与手机厂商一起共振?

    文 | Toby Lu 全新的线上发布会形式,正在搅动着手机品牌营销江湖. 疫情之下,线上发布会的形式成为手机品牌产品亮相的最佳形式,与传统的联合各家媒体做直播不同,聚焦于一个媒体平台,全场景.全链路 ...

  6. mPaaS小程序技术架构深度解析

    ⚅ 点击观看<mPaaS 小程序新品发布会>回放 > > 随着小程序技术的愈发成熟,不同平台的优势和典型使用场景各有侧重,同时越来越多的开发者可以结合自身的业务特色,通过小程序 ...

  7. 基于SpringBoot+VUE(PC端+小程序端)的智能在线考试系统毕业设计

    作者主页:编程千纸鹤 作者简介:Java.前端.Python开发多年,做过高程,项目经理,架构师 主要内容:Java项目开发.毕业设计开发.面试技术整理.最新技术分享 收藏点赞不迷路  关注作者有好处 ...

  8. 阿里云产业赋能:多端小程序Saas平台的突围之路

    导语:本文中,夺冠CEO王文龙介绍了在阿里云技术.资源.渠道和服务的赋能下,多端小程序SaaS平台的发展情况,并分享了SaaS平台发展路径的三个阶段 夺冠互动是从去年年底开始加入到阿里云SaaS生态的 ...

  9. 打车代驾同城顺风车货运好友代驾端小程序APP源码支持二开

    功能简单介绍: 一.乘客端: 代驾: 1.当前地理位置定位, 2.目的地填写,当前位置到目的地路程计算,到达时间预估,全程费用预估: 3.等待周围司机接单: 4.司机接单后到指定目的地,确认乘客上车, ...

最新文章

  1. 现实给了梦想多少时间
  2. 灰流丽能无效融合么_紫砂壶里的柴烧、捂灰、还原烧你能分清楚吗?一次性给你讲清楚...
  3. RedHat Enterprise LInux 6.3 安装Oracle Database 11g
  4. js 字符串删除首尾_JavaScript trim 实现去除字符串首尾指定字符的简单方法
  5. t2 初识Tornado
  6. LeetCode 451. 根据字符出现频率排序(Sort Characters By Frequency)
  7. sql update date类型_数据工厂可视化操作与SQL查询——1.基础篇
  8. oracle去空格和换行,ORACLE 中去回车、空格、TAB的函数
  9. ARM处理器对比分析
  10. Node.js潮牌官网 毕业设计-附源码 010955
  11. 2022年软件测试——精选金融银行面试真题
  12. sprd bootloader 分析流程
  13. 什么样的互联网创业者不靠谱?
  14. 计算机二级Ms-Office选择题汇总
  15. 基于pytorch的图像识别基础完整教程
  16. proftpd 530 Login incorrect
  17. 【2022年】中科大研究生-考试题、复习资料汇总(往年真题+复习资料)(持续更新中)
  18. Excel-VBA常用对象(Application、Workbook、Worksheet、Range)
  19. 1--STM32 ADC1与ADC2 16通道DMA采集笔记
  20. 回音消除原理解析及Android应用

热门文章

  1. Win7系统下使用猎豹浏览器兼容模式替代IE浏览器
  2. RabbitMQ常见问题解决方案——消息丢失、重复消费、消费乱序、消息积压
  3. AltiumDesigner下PCB设计学习帖(20181225-20220122)
  4. vue-lottie控制动画的播放、暂停、跳转帧数
  5. 程序员用Python分析徐峥,竟研究出《我不是药神》30亿票房真正秘诀!
  6. java基础-简单的抽奖程序
  7. PowerDVD(了解收藏)
  8. 关于Virtual clock
  9. c# virtual 和 abstract
  10. lifekeeper +DR+windows for sql 双机