Android开发大佬的百度美团快手等大厂Offer收割之旅,作为Android程序员都应掌握

一、概述

随着业务的发展,工程的逐渐增大与开发人员增多,很多工程都走向了模块化、组件化、插件化道路,来方便大家的合作开发与降低业务之间的耦合度。现在就和大家谈谈模块化的交互问题,首先看下模块化的几个优势。

模块化的优势
  1. 结构清晰:业务独立,代码实现分离,不会搅在一起。

  2. 便于协作:每个开发同学只要自己负责的模块,没有太多的耦合。

  3. 便于维护:各模块管理自己的代码、布局、资源,主工程可以方便添加与移除。

    特点:高内聚、低耦合。

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学习PDF+架构视频+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。分享给大家,非常适合近期有面试和想在技术道路上继续精进的朋友。快来获取学习资料吧~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/724546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CPP编程-CPP11中的内存管理策略模型与名称空间管理探幽(时隔一年,再谈C++抽象内存模型)

CPP编程-CPP11中的内存管理策略模型与名称空间管理探幽 CPP的四大内存分区模型 在 C 中&#xff0c;**内存分区是一种模型&#xff0c;用于描述程序运行时内存的逻辑组织方式&#xff0c;但在底层操作系统中&#xff0c;并不存在严格意义上的内存分区。**操作系统通常将内存分…

太惊艳了!多微信管理利器,让你事半功倍!

作为现代社交媒体的主要平台之一&#xff0c;微信在商务领域中扮演着重要的角色。为了提高我们的工作效率&#xff0c;微信管理系统应运而生。 这个系统可以同时登录多个微信账号&#xff0c;并进行统一管理。除了便捷的登录管理功能外&#xff0c;微信管理系统还提供了许多实…

[Firefly-Linux] RK3399点亮eDP液晶屏并支持触摸

连接方法 EDP 液晶屏模组与主控的连接分为四部分: (1)屏幕背光 (2)EDP 信号 (3)电压跳线 (4)TP 触摸 屏幕背光 屏幕背光的原理图如下: BL_EN 是背光使能引脚,连接到主控的 GPIO1_A1 端口LCD_BL_PWM0 是 PWM 调光引脚,使用主控的 PWM0 端口EDP 信号 EDP 信号的…

秒杀蓝牙!华为“星闪”到底是什么?

2023年8月4日&#xff0c;华为2023HDC大会正式举办&#xff0c;鸿蒙4.0确实很惊艳&#xff0c;流畅与个性齐头并进。 但无人在意的角落&#xff0c;星闪Nearlink的星星之火即将燎原。 大会上余总对星闪一笔带过&#xff0c;众所周知&#xff0c;越不重要出现越少&#xff0c;…

JAVA集合6-TreeSet

介绍 TreeSet&#xff1a;基于红黑树实现的有序集合&#xff0c;按元素的自然顺序或自定义顺序排序。 TreeSet<String> treeSet new TreeSet<>(); treeSet.add("Item 1"); treeSet.add("Item 2");TreeSet 的底层实现是基于 TreeMap 的&…

土地利用数据分类过程教学/土地利用分类/遥感解译/土地利用获取来源介绍/地理数据获取

本篇主要介绍如何对影像数据进行分类解译&#xff0c;及过程教学&#xff0c;示例数据下载链接&#xff1a;数据下载链接 一、背景介绍 土地是人类赖以生存与发展的重要资源和物质保障&#xff0c;在“人口&#xff0d;资源&#xff0d;环境&#xff0d;发展&#x…

Resilience4J之隔离(BulkHead)

Resilience4J之隔离(BulkHead) 中文官网https://github.com/lmhmhl/Resilience4j-Guides-Chinese/blob/main/core-modules/bulkhead.md 作用是&#xff1a;限制并发。 依赖隔离&负载保护&#xff1a;用于限制对于下游服务的最大并发数量的限制 maven依赖 <!--resil…

华为OD机试“HJ12 字符串反转”Java编程解答

描述 接受一个只包含小写字母的字符串&#xff0c;然后输出该字符串反转后的字符串。&#xff08;字符串长度不超过1000&#xff09; 输入描述&#xff1a; 输入一行&#xff0c;为一个只包含小写字母的字符串。 输出描述&#xff1a; 输出该字符串反转后的字符串。 示例…

