- 博客(41)
- 收藏
- 关注
原创 【Kotlin】Kotlin 基础语法:变量、控制和函数
本文介绍了Kotlin语言的核心特性:变量声明使用val/var,支持类型推断和延迟初始化;基本类型转换需显式处理;循环语句采用for-in形式,支持区间和步长设置;if/when语句可作为表达式;数组分为Array和IntArray两种类型;函数支持顶层定义和扩展功能,可通过扩展函数增强类功能;还介绍了可变参数处理、中缀调用等特殊语法。这些特性使Kotlin在保持与Java兼容的同时,提供了更简洁、安全的编程方式。
2025-12-21 13:50:38
540
原创 【Android】快速上手 Android 组件化开发
本文介绍了中型直播APP采用组件化开发的方案,重点解决业务解耦、模块通信和独立调试三大问题。通过分层划分为主层、业务模块层和基础库层,使用ARouter实现路由通信,避免模块间直接依赖。同时通过壳工程配置,使library模块可独立编译运行调试。具体实现包括:1)模块划分与依赖管理;2)ARouter的路由配置与通信机制;3)gradle配置实现debug/release模式切换。这种组件化方案能有效提升编译速度,保持项目结构清晰,适用于业务复杂的中型项目开发。
2025-11-22 19:25:12
1149
原创 【Android】事件总线 EventBus
在Android开发中如何优化Fragment内嵌套RecyclerView的点击跳转逻辑?最初采用两层回调机制存在性能问题和返回时列表重置的缺陷。解决方案推荐使用EventBus事件总线模式,详细介绍了EventBus的四种线程模式(POSTING、MAIN、BACKGROUND、ASYNC)及其使用方法,并通过代码示例展示了如何简化原有的复杂回调结构。文章还分析了EventBus核心源码实现,重点讲解了单例模式的双重检查锁机制。这种方案有效解决了组件间通信问题,同时避免了不必要的性能开销。
2025-11-18 20:32:35
401
原创 【Android】LRU 与 Android 缓存策略
本文详细介绍了LRU缓存机制及其实现方式。LRU通过双向链表和哈希表组合实现,保证常数时间操作。同时分析了Android中的LruCache实现,包括容量控制、命中统计和淘汰策略,以及其线程安全的同步机制。最后介绍了DiskLruCache磁盘缓存的使用方法,包括初始化参数和写入流程。这三种缓存方式分别适用于内存和磁盘场景,构成了完整的缓存解决方案。
2025-11-16 22:36:33
553
原创 【Android】模板化解决复杂场景的滑动冲突问题
本文分析了Android中处理复杂滑动冲突的两种场景:横纵横嵌套布局和横横纵嵌套布局。通过深入分析MotionEvent事件传递机制,提出基于requestDisallowInterceptTouchEvent的解决方案。重点介绍了在InnerRecyclerView中通过判断滑动方向和内容可滚动性来决定是否允许父容器拦截事件的核心方法,并说明了如何通过View树的遍历找到目标ViewPager2父容器。该方案有效解决了不同层级滑动控件间的冲突问题,确保各个控件能正确接管对应方向的滑动事件。
2025-11-16 15:58:10
952
原创 【Android】View 的工作原理
ViewRootImpl是连接WindowManager与DecorView的桥梁,负责View的measure、layout和draw三大流程。DecorView包含标题栏和内容栏,通过setContentView加载的布局会被添加到内容栏中。MeasureSpec决定View的尺寸规格,包含三种测量模式:UNSPECIFIED(未指定)、EXACTLY(精确值)和AT_MOST(最大值)。DecorView的MeasureSpec由窗口尺寸和自身LayoutParams确定,普通View则由父容器和自身
2025-11-16 14:14:53
724
原创 【Android】消息机制
Android采用Handler、Looper和MessageQueue组成的消息机制处理UI线程和子线程通信。核心要点包括: 主线程限制:UI线程不能执行耗时操作,子线程不能直接更新UI,需通过Handler机制通信 组件关系: 1线程对应1个Looper和1个MessageQueue 1个Looper可注册多个Handler Handler是消息的生产者和消费者入口 实现原理: ThreadLocal保证线程数据隔离 MessageQueue采用单链表结构管理消息 Handl
2025-11-02 16:16:57
964
原创 【Android】View 事件分发机制与源码解析
文章主要介绍了Android View的基础知识和工作原理。首先阐述了View的位置参数体系,包括坐标系、偏移量计算和获取绝对坐标的方法。其次详细讲解了MotionEvent触摸事件和TouchSlop最小滑动距离的概念。随后介绍了VelocityTracker速度追踪和GestureDetector手势检测的使用方法。最后重点分析了View的事件分发机制,包括三个关键方法dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent的协作流程,以及事
2025-10-26 18:24:22
449
原创 【Android】浅析 Android 的 IPC 跨进程通信机制
Android进程间通信(IPC)机制 核心点: 多进程实现方式:通过android:process属性声明,含:前缀表示包名前插 多进程问题:静态变量失效、线程同步失效、SharedPreferences可靠性下降、Application重建 序列化方案: Serializable:简单但性能低,需处理serialVersionUID Parcelable:Android专用,性能高,但实现复杂 Binder机制: 核心组件:客户端、服务端、ServiceManager、BinderDriver AIDL
2025-10-19 23:05:20
1036
原创 【Android】Activity 的生命周期和启动模式
Android Activity生命周期与启动模式解析 本文总结了Activity生命周期和启动模式的关键知识点: 生命周期 正常流程:onCreate->onStart->onResume(可见可交互),onPause->onStop(不可见) 异常恢复:系统通过onSaveInstanceState保存数据,在onRestoreInstanceState恢复 配置变更:可通过android:configChanges阻止重建 四种启动模式 standard:默认模式,每次新建实例 si
2025-10-12 18:45:50
1039
原创 【架构】面向对象六大设计原则
面向对象六大设计原则是构建可维护、可扩展软件系统的关键指南。这些原则包括:单一职责原则(SRP)强调一个类只做一件事;开闭原则(OCP)提倡通过扩展而非修改来新增功能;里氏替换原则(LSP)确保子类能安全替换父类;依赖倒置原则(DIP)主张高层模块应依赖抽象;接口隔离原则(ISP)建议拆分臃肿接口为专注的小接口;迪米特法则(LoD)限制对象间的直接交互。遵循这些原则能有效降低代码耦合度,提高复用性和可维护性,是构建高质量软件架构的基础。每个原则都通过具体代码示例展示了违反和改进的方案,帮助开发者理解如何在实
2025-09-21 16:57:52
956
1
原创 【Android】从复用到重绘的控件定制化方式
Android自定义View主要分为三类:组合控件、继承控件和重绘控件。组合控件通过组合系统控件实现快速复用;继承控件通过扩展系统控件类实现功能定制;重绘控件则完全自定义绘制,灵活性最高。文章详细介绍了组合控件的实现方式,包括XML布局定义、自定义属性设置及属性解析方法,并简要说明了继承控件的基本原理和关键回调方法。
2025-09-03 17:11:33
1214
原创 【Android】ChatRoom App 项目技术分析
Android网络与UI开发指南: 网络部分 OkHttp用于高效处理RESTful请求,支持JSON数据的上传和下载 WebSocket实现实时通信,通过WebSocketListener处理连接状态和消息收发 UI部分 RecyclerView实现高效列表展示,包括: 基础用法:ViewHolder模式、数据绑定 多类型视图支持(通过getItemViewType) DiffUtil优化列表更新,局部刷新提升性能 关键点:提供了完整的代码示例,涵盖网络请求、实时通信和列表优化的核心实现方案。
2025-08-13 17:37:49
789
原创 【Java】网络编程基础与聊天室架构分析
本文介绍了计算机网络中的基本概念和通信协议。主要内容包括:IP地址和端口号的作用与规范,TCP和UDP协议的特性差异 : TCP可靠但开销大,UDP快速但不可靠,TCP连接的三次握手四次挥手流程,以及Java实现TCP/UDP通信的代码示例。最后对比了C/S和P2P两种网络架构的特点:C/S模式通过服务器中转消息,实现简单但存在单点故障;P2P模式节点间直接通信,扩展性好但实现较复杂。全文涵盖了网络通信的基础知识和技术实现要点。
2025-06-15 17:29:45
763
原创 【算法】Dijkstra 算法解决单源最短路问题
本文介绍了图论中的最短路算法基础,包括边权、稠密图与稀疏图概念,以及邻接矩阵和邻接表的存储方式。重点对比了BFS和Dijkstra算法:BFS适用于无权图,通过队列实现;Dijkstra适用于边权非负的带权图,使用优先队列贪心地选择最小花费路径。通过1091题示例展示了两种算法的实现差异,并分析了Dijkstra通过维护cost数组避免成环的核心机制。最后总结了两种算法在适用场景、数据结构和距离定义上的关键区别。
2025-06-08 18:05:59
713
1
原创 【Java】字符串的存储机制
字符串创建可通过String构造方法或字面量实现,前者在堆中创建对象,后者共享常量池。intern()方法将字符串加入常量池,Java7后优化为直接引用。字符串不可变性保障线程安全、哈希一致性和性能优化。拼接操作中,纯字面量会编译优化,含变量则转为StringBuilder,但频繁拼接仍存在O(n²)复杂度问题。StringBuilder因动态扩容机制,构建字符串具有线性时间复杂度优势。
2025-06-02 15:46:54
761
原创 【Java】泛型障眼法
Java泛型是编译期检查的伪泛型,通过类型擦除在运行时转为原始类型。通配符<?>、<? extends T>和<? super T>分别用于不确定类型、上界和下界限制,遵循PECS原则(生产者Extends,消费者Super)。类型擦除导致运行时泛型信息丢失,静态字段不能使用泛型,且无法用instanceof检查泛型类型。编译期进行类型安全检查,确保类型匹配和转换正确。泛型机制依赖继承链的向上转型实现类型兼容。
2025-05-21 21:58:37
905
原创 【Java】看得见的继承
extends关键字实现单继承,子类继承父类的public/protected成员。super关键字用于访问父类构造方法、字段和方法,强调构造方法调用必须首行执行。转型机制中,向上转型调用父类字段和子类方法,向下转型需谨慎处理未初始化字段问题。静态/动态绑定原理基于类元数据中的虚函数表和字段表。接口(interface)定义方法签名,支持多实现,成员字段均为静态常量。接口默认方法冲突时需重写解决。抽象类允许包含具体实现,但同样不能实例化。继承体系下实例化遵循父类优先原则。
2025-05-20 21:26:54
905
原创 【Java】封装与结构体系解析
Java包管理涉及package声明和import导入,IDEA项目结构包括src源码和out编译目录。资源文件路径分为工作目录和类路径,注意相对路径基准点。访问控制修饰符(public/protected/默认/private)实现封装,跨包子类protected访问受限。JavaBean规范要求无参构造、私有属性、标准getter/setter和可序列化。Getter/Setter方法提供字段访问控制,便于添加校验和日志。默认方法与钩子方法的区别在于前者是接口默认实现,后者是父类预留的扩展点
2025-05-20 21:24:31
860
原创 【Java】基于监视器的等待唤醒机制
等待唤醒机制是一种线程同步方法,允许线程在特定条件下进入等待状态,直到其他线程发出信号唤醒它。Java中常用的实现方式包括synchronized结合wait/notify/notifyAll、ReentrantLock结合await/signal/signalAll以及LockSupport的park/unpark方法。在生产者和消费者模型中,生产者和消费者通过缓冲区进行数据交换,并通过锁定机制确保线程有序执行。生产者检查缓冲区是否已满,若满则等待消费者唤醒;消费者检查缓冲区是否为空,若空则等待生产者唤醒
2025-05-18 14:07:39
970
原创 【Java】多线程基础解析
本文介绍了Java中线程的实例化方法、状态、属性及相关概念。线程实例化可以通过继承Thread类、实现Runnable接口或Callable接口来实现,其中Callable接口允许线程任务返回结果。线程状态包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,分别表示线程的不同生命周期阶段。线程属性涉及中断机制、守护线程、线程名和未捕获异常处理器。中断机制通过设置中断标志位实现线程间通信,守护线程在非守护线程结束时自动终止,线程名用于标识线程,未捕获
2025-05-11 13:23:51
886
原创 【算法】哈希表与前缀和问题特征和模板化思路
本文介绍了模运算性质及其在算法中的应用。首先阐述了加减乘模运算的规则和证明方法,特别说明了负数取模的处理方式。其次重点讲解了哈希表与前缀和结合解决子数组问题的模式:通过推导条件公式,分离索引变量,利用哈希表存储和查询中间结果,并以LeetCode题目为例展示了具体应用场景和处理技巧,包括预处理数组、维护不同变量等实用方法。
2025-05-05 15:24:32
973
原创 【数据结构】从完全二叉树到堆再到优先队列
本文介绍了完全二叉树(CBT)及其特点,包括节点分布规律和层序遍历方法。完全二叉树可以用数组紧凑表示,父子节点索引存在明确数学关系。堆是一种特殊的完全二叉树,分为大顶堆和小顶堆,通过堆化操作(上浮/下沉)维护堆性质。堆排序利用堆特性实现高效排序,时间复杂度为O(n log n)。优先队列基于堆实现,支持自定义优先级规则,可通过Comparable接口或Comparator比较器定义元素顺序。这些数据结构在算法和数据处理中具有广泛应用。
2025-04-26 19:20:28
1191
原创 【考核】移动应用开发实验室考核 2
本文总结了多道经典算法题的解题思路与代码实现: 【反转链表】使用迭代法,通过前后指针遍历链表并反转指向,最后返回前指针作为新头节点。 【买卖股票最佳时机II】采用动态规划,定义dp数组表示每天持有/未持有股票的最大利润,通过状态转移方程计算最终收益。 【合并K个升序链表】运用分治思想,将链表数组递归分组后两两合并,通过递归调用实现高效合并。 【接雨水】通过维护左右两侧最高柱子的数组,计算每个位置能接的雨水量,取左右最小值与当前高度差。 【随机链表复制】采用三步法:节点复制、随机指针处理、链表分离,最终得到深
2025-04-23 17:53:27
901
原创 【Git】从本地存档到协作开发的 Git 简单使用
本文系统介绍了Git的核心概念和工作流程,包括工作区、暂存区、本地仓库和远程仓库的关系,文件四种状态(未追踪、已修改、已暂存、已提交)的转换机制。详细讲解了分支管理的基本操作(创建、切换、合并、删除)及冲突处理方法,并提供了完整的本地与远程仓库交互命令集,特别强调了协作开发中的远程同步策略和变基原理。最后对比了clone与fetch命令的区别,为开发者提供了全面的Git使用指南。
2025-04-21 11:33:37
1065
原创 【数据结构】为什么很多的链表问题都适用递归解决?
递归解决链表问题的优势: 链表结构自相似,每个节点由值和指针组成,天然适合递归处理 递归能简化多节点操作,避免复杂的指针保存逻辑 递归通过分解子问题,统一处理各类链表操作模板 递归实现代码简洁,将迭代中的循环判断转化为递归终止条件 关键点:链表结构具有递归特性,递归能自然处理链表的单向遍历和指针调整问题。
2025-04-20 00:26:09
1054
原创 【IO】多语言输入输出机制实现原理和性能对比
本文系统介绍了系统级IO与流的概念。主要内容包括:系统级IO是操作系统提供的底层接口,流是对其的高级抽象,提供设备无关性和跨平台兼容;缓冲区的作用及缓冲模式分类;对比了C、C++、Java中不同输入输出方式(如scanf/printf、cin/cout、Scanner、BufferedReader)的性能、类型安全和缓冲管理特点。最后指出Scanner等工具依赖底层流缓冲,自身不具备缓冲管理能力。全文通过纵向语言对比和横向特性分析,全面阐述了IO系统的设计与实现。
2025-04-09 21:42:44
577
原创 【考核】移动应用开发实验室考核 1
本次二面题目以基础语法和模拟题为主,难度较去年有所降低。A题字符统计因遍历顺序错误导致部分测试未通过;B题通过欧拉筛和回文判断解决了素数回文数问题;C题直接比对基因序列;D题利用差集判断跳数;E、G题处理开关灯模拟;F题统计二进制分类;H题因二分查找处理不当未能通过。整体考察了字符串处理、素数筛、模拟、二分查找等基础算法能力,需注意细节处理和变通实现。
2025-04-02 20:50:35
540
原创 【算法】Manacher 马拉车算法
马拉车算法是解决最长回文子串问题的线性时间算法。首先通过插入特殊字符将字符串映射为奇数长度,解决偶数中心问题。中心扩散法逐个字符计算臂长,时间复杂度O(n²)。马拉车算法利用回文对称性优化:维护最右边界r和中心点centerIndex,通过arr[i] = min(r-i, arr[2*centerIndex-i])减少冗余计算,使时间复杂度降至O(n)。核心思想是利用已知回文信息避免重复计算,仅在必要时扩展边界验证。
2025-03-23 16:42:24
931
原创 【数据结构】即使负载因子超标也要硬抗到扩容临界点吗?哈希表,你这家伙
哈希表是一种高效的数据结构,通过哈希函数将键映射到值,实现O(1)时间复杂度的增删查改。文章介绍了哈希表的基本原理、哈希冲突处理方式(链式地址和开放寻址),以及哈希算法的设计要求。随后通过两个LeetCode题目(两数之和、字母异位词分组)展示了哈希表的实际应用:利用哈希表快速查找目标元素,以及通过排序后的字符串作为键来分组字母异位词。这些示例体现了哈希表在优化算法时间复杂度方面的优势。
2025-03-02 14:40:33
748
原创 【算法】动态规划的基本步骤和简单题解
本文总结了动态规划的基本思想和解题步骤,重点分析了斐波那契数列相关的典型问题。动态规划通过状态推导实现全局最优,其核心步骤包括确定dp数组含义、建立递推公式、初始化、确定遍历顺序和验证。文章以爬楼梯、斐波那契数、泰波那契数、最小花费爬楼梯和打家劫舍等题目为例,展示了如何运用动规五部曲解决问题,并介绍了滚动数组优化空间复杂度的方法。每个问题都给出了清晰的解题思路和代码实现,体现了动态规划在解决最优化问题中的高效性和通用性。
2024-12-12 21:30:41
2384
原创 【算法】前缀和题目的简单题解
摘要 本文介绍了三道数组相关的算法题解: 一维数组的动态和:通过动态规划计算前缀和数组,每个元素等于前一个前缀和加上当前元素。 寻找数组的中心下标:利用前缀和数组,找到左右两侧和相等的中心点,考虑边界情况处理。 除自身以外数组的乘积:分别计算前缀积和后缀积,通过两次遍历得到结果,优化空间复杂度至O(1)。 长度最小的子数组:使用滑动窗口技术,维护满足条件的最小窗口,时间复杂度为O(n)。 这些题目展示了前缀和、滑动窗口等常用技巧在数组问题中的应用。
2024-12-08 17:54:03
869
原创 【数据结构】栈和队列题目的简单题解
本文介绍了经典算法问题: 用栈实现队列:通过两个栈(输入栈和输出栈)模拟队列操作,入队时压入输入栈,出队时从输出栈弹出,若输出栈为空则将输入栈元素全部转移,确保先进先出特性。 用队列实现栈:利用队列的先进先出特性,通过反复出队入队操作模拟栈的后进先出,出栈时将队列前n-1个元素重新入队,保留最后一个元素出队。 有效的括号:使用栈结构检查括号匹配,遇到左括号入栈,右括号时检查栈顶是否匹配,最终栈为空则有效,否则无效。 每种问题均通过特定的数据结构转换实现功能,核心在于理解并巧妙利用栈和队列的特性差异
2024-11-28 20:49:16
541
原创 【数据结构】反转链表的多种解法
本文介绍了反转链表的四种实现方法:迭代法使用快慢指针和临时节点逐步反转;递归法通过递归调用和尾递归两种方式实现;栈实现利用先进后出特性完成反转;原地反转通过移动节点位置实现。每种方法都附有代码示例和简要说明,展示了不同思路下如何高效地反转链表。这些方法的时间复杂度均为O(n),空间复杂度除栈实现外均为O(1),为处理链表反转问题提供了多种解决方案。
2024-11-28 13:02:17
634
原创 【算法】欧拉筛算法
本文介绍了基于算数基本定理的欧拉筛素数算法。该算法利用每个合数都有最小质因数的特性,通过两层循环高效标记非素数。外层循环遍历自然数,内层循环用已得素数标记其倍数。关键优化在于当i能被当前素数整除时跳出循环,避免重复标记。算法正确性证明表明每个合数仅被其最小质因数标记一次,时间复杂度为线性的O(n)。代码实现使用两个数组分别存储素数标记和结果,能在给定范围内高效筛出指定数量的素数。
2024-11-26 21:03:45
1795
原创 【数据结构】链表操作题目的简单题解
这篇文章介绍了五种常见的链表操作算法,包括: 移除链表元素 - 递归法和迭代法删除指定值的节点 反转链表 - 使用快慢指针实现链表反转 两两交换链表节点 - 递归和迭代方法交换相邻节点 删除倒数第N个节点 - 双指针法定位并删除节点 相交链表 - 查找两个链表的交点 每种算法都给出了C语言实现代码,并分析了核心思路和关键步骤。文章重点讲解了虚拟头节点、双指针等技巧在链表问题中的应用,以及递归和迭代两种实现方式的区别。这些算法涵盖了链表操作的基本模式,是解决更复杂链表问题的基础。
2024-11-23 23:11:57
2055
原创 【算法】KMP 算法
KMP算法是一种改进的字符串匹配算法,通过构建前缀表避免不必要的回溯。前缀表记录了模式串每个子串的最长相同前后缀长度,用于在匹配失败时确定模式串指针的回退位置。以LeetCode 28题为例,算法先构建next数组,再通过双指针进行匹配。类似的459题利用前缀表性质判断字符串是否由重复子串构成,若最长前后缀长度与字符串长度之差能整除原长,则满足条件。KMP算法有效提高了字符串匹配效率,时间复杂度为O(n+m)。
2024-11-19 17:03:46
1068
原创 【算法】双指针题目的简单题解
这篇文章总结了五个数组操作问题的解法:26题使用双指针原地删除有序数组重复项;27题用快慢指针移除指定元素;283题通过交换将零移到数组末尾;344题用首尾指针反转字符串;844题用栈处理退格字符比较字符串。除844题外每个问题都通过指针操作或栈结构实现原地修改,保证了空间复杂度为O(1)。
2024-11-17 16:48:57
742
原创 【算法】高精度加法和乘法
倒序输出总和数组时,因为最高位不为 0 ,可以设置一个计数变量从数组最高的元素逐位检测其是否为 0 ,若为 0 则计数变量递减,反之则进入以计数变量为初始值的循环并输出总和数组。核心的循环,n1、n2 分别表示上式和下式的位数,外层循环表示逐位相乘的次数,内层循环表示上式逐位与当前位相乘的次数。在这里简化了一些,将相乘的结果直接存储到总和数组中并进位。
2024-11-10 13:25:25
423
原创 【考核】移动应用开发实验室一面
字符串处理:演示strlen()与sizeof()区别,计算字符串长度与占用空间,str1输出10和11,str2输出5和20。 无符号循环:无符号字符i=5递减会下溢至255,导致无限循环。 宏定义:展示宏替换规则,计算z=70,并演示嵌套printf调用顺序。 变量作用域:静态变量b在函数调用间保持值,两次调用func()分别输出21和22。 位运算迷宫:通过复杂switch-case和位运算,最终输出2024和24。 指针类型:比较指针数组ptrArr和数组指针arrPtr的访问方式,均能遍历数组。
2024-11-01 20:04:04
352
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