自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(224)
  • 收藏
  • 关注

原创 对AI Coding理解

对AI Coding的理解:不仅仅是代码补全:“这与传统的IDE代码补全有本质区别。传统补全是‘被动’的,而这是‘主动’的智能体(Agent)行为。它具备了规划、使用工具、执行任务的能力,这才是AI Coding的革命性所在。安全是首要考虑:“可以想象,允许AI在本地执行任意命令是极其危险的。因此,所有这类工具都必须有一个非常严格的安全沙箱(Sandbox)和权限控制模型。例如,可能默认在一个临时目录中操作,或者需要用户明确授权才能执行某些高危命令(如rm -rf工具调用(Tool Use)是关键。

2025-09-04 15:49:38 924

原创 理解同步、异步、阻塞、非阻塞

Q:“讲讲同步、异步、阻塞、非阻塞的区别,以及它们的组合。“这些概念可以从两个维度来理解:第一是消息通知机制同步:调用者需要主动等待或主动轮询结果。异步:调用者发起调用后,被动等待被调用方通知(如回调函数)。第二是调用者等待时的状态阻塞:调用结果返回前,调用者线程被操作系统挂起,无法执行其他操作。非阻塞:调用结果返回前,调用者线程可以继续执行其他操作。同步阻塞:最简单也最低效。线程发起调用后就被挂起,空等结果。同步非阻塞:线程不断轮询检查状态,CPU空转严重,效率不高。异步阻塞。

2025-09-01 14:25:40 914

原创 Android中handler机制

核心目的:解决多线程并发和线程切换的问题。在 Android 中,主线程(UI 线程)负责处理用户交互和UI更新,绝对不允许在主线程中进行耗时操作(如网络请求、数据库读写),否则会引发 ANR。同时,Android 的 UI 工具包不是线程安全的,不允许在子线程中直接更新 UI。在子线程中执行耗时任务,然后将结果发送回主线程进行UI更新。Handler 就是这个机制的基石。Handler 机制的四大组件:Message: 需要传递的消息,可以携带数据和标识。: 一个按时间排序的优先级队列。

2025-08-30 17:45:11 863

原创 为什么不能创建泛型数组?

Q:“为什么Java不允许创建泛型数组?“根本原因在于Java泛型的类型擦除机制和数组的运行时类型检查机制之间存在无法调和的冲突。数组是‘具体化’的,它在运行时知道自己的元素类型,并且会强制执行类型约束(比如抛出而泛型经过擦除后,在运行时类型信息就丢失了,类型安全只由编译器在编译期通过插入强制转换来保证。如果允许创建泛型数组,就会造成一个类型安全的‘漏洞’。我们可以利用数组的协变性,将一个存入一个声明为的数组中。由于擦除,JVM在运行时无法发现这个错误。

2025-08-29 14:23:23 813

原创 Java中协变逆变的实现与Kotlin中的区别

特性JavaKotlin核心机制使用处变型 (Use-site)声明处变型 (Declaration-site)为主,使用处变型(类型投影)为辅语法关键字?extends T(协变),?super T(逆变)out T(协变),in T(逆变)决策者API的调用者/使用者API的设计者(声明处),或调用者(使用处投影)代码风格PECS原则,通配符大量出现在方法签名中更简洁、更直观。泛型类自身声明其变型性质,使用时常无需额外修饰能否赋值给不能。必须写为List<?可以,但前提是Kotlin的。

2025-08-29 14:09:10 1250

原创 Java泛型使用常见报错

Q:“谈谈Java泛型中使用不当会导致的问题和泛型的继承关系。“使用泛型最容易出错的地方是对泛型容器继承关系的误解。核心规则是泛型具有不变性和没有继承关系,即使SubClass继承自SuperClass。试图将它们相互赋值是主要的编译错误来源。之所以这样设计,是为了保证绝对的编译期类型安全。如果允许这种赋值,就可以把SuperClass对象放入一个声明为只装SubClass的容器中,从而在后续读取时引发运行时。extends T>实现了协变,让我们能安全地读取元素,将容器视为元素的生产者。

2025-08-29 11:02:30 962

原创 Java中对泛型的理解

Q:“详细讲讲Java的泛型。“Java泛型的核心目的是提供编译时类型安全和消除强制类型转换。它的实现机制是类型擦除,即在编译后泛型信息会被移除,类型参数会被替换为它的边界或Object,并由编译器自动插入强制转换。类型擦除带来了一些限制,比如不能使用基本类型、不能进行泛型的instanceof检查、不能创建泛型数组等。为了解决擦除与多态的冲突,编译器会生成桥接方法,它在子类重写泛型方法时,负责进行类型检查和安全转型,从而保证多态性。泛型具有不变性不是的子类。为了更灵活的API设计,引入了通配符?和。

2025-08-29 10:47:01 1080

原创 Java中StringBuilder原理以及使用

Q:“请你讲讲StringBuilder的底层原理和扩容机制。的底层是一个可变的字符数组和一个记录已用字符数的计数器int count。它的可变性就来自于直接修改这个数组,而不是像String那样创建新对象。它的高效性主要体现在扩容机制上。当现有数组容量不足时,它会创建一个新的更大数组。新容量的计算规则是取(旧容量 * 2 + 2)和实际所需最小容量中的较大值。这种‘加倍’的启发式算法旨在以空间换时间,将多次追加操作的平均时间复杂度摊销到接近O(1)。最后通过进行数据拷贝,这是扩容的主要开销。

2025-08-27 20:11:12 819

原创 Android中APK包含哪些内容?

Q:“一个Android APK文件里面主要包含哪些内容?APK本质上是一个ZIP压缩包,它包含了Android应用安装和运行所需的所有文件。:这是应用的总配置文件,声明了包名、组件、权限等信息,但它被编译成了二进制格式。:这是Android系统的可执行字节码文件,由Java/Kotlin源码编译后转换而成,是应用的代码核心。如果方法数超限,还会有。:这是编译后的资源索引表,它是一个二进制文件,建立了资源ID到资源路径的映射关系,用于系统高效地加载适合当前设备配置的资源。res/目录:存放编译后的资源文件。

2025-08-27 19:31:20 866

原创 Android中AAR、JAR文件

Q:“谈谈对 Android 中 JAR 和 AAR 的理解,它们有什么区别?“JAR 和 AAR 都是 Android 开发中常用的依赖包格式,但它们的定位和用途有本质区别。JAR是Java 平台的标准打包格式,它里面主要包含编译后的.class文件和一些 Java 资源。它在 Android 中主要用于引入纯 Java 的工具库或算法库,比如 Gson、OkHttp 的核心逻辑库。因为它不包含任何 Android 相关的资源或清单文件。AAR是Android 特有的库项目打包格式。

2025-08-27 19:25:35 939

原创 Android中点击链接跳转到对应App页面的底层原理

Q:“说一下在Android里,点击一个链接跳转到对应App页面的底层原理。“这个功能的底层原理是基于Android的隐式Intent和机制。首先,App如果想要被链接唤醒,必须在它的中为目标Activity注册一个。这个过滤器里会定义动作、BROWSABLE和DEFAULT类别,并通过<data>标签声明它能处理的链接格式,包括scheme(如https)、host(域名)和path(路径)。当用户点击一个链接时,系统会创建一个包含此链接的隐式Intent。然后,系统的核心服务。

2025-08-27 19:10:33 1055

原创 ASM字节码框架和KSP能够解析JAR包或者AAR包里面的内容吗?

特性ASMKSP处理层面字节码.class文件)源码符号(AST, 符号表)处理阶段编译后期 (Class文件已生成)编译前期 (源码刚被解析)核心能力读取、修改、生成字节码读取符号信息,生成源码对 JAR可直接处理其中的.class文件可读取其声明的公共符号和注解对 AAR需先解压,再处理内部的可读取其声明的公共符号和注解典型应用代码插桩、埋点、热修复、性能监控代码生成(如BOF、路由、序列化)、元编程。

2025-08-27 16:41:58 840

原创 设计模式理解

官方定义:设计模式(Design Pattern)是一套被反复使用、多数人知晓、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中一些不断重复发生的问题,以及该问题的解决方案的核心。

2025-08-27 16:02:47 736

原创 内外存排序

特性内存排序 (Internal Sort)外存排序 (External Sort)数据位置全部在内存(RAM)中主要在外存(硬盘)中,分批读入内存数据量受限于内存容量海量,远超内存容量速度非常快(纳秒级访问)相对慢(瓶颈在于毫秒级的磁盘I/O)主要开销CPU计算(比较和交换操作)磁盘I/O(读写次数)常用算法快速排序、归并排序、堆排序基于归并排序的分段排序和K路归并应用场景编程语言内置排序、小规模数据数据库排序、大数据处理、大型日志分析。

2025-08-26 14:28:42 1024

原创 Android Handler 线程执行机制

Handler 中的代码在哪个线程执行?主线程执行使用创建通过发送的任务在主线程创建的默认 Handler子线程执行绑定子线程 Looper 的 Handler(如 HandlerThread)在子线程创建并初始化了 Looper 的 Handler执行机制所有发送到 Handler 的消息/任务,都会被放入关联的 MessageQueueLooper 在绑定线程中不断循环取出消息最终在 Looper 所在线程执行。

2025-08-18 14:10:18 613

原创 Android 中 StateFlow 与 LiveData 对比详解

Q:StateFlow 和 LiveData 有什么区别?如何选择?

2025-08-13 12:54:05 873

原创 Kotlin 协程启动方式

Q:请解释Kotlin协程的启动方式及其区别?A1.launch- 任务执行器返回Job对象,用于控制协程生命周期不返回结果,适用于'发后即忘'场景示例:后台日志上传、定时清理任务2.async- 结果获取器返回(继承Job),通过await()获取结果支持并行任务组合,如并发网络请求示例:同时获取用户资料和好友列表3.- 阻塞桥接器阻塞当前线程直到协程完成主要用于测试、main函数和桥接阻塞代码禁止在Android主线程使用(会导致ANR)关键区别维度launchasync返回值无有。

2025-08-13 11:22:55 684

原创 Kotlin 枚举类

Q:请解释Kotlin枚举类及其适用场景?A“Kotlin枚举类(enum class)是定义固定值集合1. 类型安全常量管理替代魔法数字/字符串,如HTTP状态码、错误类型2. 有限选项建模表示预定义选项集合,如方向、颜色、配置3. 行为差异化实现通过抽象方法为每个常量提供不同行为示例策略模式:关键优势编译时安全:杜绝无效值自描述性:通过名称直接表达含义功能扩展:支持属性、方法和接口实现对比密封类特性枚举类密封类实例类型同质异构实例数量固定单例可多实例状态携带常量级属性。

2025-08-13 11:09:49 483

原创 kotlin中密封类介绍

Q:解释Kotlin密封类及其应用场景?A“Kotlin密封类()是受限的类层次结构1. 类型安全的状态管理编译器知晓所有子类,确保when表达式全覆盖示例:UI状态(Loading/Success/Error)2. 类型安全的API响应封装网络响应:Success(data)/Error(code)避免null和异常传递3. 领域模型表达精确建模业务概念(如支付方式、文件类型)支持携带数据的异构类型关键优势编译时安全:消除未处理分支风险模式匹配优化:智能转换(is检测)扩展性:子类可携带独立状态。

2025-08-13 11:00:16 331

原创 Android中Activity销毁底层原理

Q:请说明Activity从finish()到完全销毁的底层过程?A1. 发起阶段(用户进程)调用finish()后:保存数据通过Binder IPC调用AMS的2. 调度阶段(AMS)AMS收到请求后:标记ActivityRecord为FINISHING状态启动暂停流程:通过Binder回调等待onPause()完成(设置10秒超时)启动下一Activity并传递结果数据3. 销毁阶段(延迟执行)当主线程空闲时:AMS发送和顺序执行onStop()→释放Surface:通过。

2025-08-11 21:24:53 1062

原创 Android16新特性速记

RecyclerView从1.4版本开始已经接入了动态刷新率功能,这也就意味着,使用1.4版本的RecyclerView在支持动态刷新率的手机上将会拥有更好的性能和更低的能耗。传统4KB页是x86/ARM的历史标准,但16KB页能减少TLB未命中率,提升App启动速度。:操作系统将内存划分为固定大小的"页"(如4KB/16KB),通过页表管理虚拟页与物理页映射。:16KB页减少TLB未命中率(相同内存范围需更少页表项),提升内存访问效率。:CPU缓存页表的小型高速缓存,TLB未命中时需访问内存,降低性能。

2025-08-11 20:53:17 1366

原创 Android Intent 解析

核心概念:消息传递、组件激活、跨应用通信关键区别:显式Intent(精准)vs 隐式Intent(灵活)安全实践:导出控制、URI权限、PendingIntent不可变性性能要点:避免大数据传递、预查询匹配组件最新特性:Android 12导出限制、深链接验证。

2025-08-10 14:47:44 655

原创 Android 四大布局:使用方式与性能优化原理

布局最佳使用场景性能风险点简单列表/表单嵌套超过3层时性能骤降碎片容器/悬浮按钮多子视图定位困难中等复杂度相对定位子视图超过10个时测量缓慢所有复杂界面超简单布局略显繁琐。

2025-08-10 14:18:29 1164

原创 RecyclerView 中 ViewHolder

/ 持有的列表项视图// 当前数据位置// 视图类型// ...视图容器:持有 item 布局的所有视图引用数据载体:连接数据和视图的桥梁复用单元:作为 RecyclerView 缓存机制的基本单位。

2025-08-10 00:08:08 378

原创 RecyclerView 缓存机制

开发者扩展层作用:允许开发者实现自定义缓存逻辑使用场景缓存特定位置的视图(如固定头部)预加载复杂视图注意:官方建议谨慎使用,大多数场景无需实现合理设置缓存大小小列表(<50项):默认值足够中大型列表:增大 itemViewCacheSize(5-15)超长列表:增大 RecycledViewPool(10-20)优化ViewHolder避免复杂布局嵌套使用 ConstraintLayout 减少层级耗时操作放在释放。

2025-08-09 23:43:01 346

原创 Android中RecyclerView基本使用

ViewHolder模式:必须使用避免重复findViewById局部更新:优先使用DiffUtil/ListAdapter资源释放:在onViewRecycled()中释放图片等资源事件委托:通过接口回调代替在Adapter中处理逻辑类型区分:多类型视图使用getItemViewType()内存监控:使用Profiler检测滚动时的内存波动。

2025-08-09 21:03:41 333

原创 Java 字符流与字节流详解

字节流是数据处理的基石,字符流是文本处理的优化抽象。理解它们的差异和转换机制,能帮助开发者根据场景选择正确工具,避免编码错误和性能问题。

2025-08-09 15:58:48 876

原创 Java Callback 实现线程切换以及与Kotlin原理关系

定义线程切换后需要执行的操作包含成功、失败、进度更新三种回调类型。

2025-08-09 14:45:16 368

原创 Kotlin 协程线程切换机制详解

Kotlin 协程是如何实现线程切换的?调度器 (Dispatcher)协程使用(如 Main、IO、Default)指定代码块执行线程。调度器底层维护线程池,如 IO 调度器使用 64 线程池。挂起/恢复机制当遇到等挂起点时:保存当前执行状态到对象释放当前线程资源目标调度器从线程池获取新线程执行代码执行完成后恢复并切回原线程编译器转换Kotlin 编译器通过 CPS(Continuation Passing Style)转换:将挂起函数转换为状态机每个挂起点对应状态机状态使用。

2025-08-09 14:39:16 561

原创 Android视图状态以及重绘

请解释Android视图状态变更如何触发界面更新?不重新测量/布局 → 适用于内容变化但尺寸不变场景。合并状态变更(避免连续多次invalidate)消息被标记为异步类型,优先于普通消息处理。保证16ms内完成绘制(60Hz刷新率)向父视图递归 → 可能引发全局重新布局。在消息队列插入屏障,阻塞后续同步消息。匹配新状态对应的Drawable资源。(measure/layout跳过)解决UI更新被业务消息阻塞的问题。仅允许异步的UI更新消息通过。执行完整的视图树遍历。渲染新状态对应的图片。

2025-08-07 23:59:18 1055

原创 Android渲染/合成底层原理详解

显示阶段:所有的buffer在此阶段的使用者都是hwc,因为hwc控制着显示芯片从生命周期可以看出GraphicBuffer对象在流转的过程中,会被GPU、CPU、DPU三个不同的硬件访问,如果同一块内存能够被多个硬件设备访问,就需要一个同步机制。合成阶段:GPU渲染完成后将图层传递给sf进程,sf进程决定由谁来合成,hwc或者GPU如果使用GPU合成,那么此时buffer的使用者依旧是GPU,如果使用hwc合成,那么此时buffer的使用者是hwc。

2025-08-07 22:32:50 1341

原创 HashMap初始化容量为10,还未添加数据时,它的实际容量是多少?

阶段实际容量说明初始化后(未添加数据)0底层数组尚未创建(首次添加数据后16底层数组初始化为大于10的最小2次幂因此,虽然指定了初始容量为10,但HashMap的实际容量在首次添加数据时会被调整为16。这一设计既满足了容量必须为2的幂的要求,又通过懒加载优化了内存使用。

2025-08-07 20:21:38 326

原创 Java中为什么要求HashMap 要求容量为 2 的整数次幂?

优化方向传统方案2^n 容量优化方案优势哈希计算hash % n(取模)(位与)速度提升 10-20 倍扩容元素迁移遍历所有元素重新计算位置按高位比特分流到两个新桶时间复杂度从 O(n²) 降为 O(n)冲突率依赖哈希函数质量低位掩码强制利用所有哈希位分布更均匀结论:2 的幂容量设计将取模运算转化为位运算,并利用高位比特分流机制,实现了接近最优的哈希计算和扩容性能。

2025-08-07 20:20:12 470

原创 Android中视图测量、布局、绘制过程

Q:简述自定义View的三大流程及核心方法?A:Measure(测量)目标:确定View的宽高核心机制:父容器通过传递约束条件,子View调用保存结果Layout(布局)目标:确定View的位置(四个顶点坐标)核心机制:父容器遍历子View并调用其layout(),子View通过setFrame()保存坐标Draw(绘制)目标:将View绘制到屏幕执行顺序:背景 → 自身内容 → 子View → 前景硬件加速:通过录制指令,由RenderThread异步执行。

2025-08-07 16:17:42 834

原创 Java中GC 链结构

特征树结构GC 链实际结构(图)示例根节点数量单一根节点多个根节点(GC Roots)多个线程栈+静态变量同时存在节点关系严格父子关系(无环)任意引用关系(可成环)对象 A → B → C → A(循环引用)引用方向单向(根→叶)任意方向(但GC只跟踪根→对象路径)对象反向引用其创建者连接性连通无孤立可存在孤立子图垃圾对象形成的引用环。

2025-08-06 14:07:45 351

原创 Android中Binder缓冲区为什么限制1MB,此外Bundle数据为什么要存储在Binder缓冲区中

Bundle 是 Android 组件间(如 Activity/Service)传递数据的通用容器。1MB 是经验值平衡点:满足多数 IPC 需求 + 避免内核风险。1MB 在当时已占内核内存的显著比例(约 0.2%~0.8%)早期 Android 设备内存仅 128MB-512MB。权限检查:Binder 驱动可验证 IPC 权限。(Binder 默认使用一次拷贝)数据隔离:进程无法直接访问对方内存。发起拒绝服务攻击(DoS)(发送/接收方可能被挂起)系统级内存不足(OOM)内核崩溃(影响所有进程)

2025-08-06 13:51:48 326

原创 计算机中有符号正整数最大值绝对值为什么比有符号负整数最大值绝对值少一?

正数上限2ⁿ⁻¹ - 1:符号位占 1 位,剩余位表示数值负数下限-2ⁿ⁻¹:补偿了零的唯一表示,并充分利用所有位组合不对称性本质:补码设计用100...0表示最小负数,而非负零。

2025-08-06 11:24:20 392

原创 Java中双亲委派机制优点

好处实现原理实际影响安全性保障优先由 Bootstrap 加载核心类防止恶意代码替换 JDK 类(如 String)避免类重复加载父加载器缓存已加载类节约内存,保证类唯一性保证类一致性类与依赖由同一加载器加载防止不同版本类冲突(如 commons-lib)职责分离不同加载器负责特定路径清晰类来源(核心库 > 扩展库 > 应用)灵活扩展自定义加载器可重写但不破坏委派实现热部署、模块化等高级特性。

2025-08-06 10:31:58 245

原创 Java中基本类型与其包装类区别(以int,Integer为例)

特性intInteger类型基本数据类型包装类(对象)内存占用4字节对象头 + 引用 + 4字节默认值0null存储位置栈堆(引用在栈)集合支持不支持支持(如null值不可用可用比较方式==比值equals()比值,==比引用方法功能无提供工具方法(如parseInt()自动装箱/拆箱不涉及支持(Java 5+)

2025-08-06 10:02:27 326

原创 Java中注解理解

Target(ElementType.METHOD) // 作用在方法上@Retention(RetentionPolicy.RUNTIME) // 运行时有效// 注解属性(带默认值)

2025-08-05 15:21:28 632

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除