wordpress 显示相册,台州关键词优化服务,做暧暖ox网站,交易网站域名一、概述
随着业务的发展#xff0c;工程的逐渐增大与开发人员增多#xff0c;很多工程都走向了模块化、组件化、插件化道路#xff0c;来方便大家的合作开发与降低业务之间的耦合度。现在就和大家谈谈模块化的交互问题#xff0c;首先看下模块化的几个优势。
模块化的优…一、概述
随着业务的发展工程的逐渐增大与开发人员增多很多工程都走向了模块化、组件化、插件化道路来方便大家的合作开发与降低业务之间的耦合度。现在就和大家谈谈模块化的交互问题首先看下模块化的几个优势。
模块化的优势 结构清晰业务独立代码实现分离不会搅在一起。 便于协作每个开发同学只要自己负责的模块没有太多的耦合。 便于维护各模块管理自己的代码、布局、资源主工程可以方便添加与移除。 特点高内聚、低耦合。
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 来实现的所以非循环体可以直接用 循环体不行因为会频繁创建 StringBuilderString.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 关键字
只能用来修饰变量适用修饰可能被多线程同时访问的变量相当于轻量级的 synchronizedvolatitle 能保证有序性禁用指令重排序、可见性后者还能保证原子性变量位于主内存中每个线程还有自己的工作内存变量在自己线程的工作内存中有份拷贝线程直接操作的是这个拷贝被 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 就是悲观锁乐观锁假设没有冲突不加锁更新数据时判断该数据是否过期过期的话则不进行数据更新适用于读取操作频繁的场景乐观锁 CASCompare 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开发面试专题资料高级进阶架构资料 这几块的内容。分享给大家非常适合近期有面试和想在技术道路上继续精进的朋友。快来获取学习资料吧~