Android第三次面试总结之Java篇补充
一、Array 与 ArrayList 在 Android 中的深度对比与优化
1. 内存模型与性能差异的本质原因
-
数组(Array)的内存布局
基本类型数组(如int[]
)在 Java 中是连续的原始数据块,直接存储值,无额外对象开销;对象数组(如Object[]
)存储引用,每个元素占 4/8 字节(取决于是否开启指针压缩)。
Android 优势:在 ART 虚拟机中,数组的内存分配由 JVM 直接管理,无需经过垃圾回收器(GC)的对象头开销(如ArrayList
的元素需包装为Integer
,每个对象含 12 字节对象头 + 4 字节整数值)。
典型场景:音频处理中的 PCM 数据(short[]
)、图像像素数组(int[]
存储 ARGB 值),直接操作内存块可避免装箱拆箱,提升 CPU 缓存命中率(局部性原理)。 -
ArrayList 的动态扩容机制
- 源码解析(Android 11 源码):
private void add(E element, Object[] elementData, int s) {if (s == elementData.length) {elementData = grow(); // 扩容逻辑}elementData[s] = element;size = s + 1; } private Object[] grow() {int oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1); // 扩容 1.5 倍if (newCapacity < 0) { // 处理整数溢出newCapacity = Integer.MAX_VALUE;}return Arrays.copyOf(elementData, newCapacity); }
- 性能问题:每次扩容需复制旧数组到新内存空间,若在循环中频繁添加元素(如
for (int i=0; i<1000; i++) list.add(i)
),会触发多次Arrays.copyOf
,导致 CPU 密集型操作和内存碎片。 - Android 优化:在已知数据量时,通过
new ArrayList<>(initialCapacity)
避免扩容(如从数据库读取固定数量数据时)。
- 源码解析(Android 11 源码):
2. 与 Android 特有数据结构的底层实现对比
-
SparseArray:为什么比 HashMap<Integer, V> 高效 50% 以上?
- 存储结构:内部维护两个平行数组
int[] keys
和Object[] values
,按顺序存储键值对,通过二分查找(Arrays.binarySearch
)定位键。 - 内存优势:无
HashMap.Entry
对象开销(每个 Entry 含 4 字节哈希值 + 4/8 字节键值引用),且无需处理哈希冲突(如链表 / 红黑树)。 - 缺点:插入 / 删除需移动数组元素(平均 O (n) 时间),适合读多写少场景(如 View 的 ID 到 View 的映射,初始化后很少修改)。
- 存储结构:内部维护两个平行数组
-
ArrayMap:小数据量下的内存王者
- 实现原理:基于两个数组
int[] hashes
(存储哈希值)和Object[] entries
(存储键值对,按key, value, key, value...
排列),通过哈希值分组处理冲突(相同哈希值的键存储在相邻位置)。 - 核心优化:
- 负载因子为 1(无空闲桶浪费内存),且当元素超过阈值(默认 4 个时触发二次哈希)时,通过重新哈希减少冲突。
- 内存占用比 HashMap 小 50% 以上(无 Entry 对象,且数组紧凑),适合配置参数、事件映射等小数据场景(官方建议 ≤100 个元素)。
- 源码陷阱:
ArrayMap
的put
方法中,若键已存在,会直接替换值,而非像 HashMap 先删除再插入,减少数组移动次数。
- 实现原理:基于两个数组
二、synchronized 在 Android 组件中的深层问题与避坑指南
1. Activity 作为锁对象的潜在风险
- 内存泄漏原理:
若后台线程持有 Activity 的锁(如synchronized (this)
),且 Activity 因屏幕旋转等原因被销毁重建时,线程可能长期不释放锁,导致 Activity 实例无法被 GC 回收(锁对象引用链未断开)。 - 最佳实践:
使用生命周期无关的私有锁对象:private final Object mDataLock = new Object(); // 随类加载创建,与实例生命周期无关public void updateData(String data) {synchronized (mDataLock) { // 锁定独立对象,避免锁 Activity 本身// 操作共享数据} }
2. 自定义 View 中的线程安全:绘制流程与锁的配合
- 绘制线程模型:Android 的 UI 绘制由主线程(UI 线程)处理,若子线程修改 View 的属性(如
mWidth
,mColor
),需确保修改与onDraw()
同步。 - 案例分析:
public class AnimatedView extends View {private int mAnimatedValue;private final Object mDrawLock = new Object();// 子线程调用,更新动画值public void setAnimatedValue(int value) {synchronized (mDrawLock) { // 锁定绘制相关数据mAnimatedValue = value;invalidate(); // 触发主线程重绘}}@Overrideprotected void onDraw(Canvas canvas) {synchronized (mDrawLock) { // 绘制时读取数据,与修改同步canvas.drawText(String.valueOf(mAnimatedValue), ...);}} }
- 关键点:
invalidate()
会将重绘任务加入主线程队列,onDraw()
在主线程执行,通过同一把锁确保数据一致性,避免 “脏读”(读取到一半修改的值)。
- 关键点:
三、volatile 在 Android 中的底层原理与使用边界
1. 双重检查锁定(DCL)必须 volatile 的根本原因
- 对象初始化的非原子性:
instance = new AppManager();
实际分为三步:- 分配内存空间(
memory = allocate()
); - 调用构造函数初始化对象(
ctorInstance(memory)
); - 将内存地址赋值给引用(
instance = memory
)。
在没有 volatile 时,JVM 可能重排序步骤 2 和 3(指令重排序优化),导致线程 A 看到instance != null
但对象未初始化,线程 B 调用instance
时报错。
- 分配内存空间(
- volatile 的作用:
确保对instance
的写操作具有 “happens-before” 关系,即禁止指令重排序,保证其他线程看到的是初始化完成的对象(JVM 内存模型中的有序性保证)。
2. volatile 无法解决的复合操作问题
- 错误案例:
private volatile boolean isPaused = false; private int count = 0;// 子线程 1: while (!isPaused) {count++; // 非原子操作(读取 count → 加 1 → 写入 count) }// 子线程 2: isPaused = true;
- 问题:
count++
包含三步,volatile 仅保证isPaused
的可见性,不保证count
的原子性,可能导致部分计数丢失。
- 问题:
- 正确方案:
使用AtomicInteger
或synchronized
保护复合操作:private final AtomicInteger count = new AtomicInteger(0); while (!isPaused) {count.incrementAndGet(); // 原子操作 }
四、Android 面试高频问题的深度解析
1. ArrayList 扩容在 Adapter 中的性能瓶颈与监控
- 问题复现:在
BaseAdapter.getView
中动态创建临时列表:@Override public View getView(int position, View convertView, ViewGroup parent) {List<String> tags = new ArrayList<>(); // 每次调用创建新列表tags.addAll(data.get(position).getTags());// ... }
滑动列表时,大量临时 ArrayList 导致 GC 频繁触发(内存抖动),帧率(FPS)骤降(如从 60fps 降至 30fps)。 - 优化方案:
- 复用列表对象:在
getView
外初始化List<String> reusableList = new ArrayList<>();
,每次调用前清空(reusableList.clear();
)。 - 预分配容量:
reusableList.ensureCapacity(data.get(position).getTags().size());
避免扩容。
- 复用列表对象:在
- 性能监控:通过 Android Profiler 查看内存分配热点,定位频繁创建 ArrayList 的代码段。
2. synchronized 与主线程 Looper 的协同机制
- 主线程特性:
主线程的 Looper 维护一个消息队列(MessageQueue),所有通过Handler
发送的任务(包括runOnUiThread
)均按顺序执行,UI 操作天然线程安全(因单线程执行)。 - 误区澄清:
- 若多个后台线程通过同一 Handler 发送修改非 UI 共享数据的任务(如全局配置
configMap
),任务虽串行执行,但configMap
本身可能被其他未通过 Handler 的线程修改,仍需同步:private final Map<String, String> configMap = new HashMap<>(); private final Handler mainHandler = new Handler(Looper.getMainLooper());// 后台线程 A new Thread(() -> {configMap.put("key", "value1"); // 未通过 Handler,需加锁mainHandler.post(() -> updateUI()); }).start();// 后台线程 B new Thread(() -> {synchronized (configMap) { // 保护非 UI 数据configMap.put("key", "value2");}mainHandler.post(() -> updateUI()); }).start();
- 结论:UI 操作无需加锁,但共享数据(无论是否与 UI 相关)的跨线程访问必须同步。
- 若多个后台线程通过同一 Handler 发送修改非 UI 共享数据的任务(如全局配置
五、Android 特定场景下的进阶实践
1. 替代 ArrayList 的极致内存优化方案
-
基本类型专用列表:
使用 AndroidX 的android.util.PrimitiveArrayUtils
或第三方库(如 Trove)的TIntArrayList
、TLongArrayList
,避免包装类开销。// 替代 ArrayList<Integer> TIntArrayList intList = new TIntArrayList(); intList.add(1); // 直接存储 int,无装箱
-
对象池技术:
对频繁创建销毁的 ArrayList(如网络请求返回的临时数据列表),使用对象池复用实例:private static final ObjectPool<ArrayList<String>> listPool =new ObjectPool<ArrayList<String>>() {@Overrideprotected ArrayList<String> create() {return new ArrayList<>();}};// 使用时从池中获取 ArrayList<String> list = listPool.acquire(); list.clear(); // 清空旧数据 list.addAll(data); // 使用后归还池中 listPool.release(list);
2. 原子类与 CAS 操作的深度应用
- AtomicInteger 的底层实现:
基于sun.misc.Unsafe
的compareAndSwapInt
方法(CAS 操作),无锁实现原子更新,适合高并发场景(如计数器、线程安全的单例计数)。 - ABA 问题在 Android 中的忽略场景:
当原子类存储的是数值(如AtomicInteger
),且业务逻辑不依赖中间值(仅关心最终结果)时,ABA 问题不影响结果(如统计点击次数,中间值被修改后改回不影响最终计数)。
注意:若存储对象引用(如AtomicReference
),需通过AtomicStampedReference
解决 ABA(如资源池的对象状态管理)。
六、总结:Android 内存与并发的核心设计原则
场景 | 推荐方案 | 核心优势 | 避坑点 |
---|---|---|---|
固定大小基本类型存储 | 数组(int[] , byte[] ) | 无包装类开销,内存连续,CPU 缓存友好 | 大小固定,不适合动态增长场景 |
动态对象列表 | ArrayList(初始化指定容量) | 动态扩容,操作便捷 | 避免频繁扩容(预分配容量),基本类型用专用列表 |
整数键轻量映射 | SparseArray | 无 Entry 对象开销,内存效率高 | 插入删除效率低,适合读多写少 |
小数据量键值对 | ArrayMap(API 19+) | 内存占用比 HashMap 少 50%+,小数据高效 | 大数据量(>100 元素)性能下降 |
简单状态标志(可见性) | volatile | 保证内存可见性,禁止指令重排序 | 仅用于单次读 / 写,复合操作需配合锁或原子类 |
复合操作线程安全 | synchronized 或 AtomicXXX | 原子性保证 | synchronized 锁粒度控制,避免锁长生命周期对象 |
UI 相关线程安全 | Handler/runOnUiThread + 私有锁(非 UI 数据) | 主线程单线程模型,非 UI 数据需额外保护 | 勿依赖主线程单线程特性保护非 UI 共享数据 |
相关文章:
Android第三次面试总结之Java篇补充
一、Array 与 ArrayList 在 Android 中的深度对比与优化 1. 内存模型与性能差异的本质原因 数组(Array)的内存布局 基本类型数组(如 int[])在 Java 中是连续的原始数据块,直接存储值,无额外对象开销&#…...
CVPR2023 | 通过降低对图像块损坏的敏感性来提高视觉Transformer的鲁棒性
Improving Robustness of Vision Transformers by Reducing Sensitivity to Patch Corruptions 摘要-Abstract引言-Introduction相关工作-Related Work降低对Patch损坏的敏感性-Reducing Sensitivity to Patch Corruptions实验-Experiments分析与讨论-Analysis and Discussions…...
NV228NV254固态美光颗粒NV255NV263
NV228NV254固态美光颗粒NV255NV263 美光颗粒固态硬盘技术解析与选购指南 一、美光颗粒技术体系解析 1. 颗粒分类与性能差异 美光颗粒采用独特编号体系,NV254(如MT29F8T08GLLBHL4-36QMES)代表8Tb TLC颗粒,采用BOS(浮…...
LeetCode 1007. 行相等的最少多米诺旋转 题解
示例 输入:tops [2,1,2,4,2,2], bottoms [5,2,6,2,3,2] 输出:2 解释: 图一表示:在我们旋转之前, tops 和 bottoms 给出的多米诺牌。 如果我们旋转第二个和第四个多米诺骨牌,我们可以使上面一行中的每个…...
c盘怎么安全清理---微软电脑管家
1、c盘红了怎么办 问了ai,也是要安装第三方的软件,win自带的不行吗?找找看 2、主角登场 仔细一看确实是官方自带的 3、使用自带工具扫描 4、转移文件到其他的盘 系统应用管理中的工具里面有个可以转移安装的软件到d盘,有一些软…...
C语言----指针入门篇
1. 指针是什么? 指针理解的两个要点: 1. 指针是内存中一个最小单元的编号 也就是地址 2. 平时口语中说的指针 通常指的是指针变量 是用来存放内存地址的变量 下面我将会具体解释上面两个要点 这时我们就不得不提一提内存了 1.1 什么是内存呢? C语言中的内存布局 程序…...
GitHub 趋势日报 (2025年05月03日)
本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1hacksider/Deep-Live-Camreal time face swap and one-click video deepfake with only a single image⭐ 1582⭐ 59337Python2aip…...
Go-Spring 全新版本 v1.1.0
Go-Spring 全新版本 v1.1.0 已于 2025 年发布。该版本具有诸多新特性,具体如下: 命名与结构优化:命名更加符合 Go 规范,模块划分更加合理,核心设计更加简洁。功能增强:突破性地支持统一日志框架,…...
JVM——JVM是怎么实现invokedynamic的?
JVM是怎么实现invokedynamic的? 在Java 7引入invokedynamic之前,Java虚拟机(JVM)在方法调用方面相对较为“僵化”。传统的Java方法调用主要依赖于invokestatic、invokespecial、invokevirtual和invokeinterface这四条指令&#x…...
使用 IDEA + Maven 搭建传统 Spring MVC 项目的详细步骤(非Spring Boot)
搭建Spring MVC项目 第一步:创建Maven项目第二步:配置pom.xml第三步:配置web.xml第四步:创建Spring配置文件第五步:创建控制器第六步:创建JSP视图第七步:配置Tomcat并运行目录结构常见问题解决与…...
洛谷 P1495:【模板】中国剩余定理(CRT)/ 曹冲养猪
【题目来源】 https://www.luogu.com.cn/problem/P1495 https://www.acwing.com/problem/content/225/ 【题目描述】 自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪。可是曹冲满不高兴,于是在工作中马马虎…...
【iOS】 分类 拓展 关联对象
【iOS】 分类 拓展 关联对象 文章目录 【iOS】 分类 拓展 关联对象前言拓展分类分类与拓展的区别分类拓展关联对象哈希表(AssociationsHashMap) 大致工作流程setgetremove 关联对象的释放时机总结 前言 之前讲过有关于类对象的内容,这里学习一下有关于类的分类拓展和关联对象的…...
iview 老版本合并单元格
新版的iview中已经支持了合并单元格了,我的版本比较老,为:"iview": "^3.5.2"。暂不支持。记录一下别的大佬的方法。感觉思路比较活,正在这种思路需要在解决问题的过程中学习。 核心思路:通过rende…...
go语言实现用户管理系统
goweb实现用户管理系统 用户后台管理系统功能描述 登录功能 支持用户通过邮箱密码和密码进行登录。对输入的邮箱和密码进行验证,确保用户信息的正确性。登录成功后,更新用户的今日登录统计信息,并将用户信息存入会话(cookie&am…...
普通IT的股票交易成长史--20250504实盘记录
声明:本文章的内容只是自己学习的总结,不构成投资建议。价格行为理论学习可参考简介中的几位,感谢他们的无私奉献。 送给自己的话: 仓位就是生命,绝对不能满仓!!!!&…...
SQL手工注入(DVWA)
手工SQL注入攻击的标准思路 Low等级 (1)判断是否存在注入 (2)猜解字段个数 (3)确定字段顺序 (4)获取当前数据库 (5)获取当前数据库中的表 (…...
【LLM】deepseek R1之GRPO训练笔记(持续更新)
note 相关框架对比: 需微调模型且资源有限 → Unsloth;本地隐私优先的小规模推理 → Ollama;复杂逻辑或多模态任务 → SGLang;高并发生产环境 → vLLM 微调SFT和GRPO是确实能学到新知识的四种格式(messages、sharegpt…...
序列到序列学习
seq2seq 就是把一个句子翻译到另外一个句子。 机器翻译 给定一个源语言的句子,自动翻译成目标语言这两个句子可以有不同的长度 seq2seq 是一个 Encoder - Decoder 的架构 编码器是一个 RNN , 读取输入句子(可以是双向) 解码…...
去打印店怎么打印手机文件,网上打印平台怎么打印
在数字化时代,手机已成为我们存储和传输文件的重要工具。然而,当需要将手机中的文件转化为纸质文档时,许多人会面临选择:是前往线下打印店,还是利用线上打印平台?本文将为您解析这两种方式的优劣࿰…...
LeetCode每日一题5.4
1128. 等价多米诺骨牌对的数量 问题 问题分析 等价的定义为:两个骨牌 [a, b] 和 [c, d] 等价,当且仅当 (a c 且 b d) 或者 (a d 且 b c)。 思路 标准化骨牌表示: 为了方便比较,我们可以将每个骨牌 [a, b] 标准化为 [min(a…...
前端小练习————表白墙+猜数字小游戏
1,猜数字游戏 实现一个这个样式的 要猜的目标数字 点击重新开始游戏之后: 代码实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widt…...
五年级数学知识边界总结思考-上册
目录 一、背景二、过程1.小数乘法和除法小学五年级小数乘除法的知识点、由来、作用与意义解析**一、核心知识点梳理****二、知识点的由来****三、作用与意义****四、教学意义** **总结** 2.位置小学五年级“位置”知识点、由来、作用与意义解析**一、核心知识点梳理****二、知识…...
C与指针——内存操作与动态内存
1、内存常用操作 void* memcpy(void* dst,const void* src,size_t length); \\内存不允许重叠 void* memmove(void* dst,const void* src,size_t length); \\内存允许重叠 int memcmp(const void* dst,const void* src,size_t length); \\相等返回0 void* memset(void* dst,in…...
P3469 [POI 2008] BLO-Blockade
P3469 [POI 2008] BLO-Blockade 题目描述 B 城有 n n n 个城镇(从 1 1 1 到 n n n 标号)和 m m m 条双向道路。 每条道路连结两个不同的城镇,没有重复的道路,所有城镇连通。 把城镇看作节点,把道路看作边&…...
Linux网络编程 day3 五一结假
基本概念 三次握手 主动发起连接请求端,发送SYN标志位,请求建立连接。携带数据包包号、数据字节数(0)、滑动窗口大小。 被动接收连接请求端,发送ACK标志位,同时携带SYN请求标志位。携带序号、确认序号、数据包包号、数据字节数…...
解释一下NGINX的反向代理和正向代理的区别?
大家好,我是锋哥。今天分享关于【解释一下NGINX的反向代理和正向代理的区别?】面试题。希望对大家有帮助; 解释一下NGINX的反向代理和正向代理的区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 NGINX 作为一个高效的反向代理服务器&a…...
Coco AI 入驻 GitCode:打破数据孤岛,解锁智能协作新可能
在信息爆炸时代,企业正面临前所未有的挑战: 企业数据和信息分散,数据孤岛现象严重,员工往往浪费大量时间跨平台检索;跨部门协作困难,团队因信息隔阂导致项目延期;数据安全问题严峻,…...
【QT】QT中的网络编程(TCP 和 UDP通信)
QT中的网络编程(TCP 和 UDP通信) 1.tcp1.1 tcp通信1.1.1 相比linux中tcp通信:1.1.2 QT中的tcp通信: 1.2 tcp通信流程1.2.1 服务器流程:1.2.1.1 示例代码1.2.1.2 现象 1.2.2 客户端流程:1.2.2.1 示例代码1.2.2.2 现象: …...
个性化推荐:大数据引领电子商务精准营销新时代
个性化推荐:大数据引领电子商务精准营销新时代 引言 在电子商务的时代,个性化推荐系统已经成为提升用户体验、增强平台竞争力的重要技术。随着大数据技术的迅猛发展,传统的推荐方法已经无法满足用户日益增长的需求。为了精准地把握用户兴趣和消费倾向,商家们依赖大数据分析…...
【前端】【总复习】HTML
一、HTML(结构) HTML 是网页的骨架,主要负责网页的结构与语义表达,为 CSS 和 JavaScript 提供承载基础。 1.1 HTML 基本结构与语义化标签 1.1.1 HTML 基本结构 <!DOCTYPE html> <html lang"en"> <hea…...
Android 输入控件事件使用示例
一 前端 <EditTextandroid:id="@+id/editTextText2"android:layout_width="match_parent"android:layout_height="wrap_content"android:ems="10"android:inputType="text"android:text="Name" />二 后台代…...
JVM happens-before 原则有哪些?
理解Java Memory Model (JMM) 中的 happens-before 原则对于编写并发程序有很大帮助。 Happens-before 关系是 JMM 用来描述两个操作之间的内存可见性以及执行顺序的抽象概念。如果一个操作 A happens-before 另一个操作 B (记作 A hb B),那么 JMM 向你保证&#x…...
Python实例题:Python获取NBA数据
目录 Python实例题 题目 方式一:使用网页爬虫获取数据 代码解释 get_nba_schedule 函数: 主程序: 方式二:使用专业 API 获取数据 代码解释 运行思路 方式一 方式二 注意事项 以下是完整的 doubaocanvas 代码块&#…...
【中间件】brpc_基础_remote_task_queue
文章目录 remote task queue1 简介2 核心功能2.1 任务提交与分发2.2 无锁或低锁设计2.3 与 bthread 深度集成2.4 流量控制与背压 3 关键实现机制3.1 数据结构3.2 任务提交接口3.3 任务窃取(Work Stealing)3.4 同步与唤醒 4 性能优化5 典型应用场景6 代码…...
React-router v7 第七章(导航)
导航 在React-router V7中,大致有四种导航方式: 使用Link组件 link使用NavLink组件 navlink使用编程式导航useNavigate usenavigate使用redirect重定向 redirect Link Link组件是一个用于导航到其他页面的组件,他会被渲染成一个<a>…...
Terraform 中的 external 数据块是什么?如何使用?
在 Terraform 中,external 数据块(Data Block) 是一种特殊的数据源,允许你通过调用外部程序或脚本获取动态数据,并将结果集成到 Terraform 配置中。它适用于需要从 Terraform 外部的系统或工具获取信息的场景。 一、e…...
打印Excel表格时单元格文字内容被下一行遮盖的解决方法
本文介绍在打印Excel表格文件时,单元格最后一行的文字内容被下一行单元格遮挡的解决方法。 最近,需要打印一个Excel表格文件。其中,已知对于表格中的单元格,都设置了自动换行,如下图所示。 并且,也都设置了…...
【Linux】命令行参数与环境变量
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、命令行参数 1. 什么是命令行参数 2. 命令行参数的作用 二、环境变量 1. 基本概念 2. 常见的环境变量 3. 环境变量相关操作 定义…...
Dify 完全指南(一):从零搭建开源大模型应用平台(Ollama/VLLM本地模型接入实战)》
文章目录 1. 相关资源2. 核心特性3. 安装与使用(Docker Compose 部署)3.1 部署Dify3.2 更新Dify3.3 重启Dify3.4 访问Dify 4. 接入本地模型4.1 接入 Ollama 本地模型4.1.1 步骤4.1.2 常见问题 4.2 接入 Vllm 本地模型 5. 进阶应用场景6. 总结 1. 相关资源…...
民法学学习笔记(个人向) Part.3
民法学学习笔记(个人向) Part.3 8. 诉讼时效🌸 概念: 是指权利主体在法定期间内不行使权利,则债务人享有抗辩权,可以导致权利人无法胜诉的法律制度(有权你不用,别人就有话说了&#…...
C# 方法(返回值、返回语句和void方法)
本章内容: 方法的结构 方法体内部的代码执行 局部变量 局部常量 控制流 方法调用 返回值 返回语句和void方法 局部函数 参数 值参数 引用参数 引用类型作为值参数和引用参数 输出参数 参数数组 参数类型总结 方法重载 命名参数 可选参数 栈帧 递归 返回值 方法可以向调用代码返…...
打电话玩手机检测数据集VOC+YOLO格式8061张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):8061 标注数量(xml文件个数):8061 标注数量(txt文件个数):8061 …...
详解如何压测RocketMQ
目录 1.如何设计压测 2.压测工具 3.硬件配置 4.写代码压测 5.自带压测脚本 1.如何设计压测 二八定律法则:按业务峰值的 120% 设计压测目标(若线上峰值1000TPS,压测目标至少1200TPS) 关注三个指标 吞吐量(TPS&…...
实验三 触发器及基本时序电路
1.触发器的分类?各自的特点是什么? 1 、 D 触发器 特点:只有一个数据输入端 D ,在时钟脉冲的触发沿,输出 Q 的状态跟随输入端 D 的 状态变化,即 ,功能直观,利于理解和感受…...
双列集合——map集合和三种遍历方式
双列集合的特点 键和值一一对应,每个键只能对应自己的值 一个键和值整体称为键值对或键值对对象,java中叫做entry对象。 map常见的api map接口中定义了双列集合所有的共性方法,下面三个实现类就没有什么额外新的方法要学习了。 map接口…...
WebRTC 服务器之Janus视频会议插件信令交互
1.基础知识回顾 WebRTC 服务器之Janus概述和环境搭建-CSDN博客 WebRTC 服务器之Janus架构分析-CSDN博客 2.插件使用流程 我们要使⽤janus的功能时,通常要执⾏以下操作: 1. 在你的⽹⻚引入 Janus.js 库,即是包含janus.js; <…...
LabVIEW温控系统热敏电阻滞后问题
在 LabVIEW 构建的温控系统中,热敏电阻因热时间常数大(2 秒左右)产生的滞后效应,致使控温出现超调与波动。在不更换传感器的前提下,可从算法优化、硬件调整和系统设计等维度着手解决。 一、算法优化 1. 改进 PI…...
【Unity】使用XLua进行热修复
准备工作: (1)将XLua的Tool拖入Asset (2)配置热修复 (3)运行Genrate Code (4)运行Hotfix Inject In Editor 编写脚本(注意类上带有[Hotfix]) [Hot…...
GateWay使用
首先创建一个网关服务,添加对应的依赖 <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId&…...
如何使用责任链模式优雅实现功能(滴滴司机、家政服务、请假审批等)
在企业级开发中,我们经常会遇到一系列有先后顺序、逐步处理的逻辑链路,例如请假审批、报销审批、日志处理、事件处理、滴滴司机接单流程等。这些场景非常适合使用 责任链模式(Chain of Responsibility Pattern) 来优雅地实现。 本…...