Android面试总结之jet pack模块化组件篇
一、ViewModel 深入问题
1. ViewModel 如何实现跨 Fragment 共享数据?其作用域是基于 Activity 还是 Fragment?
问题解析:
ViewModel 的作用域由 ViewModelStoreOwner
决定。当 Activity 和其内部 Fragment 共享同一个 ViewModelStoreOwner
(如 Activity 本身)时,Fragment 可通过 Activity 的 ViewModelStore 共享 ViewModel。
源码分析:
ViewModelProvider
的构造函数接收ViewModelStoreOwner
(如 Activity 或 Fragment),每个 Owner 有独立的ViewModelStore
。- Activity 的 ViewModelStore:存储在
ComponentActivity
的mViewModelStore
成员变量,配置变更时通过NonConfigurationInstance
保存(见Activity#onRetainNonConfigurationInstance
)。 - Fragment 的 ViewModelStore:若在 Fragment 中通过
requireActivity()
作为 Owner 创建 ViewModel(如new ViewModelProvider(requireActivity()).get(...)
),则共享 Activity 的 ViewModelStore;若用this
作为 Owner,则使用 Fragment 独立的 ViewModelStore(仅在 Fragment 销毁时清除)。
总结:
跨 Fragment 共享数据时,需让 Fragment 使用同一个 Owner(如 Activity)获取 ViewModel,此时 ViewModel 作用域为 Activity 生命周期;若用 Fragment 自身作为 Owner,则作用域为 Fragment 生命周期。
2. ViewModel 的 onCleared () 何时被调用?如何避免内存泄漏?
问题解析:
onCleared()
在 ViewModelStore 调用 clear()
时触发,需确保在此释放资源(如取消协程、解绑回调)。
源码分析:
ComponentActivity#onDestroy()
中,若!isChangingConfigurations()
(即 Activity 真正销毁,非配置变更),则调用getViewModelStore().clear()
。ViewModelStore#clear()
遍历所有 ViewModel 并调用onCleared()
,同时清空 HashMap。- 若 ViewModel 持有 Activity 引用(如非 Application 上下文),需使用弱引用或
getApplication()
避免泄漏。
总结:
onCleared()
在 Owner(Activity/Fragment)永久销毁时调用,需在此清理异步任务(如取消 viewModelScope
中的协程),避免持有 Activity 强引用。
3. 如何自定义 ViewModelProvider.Factory?其在依赖注入中的作用是什么?
问题解析:
自定义 Factory 可向 ViewModel 传递参数(如数据库实例、Repository),是依赖注入的关键。
源码分析:
ViewModelProvider
构造函数接收Factory
,默认使用NewInstanceFactory
(通过无参构造创建 ViewModel)。- 自定义 Factory 需实现
create(Class<T> modelClass)
,例如:public class MyViewModelFactory extends ViewModelProvider.Factory {private final Context context;public MyViewModelFactory(Context context) {this.context = context;}@NonNull@Overridepublic <T extends ViewModel> T create(@NonNull Class<T> modelClass) {if (modelClass.isAssignableFrom(MyViewModel.class)) {return (T) new MyViewModel(context); // 传递参数}throw new IllegalArgumentException("Unknown ViewModel class");} }
- 在 Activity 中使用:
new ViewModelProvider(this, new MyViewModelFactory(getApplication())).get(MyViewModel.class);
总结:
自定义 Factory 允许向 ViewModel 注入依赖,避免硬编码,配合 Hilt 等库可实现更复杂的依赖管理。
二、LiveData 深入问题
1. LiveData 为什么会出现 “黏性事件”?如何实现非黏性订阅?
问题解析:
黏性事件指新订阅的观察者会立即收到最新数据,即使数据未更新。这是由于 LiveData 存储了最新数据和版本号。
源码分析:
LiveData
内部通过mData
存储数据,mVersion
记录版本号。observe()
注册时,LifecycleBoundObserver
的considerNotify()
方法会检查观察者的mLastVersion
是否小于当前mVersion
,若小于则触发onChanged()
:if (observer.mLastVersion >= mVersion) {return; // 版本号一致,不通知 } observer.mLastVersion = mVersion; ((Observer<T>) observer.mObserver).onChanged((T) mData);
- 新订阅的观察者
mLastVersion
初始为-1
,必然小于当前mVersion
(至少为 0),导致立即触发回调。
非黏性实现:
- 使用
observeForever(Observer)
配合生命周期监听,手动控制订阅与取消。 - 或封装
MediatorLiveData
或Transformations.map()
过滤旧数据。
总结:
黏性事件是 LiveData 设计用于保证 UI 一致性的机制,若需非黏性(如事件只触发一次),可使用 SingleLiveEvent
或第三方库(如 EventFlow)。
2. setValue () 和 postValue () 的区别是什么?如何保证线程安全?
问题解析:
二者均用于更新数据,区别在于线程调度和执行时机。
源码分析:
setValue()
:- 必须在主线程调用(通过
assertMainThread()
检查)。 - 直接更新
mData
和mVersion
,调用dispatchingValue()
通知观察者。
- 必须在主线程调用(通过
postValue()
:- 可在子线程调用,通过
ArchTaskExecutor
将任务切换到主线程。 - 数据暂存到
mPendingData
,通过mPostValueRunnable
异步执行setValue()
:private final Runnable mPostValueRunnable = new Runnable() {@Overridepublic void run() {Object newValue;synchronized (mDataLock) {newValue = mPendingData;mPendingData = NOT_SET;}setValue((T) newValue);} };
- 可在子线程调用,通过
- 线程安全由
synchronized (mDataLock)
保证,避免多线程同时修改mPendingData
。
总结:
setValue()
用于主线程即时更新,postValue()
用于子线程异步更新,二者最终都会通过 dispatchingValue()
通知活跃观察者。
3. LiveData 如何感知 LifecycleOwner 的生命周期状态?
问题解析:
通过 LifecycleBoundObserver
监听 LifecycleOwner
的状态变化,控制观察者的活跃状态。
源码分析:
observe()
方法中创建LifecycleBoundObserver
,其实现LifecycleEventObserver
,重写onStateChanged()
:class LifecycleBoundObserver extends ObserverWrapper implements LifecycleEventObserver {final LifecycleOwner mOwner;@Overridepublic void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {if (source.getLifecycle().getCurrentState() == DESTROYED) {removeObserver(mObserver); // 销毁时移除观察者return;}activeStateChanged(shouldBeActive()); // 更新活跃状态}private boolean shouldBeActive() {Lifecycle.State state = mOwner.getLifecycle().getCurrentState();return state.isAtLeast(Lifecycle.State.STARTED); // STARTED 或 RESUMED 时活跃} }
- 当 LifecycleOwner 状态变为
STARTED
或RESUMED
时,观察者变为活跃,接收数据更新;DESTROYED
时自动移除,避免内存泄漏。
总结:
通过将观察者与 LifecycleOwner 的生命周期绑定,LiveData 确保仅在组件活跃时通知数据变化,实现自动的订阅 / 取消订阅。
三、Room 深入问题
1. Room 如何实现协程支持?suspend 函数的底层原理是什么?
问题解析:
Room 通过编译时生成的代码,将协程挂起函数转换为后台线程执行的任务。
源码分析:
- 在 DAO 中定义
suspend
函数时,Room 生成的实现类会使用kotlinx.coroutines.CoroutineDispatcher
。 - 例如,
NewsDao
中suspend fun insertNews(News)
会被编译为:public final class NewsDao_Impl implements NewsDao {private final RoomDatabase __db;private final CoroutineDispatcher __dispatcher = Dispatchers.IO; // 默认使用 IO 线程@Overridepublic void insertNews(final News news) {Coroutines.async(__dispatcher, false, new Continuation<Object, Unit>() {// 执行 SQL 插入操作(在后台线程)});} }
- 可通过
@Query(workerThread = true)
或在数据库构建时指定Dispatcher
自定义线程。
总结:
Room 利用 Kotlin 协程的 suspend
特性,默认在 Dispatchers.IO
线程执行数据库操作,避免阻塞主线程,编译时生成的代码确保线程安全。
2. Room 如何处理数据库升级?版本冲突时的最佳实践是什么?
问题解析:
通过 @Database(version = X)
指定版本,升级时需提供 Migration
对象定义升级逻辑。
源码分析:
RoomDatabaseBuilder
调用build()
时,会检查数据库版本:if (databaseVersion > existingVersion) {applyMigration(migrations, existingVersion, databaseVersion); // 应用 Migration }
Migration
实现migrate(SupportSQLiteDatabase, int oldVersion, int newVersion)
,需手动编写 SQL 语句修改表结构,例如:static final Migration MIGRATION_1_2 = new Migration(1, 2) {@Overridepublic void migrate(@NonNull SupportSQLiteDatabase database) {database.execSQL("ALTER TABLE News ADD COLUMN content TEXT"); // 添加字段} };
- 若新旧版本之间无对应 Migration,会抛出
IncompatibleDbException
。
最佳实践:
- 每次升级仅处理相邻版本(如 1→2,2→3),避免跨版本升级。
- 复杂升级可先备份数据,删除旧表并创建新表(
fallbackToDestructiveMigration
)。
总结:
Room 通过 Migration
类支持数据库升级,需确保每个版本间的迁移逻辑正确,避免数据丢失。
3. Room 如何优化查询性能?是否支持索引和事务?
问题解析:
Room 支持 SQL 优化特性,如索引、事务、批量操作等。
源码分析:
- 索引:通过
@Index
注解为实体类字段添加索引,生成的 SQL 会包含CREATE INDEX
。 - 事务:在 DAO 中使用
@Transaction
注解标记方法,Room 会生成beginTransaction()
和endTransaction()
包裹操作:@Dao interface NewsDao {@Transactionsuspend fun insertAndUpdate(News news1, News news2) {insertNews(news1);updateNews(news2); // 保证原子性} }
- 批量操作:使用
@Insert(onConflict = REPLACE)
或直接插入列表(insertAll(List<News>)
),减少多次 IO 开销。
总结:
Room 直接支持 SQL 优化特性,合理使用索引和事务可显著提升性能,批量操作避免逐行插入的性能损耗。
四、Navigation 深入问题
1. NavController 如何管理返回栈?popUpTo 和 popUpToInclusive 的作用是什么?
问题解析:
返回栈由 NavController 维护,通过导航图中的 action
配置栈行为。
源码分析:
NavController
内部使用BackStack
类(实为ArrayDeque<BackStackEntry>
)记录导航历史。popUpTo
属性指定返回时需弹出的目标目的地 ID,popUpToInclusive
若为true
,则同时弹出目标本身:<actionandroid:id="@+id/action_A_to_B"app:destination="@id/B"app:popUpTo="@id/A"app:popUpToInclusive="false" /> <!-- 从 B 返回时弹出到 A(不包含 A) -->
- 导航时,若
popUpTo
存在,NavController 会先弹出栈中所有在目标 ID 之上的条目,再压入新目的地。
总结:
popUpTo
用于清理返回栈,避免冗余条目,popUpToInclusive
控制是否包含目标条目,确保导航逻辑符合预期。
2. 如何在导航中传递复杂参数?是否支持安全类型校验?
问题解析:
通过导航图的 argument
定义参数,Room 支持类型校验和自动序列化。
源码分析:
在导航图中定义参数:
<fragmentandroid:id="@+id/DetailFragment"android:name="com.example.DetailFragment"><argumentandroid:name="newsId"app:argType="integer"android:defaultValue="-1" />
</fragment>
NavController.navigate(R.id.DetailFragment, bundle)
传递参数,findNavController().getCurrentBackStackEntry().getArguments()
获取,编译时通过@NavigationRes
校验目标 ID 合法性。- 复杂对象需实现
Parcelable
或使用@TypeConverter
(如 Room 实体类),导航时自动序列化 / 反序列化。
总结:
Navigation 支持基本类型和 Parcelable 对象的参数传递,编译时校验目标 ID,确保类型安全,复杂对象需实现序列化接口。
3. 深层链接(Deep Link)如何与 Navigation 集成?原理是什么?
问题解析:
深层链接通过导航图配置,将 URL 映射到应用内目的地。
源码分析:
- 在导航图中添加
deepLink
标签:<fragmentandroid:id="@+id/DetailFragment"><deepLinkandroid:id="@+id/deepLink"app:uri="http://example.com/news/{newsId}" /> </fragment>
NavDeepLinkBuilder
解析 URL,通过NavController.navigate(uri)
匹配导航图中的deepLink
规则:NavDeepLinkBuilder(this).setGraph(R.navigation.navigation_graph).setUri(uri).createTask().addOnSuccessListener(navController -> navController.navigate(deepLinkMatch.getDestination().getId()));
- 核心是
NavDeepLinkMatcher
类,将 URL 路径与导航图中的deepLink
模式匹配,提取参数。
总结
一、ViewModel 核心总结
-
跨 Fragment 数据共享
- 作用域:由
ViewModelStoreOwner
决定,通过 Activity 作为 Owner 可实现跨 Fragment 共享(作用域为 Activity 生命周期),若用 Fragment 自身作为 Owner 则作用域为 Fragment 生命周期。 - 原理:Activity 的
ViewModelStore
在配置变更时通过NonConfigurationInstance
保存,避免 ViewModel 重建。
- 作用域:由
-
生命周期与内存泄漏
onCleared()
在 Owner 永久销毁(非配置变更)时调用,需在此清理异步任务(如取消viewModelScope
协程)、释放资源。- 避坑:避免在 ViewModel 中持有 Activity 强引用,改用
getApplication()
获取上下文。
-
自定义 Factory 与依赖注入
- 实现
ViewModelProvider.Factory
可向 ViewModel 传递参数(如 Repository、数据库实例),是手动依赖注入的基础,配合 Hilt 可实现全自动依赖管理。
- 实现
二、LiveData 核心总结
-
黏性事件与非黏性实现
- 原因:通过版本号
mVersion
机制,新订阅者因初始版本号为-1
,必然触发最新数据回调。 - 非黏性方案:使用
observeForever()
手动管理订阅,或封装SingleLiveEvent
(单次触发)、结合MediatorLiveData
过滤旧数据。
- 原因:通过版本号
-
线程安全与更新机制
setValue()
:主线程即时更新,直接通知观察者。postValue()
:子线程异步更新,通过ArchTaskExecutor
切换到主线程,利用mDataLock
保证线程安全。- 仅当观察者处于 STARTED/RESUMED 活跃状态 时才会收到通知,避免后台更新浪费性能。
-
生命周期感知原理
LifecycleBoundObserver
监听LifecycleOwner
状态,在DESTROYED
时自动移除观察者,通过shouldBeActive()
判断是否接收数据,实现无内存泄漏的动态订阅。
三、Room 核心总结
-
协程支持与线程调度
- 在 DAO 中定义
suspend
函数,Room 编译时生成后台线程代码(默认使用Dispatchers.IO
),避免阻塞主线程。 - 可通过
@Query(workerThread = true)
或自定义CoroutineDispatcher
调整线程池。
- 在 DAO 中定义
-
数据库升级与 Migration
- 通过
@Database(version = X)
指定版本,升级时需提供Migration
类实现逐版本 SQL 迁移逻辑(如添加字段、修改表结构)。 - 最佳实践:避免跨版本升级(如 1→3),复杂场景可使用
fallbackToDestructiveMigration
重置数据库。
- 通过
-
性能优化手段
- 索引:通过
@Index
注解提升查询效率,生成CREATE INDEX
语句。 - 事务:
@Transaction
注解保证批量操作原子性,减少多次 IO 开销。 - 批量操作:使用
insertAll()
、updateAll()
替代单条操作,降低数据库交互次数。
- 索引:通过
四、Navigation 核心总结
-
返回栈与导航配置
NavController
维护BackStack
(栈结构),通过导航图中action
的popUpTo
/popUpToInclusive
清理栈条目:popUpTo
:指定弹出目标 ID,inclusive=true
时包含目标自身,避免冗余页面驻留。
-
参数传递与类型安全
- 支持基本类型和
Parcelable
对象,通过导航图argument
定义参数,编译时通过@NavigationRes
校验目标 ID 合法性。 - 复杂对象需实现
Parcelable
或使用@TypeConverter
(如 Room 实体),确保序列化 / 反序列化安全。
- 支持基本类型和
-
深层链接集成
- 在导航图中配置
deepLink
标签,通过NavDeepLinkBuilder
解析 URL,匹配目的地并提取参数(如http://example.com/news/{newsId}
),提升应用外部访问能力。
- 在导航图中配置
总结对比
组件 | 核心目标 | 关键机制 | 最佳实践 |
---|---|---|---|
ViewModel | 生命周期感知的数据管理 | ViewModelStore/Factory 机制 | 依赖注入、避免持有 Activity 强引用 |
LiveData | 生命周期感知的响应式数据更新 | 版本号校验、LifecycleBoundObserver | 区分 setValue/postValue,处理黏性事件 |
Room | 类型安全的 SQLite ORM | 编译时代码生成、协程支持 | 合理使用 Migration、索引 / 事务优化性能 |
Navigation | 多页面导航与返回栈管理 | 导航图配置、NavController 栈管理 | 清晰定义 popUpTo 规则 |
相关文章:
Android面试总结之jet pack模块化组件篇
一、ViewModel 深入问题 1. ViewModel 如何实现跨 Fragment 共享数据?其作用域是基于 Activity 还是 Fragment? 问题解析: ViewModel 的作用域由 ViewModelStoreOwner 决定。当 Activity 和其内部 Fragment 共享同一个 ViewModelStoreOwner…...
【无需docker】mac本地部署dify
环境安装准备 #安装 postgresql13 brew install postgresql13 #使用zsh的在全局添加postgresql命令集 echo export PATH"/usr/local/opt/postgresql13/bin:$PATH" >> ~/.zshrc # 使得zsh的配置修改生效 source ~/.zshrc # 启动postgresql brew services star…...
清洗数据集
将label在图片上画出来 按照第一行的属性分类 import os import cv2 import multiprocessing as mp from tqdm import tqdm# ---------- 路径配置 ---------- # IMAGE_DIR = r"C:\Users\31919\Desktop\datasets\13k_100drive_raw_with_hand\images\test" LABEL_DIR =…...
支持向量机(SVM)详解
引言 支持向量机(Support Vector Machine, SVM)是一种强大的监督学习算法,主要用于分类和回归任务。其核心思想是找到一个最优的决策边界(超平面),最大化不同类别之间的间隔(Margin)…...
MIT XV6 - 1.2 Lab: Xv6 and Unix utilities - pingpong
接上文 MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - user/_sleep 是什么?做什么? pingpong 不务正业了那么久(然而并没有,虽然还在探索sleep,但是教材我已经看完了前三章了),让我们赶紧继续下去 在进行本实验之前请务…...
“淘宝闪购”提前4天全量,意味着什么?
4月30日推出,首日上线50个城市,既定5月6日推广至全国的“淘宝闪购”,突然在5月2日早上官宣,提前4天面向全国消费者全量开放。 这一系列节奏,剑指一个字“快”! 是业务发展远超预期的“快”。 4月30日&am…...
Servlet 解决了什么问题?
Servlet 主要解决了以下几个核心问题: 性能问题 (Performance): CGI 的问题: 传统的 CGI 技术为每个Web 请求都启动一个新的进程。进程的创建和销毁涉及大量的系统资源开销(内存分配、CPU 时间、进程上下文切换等)。在高并发场景下…...
Cherry Studio的MCP协议集成与应用实践:从本地工具到云端服务的智能交互
Cherry Studio的MCP协议集成与应用实践:从本地工具到云端服务的智能交互 一、MCP协议与Cherry Studio的技术融合 MCP(Model Context Protocol) 是由Anthropic提出的标准化协议,旨在为AI模型提供与外部工具交互的通用接口。通过M…...
CPU:AMD的线程撕裂者(Threadripper)系列
AMD的线程撕裂者(Threadripper)系列是AMD面向高性能计算(HPC)、工作站(Workstation)和高端桌面(HEDT)市场推出的顶级处理器产品线。该系列以极高的核心数、强大的多线程性能、丰富的…...
(即插即用模块-Attention部分) 六十二、(2022) LKA 大核注意力
文章目录 1、Larger Kernel Attention2、代码实现 paper:Visual Attention Network Code:https://github.com/Visual-Attention-Network 1、Larger Kernel Attention 自注意力机制在 NLP 领域取得了巨大成功,但其应用于计算机视觉任务时存在…...
Spring 分批处理 + 冷热数据分离:历史订单高效迁移与数据清理实战
在实际业务中,随着时间推移,订单量持续增长,若未及时进行数据治理,会造成数据库膨胀、查询缓慢、性能下降等问题。为了实现数据分层管理和系统高性能运行,我们在项目中采用了“冷热数据分离 分批迁移 数据清理”的综…...
Mybatis中的一级二级缓存扫盲
思维导图: MyBatis 提供了一级缓存和二级缓存机制,用于提高数据库查询的性能,减少对数据库的访问次数。(本质上是减少IO次数)。 一级缓存 1. 概念 一级缓存也称为会话缓存,它是基于 SqlSession 的缓存。在同…...
Elasticsearch 常用的 API 接口
文档类 API Index API :创建并建立索引,向指定索引添加文档。例如:PUT /twitter/tweet/1 ,添加一个文档。 Get API :获取文档,通过索引、类型和 ID 获取文档。如GET /twitter/tweet/1。 DELETE API &…...
纯前端专业PDF在线浏览器查看器工具
纯前端专业PDF在线浏览器查看器工具 工具简介 我们最新开发的PDF在线浏览器工具现已发布!这是一个基于Web的轻量级PDF阅读器,无需安装任何软件,直接在浏览器中即可查看和操作PDF文档。 主要功能 ✅ PDF文件浏览 支持本地PDF文件上传流畅的…...
传奇各职业/战士/法师/道士手套/手镯/护腕/神秘腰带爆率及出处产出地/圣战/法神/天尊/祈祷/虹魔/魔血
护腕排行(战士): 名字攻击攻击(均)魔法魔法(均)道术道术(均)防御防御(均)魔御魔御(均)重量要求图标外观产出圣战手镯2-32.50-000-000-10.50-002攻击: 400.02%双头金刚(50级/5000血/不死系)|赤月魔穴(1725,2125)60分钟2只 0.02%双头血魔(55级/5000血/不死系)|赤月魔穴(1725,212…...
觅知解析计费系统重构版在线支付卡密充值多解析接口免授权无后门源码扶风二开
一、源码描述 这是一套视频解析计费源码(扶风二开),可配置多接口和专用特征解析接口,对接在线支付和卡密支付,支持在线充值和卡密充值,支持点数收费模式和包月套餐收费模式,可配置多个视频解析…...
C++11新特性_委托构造函数
格式定义 在 C11 里,委托构造函数的格式为:一个构造函数能够在其成员初始化列表里调用同一个类的其他构造函数。基本语法如下: class ClassName { public:// 被委托的构造函数(目标构造函数)ClassName(参数列表1) : …...
网工_IP协议
2025.02.17:小猿网&网工老姜学习笔记 第19节 IP协议 9.1 IP数据包的格式(首部数据部分)9.1.1 IP协议的首部格式(固定部分可变部分) 9.2 IP数据包分片(找题练)9.3 TTL生存时间的应用9.4 常见…...
C++负载均衡远程调用学习之QPS性能测试
目录 1.昨日回顾 2.QPS_TEST_PROTOBUF协议的集成 3.QPS_TEST_SERVER端实现 4.QPS_TEST_QPS简单介绍 5.QPS_TEST_QPS客户端工具编写和性能测试 1.昨日回顾 2.QPS_TEST_PROTOBUF协议的集成 ## 14) Reactor框架QPS性能测试 接下来我们写一个测试用例来测一下我们…...
C++负载均衡远程调用学习之消息队列与线程池
目录 1.昨日回顾 2.单线程的多路IO服务器模型和多线程模型区别 3.服务器的集中并发模式 4.LARSV0.8-task_msg消息队列任务数据类型 5.LARSV0.8--thread_queue消息队列的发送和接收流 6.LARSV0.8-thread_pool线程池的实现 7.LARSV0.8-thread_pool线程池的实现 8.LARSV0.8…...
Kotlin 基础
Kotlin基础语法详解 Kotlin是一种现代静态类型编程语言,由JetBrains开发,与Java完全互操作。以下是Kotlin的基础语法详解: 1. 基本语法 1.1 变量声明 // 不可变变量(推荐) val name: String = "Kotlin" val age = 25 // 类型推断// 可变变量 var count: In…...
实验数据的转换
最近做实验需要把x轴y轴z轴的数据处理一下,总结一下解决的方法: 源文件为两个txt文档,分别为x轴和y轴,如下: 最终需要达到的效果是如下: 就是需要把各个矩阵的数据整理好放在同一个txt文档里。 步骤① …...
多种尝试解决Pycharm无法粘贴外部文本【本人问题已解决】
#作者:允砸儿 #日期:乙巳青蛇年 四月初五 笔者在写demo的时候遇到一个非常棘手的问题就是pycharm无法复制粘贴,笔者相信有很多的朋友遇到过这种问题,笔者结合搜素到的和自己揣摩出来的方法帮助朋友们解决这种问题。 1、第一种…...
【C++】红黑树迭代版
目录 前言: 一:什么是红黑树? 二:插入什么颜色节点? 三:定义树 四:左单旋和右单旋 1.右单旋 2.左单旋 五:调整树 1.当parent节点为黑色时 2.当parent节点为红色时 2.1 u…...
OSPF路由协议配置
初始环境与准备: 物理连接:按照文件的拓扑连接了 3 台路由器 (R01, R02, R03)、2 台交换机 (Switch0, Switch1) 和 2 台 PC (PC0, PC1)。关键发现:路由器之间的连接实际使用的是以太网线(连接到 FastEthernet 接口),而不是串口线。…...
linux下抓包工具--tcpdump介绍
文章目录 1. 前言2. 命令介绍3. 常见选项3.1. 接口与基本控制3.2 输出控制3.3 文件操作3.4 高级调试 4. 过滤表达式4.1 协议类型4.2 方向与地址4.3 逻辑运算符 5. 典型使用场景5.1 网络故障排查5.2 安全分析与入侵检测5.3 性能分析与优化 linux下抓包工具--tcpdump介绍 1. 前言…...
探索 Disruptor:高性能并发框架的奥秘
在当今的软件开发领域,处理高并发场景是一项极具挑战性的任务。传统的并发解决方案,如基于锁的队列,往往在高负载下表现出性能瓶颈。而 Disruptor 作为一个高性能的并发框架,凭借其独特的设计和先进的技术,在处理海量数…...
smss源代码分析之smss!SmpLoadSubSystemsForMuSession函数分析加载csrss.exe
第一部分: Next SmpSubSystemsToLoad.Flink; while ( Next ! &SmpSubSystemsToLoad ) { p CONTAINING_RECORD( Next, SMP_REGISTRY_VALUE, Entry )…...
《AI大模型应知应会100篇》第44篇:大模型API调用最佳实践(附完整代码模板)
第44篇:大模型API调用最佳实践(附完整代码模板) 摘要 当你的应用突然面临每秒1000请求时,如何保证大模型API调用既稳定又经济?本文通过12个实战代码片段、3套生产级架构方案和20优化技巧,带你构建高性能的…...
第5篇:EggJS中间件开发与实战应用
在Web开发中,中间件(Middleware)是处理HTTP请求和响应的核心机制之一。EggJS基于Koa的洋葱模型实现了高效的中间件机制,本文将深入探讨中间件的执行原理、开发实践以及常见问题解决方案。 一、中间件执行机制与洋葱模型 1. 洋葱模…...
数字智慧方案6187丨智慧应急指挥平台体系建设方案(78页PPT)(文末有下载方式)
数字智慧方案6187丨智慧应急指挥平台体系建设方案 详细资料请看本解读文章的最后内容。 引言 随着社会经济的快速发展,应急管理面临着越来越复杂的挑战。智慧应急指挥平台体系的建设,旨在通过先进的信息技术和智能化手段,提升应急管理的效…...
Linux 常用命令 - tar【归档与压缩】
简介 tar 这个名称来源于 “tape archive”,最初设计用于将文件归档到磁带上。现在,tar 命令已经成为 Linux 系统中最常用的归档工具,它可以将多个文件和目录打包成一个单独的归档文件,并且可以选择使用不同的压缩算法进行压缩&a…...
python常用科学计算库及使用示例
一、NumPy - 数值计算基础库 安装 pip install numpy 核心功能示例 1. 数组创建与运算 import numpy as np# 创建数组 arr np.array([1, 2, 3, 4]) matrix np.array([[1, 2], [3, 4]])# 数学运算 print(arr 1) # [2 3 4 5] print(matrix …...
【中间件】brpc_基础_bthread头文件
bthread.h学习笔记 源码 1 概述 bthread.h 定义了一个用户级线程库,提供类似 POSIX 线程(pthread)的功能,但针对高并发和调度优化进行了扩展。支持线程管理、同步原语、中断机制、线程特定数据等功能,适用于需要高效…...
【AI面试准备】Git与CI/CD及单元测试实战指南
介绍Git、CI/CD 流程、单元测试框架(如 NUnit、JUnit)。如何快速掌握,以及在实际工作中如何运用 目录 一、Git:分布式版本控制系统核心概念高频命令实战建议 二、CI/CD:自动化交付流水线核心流程工具链组合关键配置示…...
个人健康中枢的多元化AI软件革新与精准健康路径探析
引言 人工智能技术的迅猛发展正在重塑医疗健康领域的服务模式和用户体验。随着多模态大模型、MCP协议、A2A协议和思考链算法等创新技术的出现,个人健康中枢正在经历一场深刻的软件革新。这些技术不仅打破了传统健康管理系统的信息孤岛,还通过多维度数据整合和深度推理能力,…...
Java文件上传
war包利用 WAR包结构详解-CSDN博客 Tomcat弱口令及war包漏洞复现(保姆级教程)-CSDN博客 Tomcat 8.x弱口令获取manager权限上传任意war包漏洞复现 - Stunmaker - 博客园...
Python项目源码63:病历管理系统1.0(tkinter+sqlite3+matplotlib)
1.病历管理系统包含以下主要功能: 核心功能:病历信息录入(患者姓名、年龄、性别、诊断结果、主治医生),自动记录就诊时间,病历信息展示(使用Treeview表格),病历信息查询…...
Unity 与 Lua 交互详解
Unity 与 Lua 的交互是热更新实现的核心技术,下面我将从底层原理到实际应用全面解析交互机制。 一、交互基础原理 1. 通信架构 Unity (C#) 原生层↑↓ 通过P/Invoke调用 Lua虚拟机层 (C/C实现)↑↓ Lua脚本解释执行 业务逻辑层 (Lua脚本) 2. 数据类型映射表 Lu…...
【Vue】Vue与UI框架(Element Plus、Ant Design Vue、Vant)
个人主页:Guiat 归属专栏:Vue 文章目录 1. Vue UI 框架概述1.1 主流Vue UI框架简介1.2 选择UI框架的考虑因素 2. Element Plus详解2.1 Element Plus基础使用2.1.1 安装与引入2.1.2 基础组件示例 2.2 Element Plus主题定制2.3 Element Plus的优缺点分析 3…...
期刊、出版社、索引数据库
image 1、研究人员向期刊或者会议投稿,交注册费和相应的审稿费等相关费用[1]; 2、会议组织者和期刊联系出版社,交出版费用; 3、出版社将论文更新到自己的数据库中,然后将数据库卖给全世界各大高校或企业; 4…...
btrace2.0使用方法
2022 年我研究安卓性能优化的时候,写过一篇:btrace1.0使用方法 - Wesley’s Blog,现在 brace 进化到 2.0 了,让我们一起来看看如何使用。 具体的接入流程可以看官方文档: bytedance/btrace: 🔥ǵ…...
【计算机视觉】三维视觉:Instant-NGP:实时神经辐射场的革命性突破
深度解析Instant-NGP:实时神经辐射场的革命性突破 技术架构与核心创新哈希编码(Hash Encoding)性能对比 环境配置与安装指南硬件要求全平台安装流程 实战全流程解析1. 数据准备2. 训练与重建3. 结果导出与应用 核心技术深度解析哈希编码实现混…...
组件通信-provide、inject
概述:实现祖孙组件直接通信 具体使用: 在祖先组件中通过provide配置向后代组件提供数据 在后代组件中通过inject配置来声明接收数据 具体编码: 【第一步】父组件中,使用provide提供数据 父组件: <template&g…...
定制开发开源AI智能名片S2B2C商城小程序驱动的无界零售基础设施变革研究——基于京东模式的技术解构与商业重构
摘要:本文以京东无界零售战略为参照,探讨定制开发开源AI智能名片S2B2C商城小程序如何通过“技术赋能生态重构”双轮驱动,重塑零售基础设施的可塑化、智能化与协同化。研究显示,该模式通过“AI名片智能中枢S2B2C分布式网络开源技术…...
基于STM32的带恒温系统智能外卖柜设计
标题:基于STM32的带恒温系统智能外卖柜设计 内容:1.摘要 随着外卖行业的迅速发展,对外卖存放设备的智能化和功能性要求日益提高。本设计的目的是开发一种基于STM32的带恒温系统智能外卖柜。方法上,以STM32微控制器为核心,结合温度传感器、加…...
ARM架构详解:定义、应用及特点
一、ARM架构的定义 ARM(Advanced RISC Machine) 是一种基于精简指令集(RISC)的处理器架构,由ARM公司(现属英伟达)设计,以低功耗、高能效为核心目标。其商业模式为IP授权,…...
Spring Boot 集成 Elasticsearch 的详细步骤
以下是 Spring Boot 集成 Elasticsearch 的详细步骤: 环境安装 安装 Java :Elasticsearch 基于 Java,需先安装 JDK 11 或更高版本。从官 方网站下载安装包,按教程安装配置,安装后通过命令行输入java -version验证。 …...
提示词版本化管理:AI开发中被忽视的关键环节
当我的提示词"消失"在团队协作中 上周五下午,我经历了一场小型"灾难"。作为一名AI产品经理,我花了整整三天精心打磨的客服机器人提示词,在周末更新后突然"失效"了。机器人不再能够准确识别用户意图࿰…...
专题二十二:DHCP协议
一、DHCP简介 HCP是Dynamic Host Configuration Protocol的缩写,即动态主机配置协议。DHCP是一个很重要的局域网的网络协议,DHCP使用UDP封装的67和68端口,DHCP客户端使用68端口,DHCP服务器使用67端口进行回应。 DHCP可以提供两种…...