npm证书过期问题

当我们在安装某些东西的时候&#xff0c;终端会报错: npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/js-md5 failed, reason: certificate has expirednpm ERR! A complete log of this run can be f…

最强模型Claude 3 Haiku速通指南在此!保姆级教学拿脚都能学会!

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…

Hack The Box-Perfection

目录 信息收集 nmap dirsearch gobuster whatweb WEB 信息收集 ffuf 漏洞探索 漏洞发现 模板注入 反弹shell 提权 get user and flag 信息收集 ssh登录&get root and flag 信息收集 nmap 端口探测┌──(root㉿ru)-[~/kali/hackthebox] └─# nmap -p- 10…

Java学习笔记005——接口的继承与实现

正如类之间可以继承&#xff0c;一个接口也可以继承另一个接口。Java为了避免多重继承带来的基类方法调用冲突的问题&#xff0c;Java只允许类的单继承&#xff0c;但允许接口的多继承。 1、接口的继承&#xff1a;更应该称为扩展。 &#xff08;1&#xff09;Animal.java&am…

C++之析构函数

在 C 中&#xff0c;析构函数&#xff08;Destructor&#xff09;是一个特殊的成员函数&#xff0c;用于在对象生命周期结束时执行清理工作和资源释放。析构函数的名称与类名相同&#xff0c;前面加上波浪号&#xff08;~&#xff09;&#xff0c;不接受任何参数&#xff0c;也…

[R] ggplot2 - exercise (“fill =“)

We have made the plots like: Lets practice with what we have learnt in: [R] How to communicate with your data? - ggplot2-CSDN博客https://blog.csdn.net/m0_74331272/article/details/136513694 #tutorial 5 -script #Exercise 1 #1.1# ggplot(smoking_and_drug_use_…

微信小程序开发系列(八)·微信小程序页面的划分以及轮播图区域的绘制和图片的添加

目录 1. 划分页面结构 2. 轮播图区域绘制 3. 轮播图图片添加 1. 划分页面结构 最终我们想达到如下效果&#xff1a; 其页面分为四层结构&#xff0c;因此我们需要配置四块view&#xff0c;代码如下&#xff1a; <!-- view 小程序提供的容器组件&#xff0c;可以当成…

【学习】torch.nn.CrossEntropyLoss交叉熵损失函数

交叉熵损失函数torch.nn.CrossEntropyLoss 交叉熵主要是用来判定实际的输出与期望的输出的接近程度&#xff0c;为什么这么说呢&#xff0c;举个例子&#xff1a; 在做分类的训练的时候&#xff0c;如果一个样本属于第K类&#xff0c;那么这个类别所对应的输出节点的输出值应…

支持国密的 Web 服务器

目录 前言编译 Nginx-with-GmSSLv3安装编译依赖的包下载源码编译代码配置与运行数字证书的生成与配置Nginx配置文件修改运行 Nginx-with-GmSSLv3测试Nginx小结前言 在上一章ARM 架构下国密算法库中,介绍了在银河麒麟系统 ARM 架构下编译国密库 GmSSL,在本章中,我将介绍集成…

96、C++ 性能优化一览

在对 C++ 版本的 resnet50 经过大约 5 个版本的优化之后,性能也基本达到了预期。至少利用手写的 resnet50 在 CPU 上推理一张图片感觉不到卡顿了。 下面对这几个版本的性能优化做一个总结。 初始版本1 第一版本的 C++ 代码,并没有考虑性能问题,仅仅是想按照手写 resnet50 …

操作系统原理与实验——实验四短进程优先调度

实验指南 运行环境&#xff1a; Dev c 算法思想&#xff1a; 短进程优先 (SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程&#xff0c;将处理机分配给它&#xff0c;使它立即执行并一直执行到完成 核心数据结构&#xff1a; typedef struct data{ int hour; int…

Docker镜像操作介绍

一、镜像操作 镜像的操作可分为&#xff1a; 拉取镜像&#xff1a;拉取远程仓库的镜像到本地 docker pull重命名镜像&#xff1a;使用docker tag 命令重命名镜像查看镜像&#xff1a;使用docker image ls 或者 docker images命令查看本地已经存在的镜像删除镜像&#xff1a;删…