自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Android 滑动冲突的处理方式

滑动冲突指的是:两个可滚动的 View 存在嵌套关系时,同一个手势不知道该由谁来响应。本文先区分三种常见的冲突场景,再说明判断依据,最后给出两种标准的解决方案和一份可复用的实现。

2026-10-22 11:41:26 136

原创 Android 自定义 View 入门

自定义 View 这个词在面试题里出现率极高,但很多人对它的理解是错位的——以为自定义 View 就是"继承 View,重写 onDraw,拿 Canvas 画图",然后被onMeasure的三种模式和滑动冲突劝退。实际上自绘只是自定义 View 的一种,而且是需求里占比最小的一种。大多数"这个控件差一点不合我意"的场景,继承系统控件改一改就够了。这篇把自定义 View 的几种做法都过一遍,附完整代码。硬编码的颜色写死在 Java 里,换色就要改代码。自定义属性可以让控件在 XML 里配置。

2026-09-27 19:49:06 190

原创 Android 跑马灯:从一行 XML 到自定义控件

既然问题是"拿不到焦点",那就让 TextView永远认为自己有焦点。@Override做 Android UI 的时候,遇到长文本塞不下,跑马灯是常规解法。系统属性适合单独一个 TextView 的简单页面(版权声明、横幅提示)自定义 TextView(重写isFocused)适合绝大多数列表场景——歌单、商品、消息预览适合需要和业务状态联动的场景——播放页歌词、暂停 / 恢复做歌单这种 UI 的话,写个 5 行的就完事了,不用一开始就上,也不用折腾。

2026-09-20 17:24:10 335

原创 Android BottomNavigationView 入门介绍

BottomNavigationView(简称 BNV)是 Material Components 库提供的一个底部导航控件,固定在页面底部,用于在 3~5 个顶层页面之间快速切换,常见于「首页 / 视频 / 我的」这类 App 结构。它自带图标 + 文字、选中态变色、点击涟漪反馈,开箱即用,是 Android 官方推荐的底部导航方案。BNV 的每个 Tab 对应一个菜单项,先建。

2026-09-13 17:00:16 229

原创 Android 下拉刷新:SwipeRefreshLayout 原理、用法与 API 详解

下拉刷新(Pull-to-Refresh)是移动端最常见的交互之一:用户在可滚动区域的顶部继续下拉,松手后触发数据重新加载,顶部出现转圈动画作为加载反馈。下拉刷新手势的前提是"子 View 已滚到顶部(无法继续上滚)后仍向下拉"。若内容短于一屏、本身不能滚动,手势不成立,下拉不会有反应。页面内容较长时,用户滚到中间继续下拉,预期是"继续浏览"而非"刷新"。),本文结合天气 App 的实际用法,从布局结构到全部常用设置方法逐一详解。下拉时转圈会跟随手指下移,可通过偏移方法调整它的初始位置与跟随范围。

2026-09-02 22:02:12 385

原创 Android 中 Serializable 与 Parcelable 的对比与选择

Serializable 胜在简单,Parcelable 胜在高效。实际开发中,面向 Intent 传参的场景优先用 Parcelable。如果你觉得手写 Parcelable 太繁琐,可以借助 Android Studio 的插件(如 Parcelable 代码生成器)来一键生成。

2026-08-09 22:18:25 270

原创 Android registerForActivityResult 详解

当内置 Contract 无法满足需求时,可以通过继承实现自定义 Contract。方法调用时机作用launch()调用时根据输入 I 生成启动目标组件的 Intent目标组件关闭时将 resultCode 和 Intent 解析为输出 O。

2026-08-02 20:50:28 429

原创 [Android] ViewPager2的基本使用

是 Android Jetpack 中的一个控件,用来实现左右滑动切换页面的效果。它是 ViewPager 的升级版,底层基于 RecyclerView 实现。常见应用场景:ViewPager2 本身是一个容器,里面可以放多个页面,用户可以左右滑动来切换。你需要通过 Adapter 告诉 ViewPager2 有几页、每页长什么样。在 中添加:当然,项目里这个就包含了我们要用的四、AdapterViewPager2 支持两种 Adapter:每个页面是一个 Fragment,适合页面逻辑复杂的场景

2026-07-23 11:51:43 238

原创 Android 数据持久化解析

实体类继承名为id或_id的 int/long 字段会被自动当做主键,自增成员变量的命名会按驼峰转下划线规则映射成列名——→如果某个字段不想存到数据库,用private修饰就行。只有带 getter 和 setter 的 private 字段才会被识别为数据库列// getter setter 省略两个类都在里注册后,LitePal 会自动建两张表。如果需要关联关系,可以在 Book 里声明外键,LitePal 也支持一对多、多对多的关联查询,用之类的便捷方法。文件存储。

2026-07-19 21:20:37 462

原创 Android Fragment(碎片)基础使用指南

写布局 XML(和 Activity 没区别)写 Fragment 类,继承Fragment,重写,用inflate()加载布局控件的前面要加view.放进 Activity:静态用<fragment>标签,动态用同屏的 Fragment 之间用直接拿实例调方法跨屏的通过 Intent → Activity → Fragment 传数据<fragment>标签的填类全名,不需要在里注册Fragment 说到底,就是把 UI 切成可复用的独立模块。

2026-06-21 17:15:58 375

原创 Android 控件与布局全面解析

监听器适用控件触发时机Button、ImageView 等点击大部分控件长按大部分控件触摸ListView 等点击列表项选中状态改变SeekBar进度改变EditText文字内容改变知识模块核心内容四大布局核心属性基础控件列表控件ListView + 自定义 Adapter + ViewHolder 优化交互控件事件处理点击、长按、状态改变、文本变化等监听器掌握了这些内容,你就具备了独立搭建 Android App 界面的能力。

2026-06-14 18:14:33 234

原创 Android Activity 生命周期解析

对于每一位 Android 开发者来说,理解Activity 的生命周期是最基础也是最重要的入门知识。面试必问、开发必用、排查问题必备。本文将借助一个精心设计的 Demo 项目 ——,通过实际代码 + 日志验证 + 场景模拟的方式,带你彻底搞懂 Activity 的 7 个生命周期方法和不同场景下的回调顺序。即使你是零基础的初学者,也能通过本文一步到位。📦 项目源码结构简洁,总共 3 个 Activity + 3 个布局文件,最适合边读边跑边看日志。项目属性说明项目名称语言Java + XML。

2026-06-07 15:46:27 384

原创 【Java】从零手写一个支持多人在线的TCP聊天室

技术点实现方式位置TCP 通信Socket多线程并发每个客户端一个ThreadServer.java 第16行消息广播遍历sockets列表,排除自己ServerRunnable.java 第34-42行双线程收发接收线程 + 发送线程分离Client.java 第79-97行用户持久化文件读写FileWriterUsers.javaBase64 编码简单防明文泄露Users.java 第44-56行资源管理自动关闭流全项目广泛应用。

2026-05-31 18:23:17 233

原创 Java反射机制基础入门

在日常Java开发中,绝大多数代码都属于静态编码。程序在编译阶段就确定好需要使用的类、成员方法与成员变量,通过new关键字直接创建对象并完成业务调用,整个流程固定且可控。// 编译阶段确定调用类与方法user.setName("张三");反射的核心原理:依托Class对象,在程序运行时动态解析并操作类的全部资源;Class对象包含三种获取方式,静态开发优先使用类名.class方式,性能更优;反射常用基础功能包含动态创建对象、操作成员变量、调用成员方法,访问私有成员需手动开启权限;

2026-05-24 16:18:54 379

原创 Java基础之异常

异常是程序在编译阶段或运行阶段出现的非正常、不符合预期的情况。Java将所有程序错误、异常情况封装成异常对象,统一管理和处理。Throwable:所有错误、异常的顶层父类;Error:系统致命错误,不可处理;RuntimeException:代码逻辑问题,编译不校验,可选处理;受检查异常:外部资源问题,编译强制校验,必须处理。JDK 自带异常(如)无法覆盖所有业务场景(如余额不足、用户不存在),因此需自定义异常。

2026-05-14 09:45:01 381

原创 【JAVA】多线程的入门讲解

资源隔离:进程资源相互独立隔离;线程共享所属进程的全部资源,资源互通。开销成本:进程创建、切换、销毁成本极高;线程是轻量化单元,开销小、效率高。从属关系:一个进程至少自带一个主线程,线程无法脱离进程独立运行。通信方式:进程间通信复杂繁琐;线程可直接共享变量实现通信,简单高效。多线程并发是Java进阶的核心难点,吃透基础之后,大家可以继续深入学习JMM内存模型、AQS原理、锁优化、并发容器等高阶知识,循序渐进吃透整个Java并发体系!

2026-05-11 10:24:40 365

原创 Java IO流基础全面详解:字节流、字符流

IO是Input(输入)和Output(输出)的缩写,Java IO流是一套用于实现程序与外部设备之间数据传输的API体系。外部设备主要包含本地硬盘文件、内存、网络端口、控制台等,IO流的核心作用,就是搭建程序与这些外部设备之间的数据传输通道,完成数据的读取和写入操作。掌握Java IO流,核心只需把握三个核心要点:根据文件类型选择字节流或字符流,追求读写性能优先使用缓冲流,编码不一致出现乱码使用转换流。

2026-05-05 16:52:43 429

原创 [Java]Stream流

在Java开发日常工作中,集合遍历、数据筛选、字段转换、排序去重、统计分组是高频常见操作。在Java8之前,处理这类业务只能通过for循环搭配if判断完成,不仅代码冗余量大,嵌套层级多,后期维护和阅读都很不方便。Java8推出的Stream流式编程,结合Lambda表达式,以声明式编程模式处理集合数据。开发者只需定义数据处理规则,无需手动编写循环迭代逻辑,代码简洁紧凑,业务逻辑清晰直观。本文主要讲解Stream核心概念、常用中间操作和终端操作。

2026-04-25 20:29:11 402

原创 [Java]拓扑排序

在图论算法中,拓扑排序是专门针对有向无环图(DAG) 的经典算法,也是笔试、蓝桥杯、面试高频考点。大学选课:必须先修高数,才能修概率论;工程打包:Maven/Gradle 依赖加载顺序;任务调度:流水线任务先后执行顺序;编译原理:代码文件依赖编译顺序。给定一张有向图,若存在一个顶点序列,使得图中任意一条有向边u→v都满足:u 在序列中一定出现在 v 前面,该序列即为拓扑序,生成该序列的过程就是拓扑排序。关键前提只有有向无环图 (DAG) 才有合法拓扑序;

2026-04-16 08:17:45 394

原创 Java继承详解| 从基础到实战,吃透面向对象核心特性

作为Java面向对象编程(OOP)的三大核心特性之一(封装、继承、多态),继承是实现代码复用、简化开发、构建层次化类结构的关键。很多新手在学习继承时,容易混淆重写与重载、super与this的用法,也常常踩坑访问权限和构造器调用的问题。本文结合实例,从基础概念到实战细节,再到常见坑点,一步步带你吃透Java继承,适合Java初学者和需要巩固基础的开发者。简单来说,继承就是让一个类(子类/派生类)拥有另一个类(父类/基类/超类)的属性和方法,子类无需重复编写父类已有的代码,只需专注于实现自身的专属功能。

2026-04-12 16:54:37 403

原创 Java封装详解| 从原理到实战,吃透每一个核心要点

多数开发者对封装的理解局限于“private修饰属性+getter/setter方法”,这仅为封装的实现形式,而非本质。完整的封装需满足三个核心要点,缺一不可,是理解封装的关键:数据隐藏:隐藏对象的成员变量及内部实现逻辑(如辅助性私有方法),禁止外部类直接访问,避免外部代码随意篡改对象状态。此处的“隐藏”并非完全禁止访问,而是通过访问修饰符控制访问权限,实现合理的权限管控。

2026-04-05 17:35:43 416

原创 最小生成树:Prim和Kruskal算法

在学习算法前,我们必须先搞懂:到底什么是最小生成树?前置基础概念无向图:图中的边没有方向,顶点 A 到 B 和 B 到 A 是同一条边。连通图:图中任意两个顶点之间,都存在至少一条路径可以到达。带权图:每条边都有一个权值。树:连通且无环的图,n 个顶点的树,恰好有 n-1 条边。生成树是什么?一个带权无向连通图的生成树:包含图中所有的顶点只有 n-1 条边,保持图的连通性,且没有环。简单说:把图 “修剪” 成一棵树,保留所有顶点,不多不少刚好 n-1 条边。

2026-03-26 09:23:57 524

原创 C 语言算法:通俗易懂讲透单调栈

刷题的时候,我们经常遇到一类问题:找右边第一个比它大的数、求柱状图最大面积、接雨水。如果用双重循环暴力做,时间复杂度是 O (n²),数据一大就会超时。而 单调栈,就是专门解决这类问题的常用算法,代码不长、思路清晰,能把时间复杂度降到 O (n),在蓝桥杯、算法笔试里出现频率很高。这篇文章结合 C 语言代码,从原理、实现、例题、做题技巧四个方面,带你学好单调栈。简单说:栈里的元素,始终保持单调递增或单调递减。单调递增栈:从栈底到栈顶,元素越来越大单调递减栈:从栈底到栈顶,元素越来越小。

2026-03-22 13:08:08 487

原创 [C语言]背包问题:从原理到代码,吃透经典动态规划

背包问题作为动态规划的入门经典题型,万变不离其宗,核心都是在有限背包容量下,通过状态转移实现价值最大化。本文详解的01 背包、完全背包、多重背包,是最基础也最常用的三类模板,吃透三者的逻辑差异和代码写法,足以应对绝大多数背包类题目。01 背包是根基,每件物品仅可选一次,必须逆序遍历背包容量,避免重复选取;完全背包是延伸,物品可无限选取,只需将遍历顺序改为正序,其余逻辑与 01 背包完全一致;多重背包则是二者的结合,每件物品有固定选取上限,通过三层循环枚举数量,本质是带数量约束的 01 背包变种。

2026-03-15 16:34:53 457

原创 [C语言] 回溯算法的使用

回溯算法是一种基于递归的「试错 - 回退」算法,核心逻辑可以类比为走迷宫:当你走到死胡同时,不会继续往前,而是退回到上一个岔路口,选择另一条未走过的路继续尝试,直到找到出口或遍历完所有路径。所有回溯问题,都可以拆解为三个不可缺少的核心要素,这是解题的关键:路径(Path):已经做出的选择,也就是当前递归深度下,已经选好的元素集合(比如全排列中已经选好的数字)选择列表(Choice List):当前步骤中可以做出的选择(也就是还能选哪些元素)终止条件(End Condition):到达决策树底层,无法再

2026-03-08 16:44:57 407

原创 二叉搜索树详解:从原理到实战

核心定义二叉搜索树是一种有序二叉树,满足以下性质:左子树中所有节点的值 < 根节点的值右子树中所有节点的值 > 根节点的值左、右子树也必须是二叉搜索树关键特性中序遍历结果为升序序列查找、插入、删除操作的时间复杂度:O (h)(h 为树的高度)#include <stdbool.h> // 用于bool类型(C99及以上)// 二叉搜索树节点结构体int val;} TreeNode;// 新建节点(封装内存分配)

2025-12-14 17:36:40 414

原创 C 语言二叉树的深度搜索与广度搜索全解析

我们从二叉树的基础结构出发,详细讲解了深度优先搜索的前、中、后序遍历(递归 + 迭代)和广度优先的层序遍历,并通过 C 语言代码完成了实战实现。递归遍历:逻辑简洁,符合遍历定义,但递归深度过深时可能出现栈溢出;迭代遍历:通过栈(DFS)或队列(BFS)模拟递归过程,空间复杂度更可控;DFS:优先深探,前序关注根节点优先,中序对二叉搜索树有序,后序常用于子树相关操作;BFS:按层遍历,适合层级相关的问题(如求树的深度、找某一层的节点)。

2025-12-07 12:07:27 978

原创 C 语言前缀和与差分

前缀和数组pre_sum,其中pre_sum[i]表示原数组arr中前 i 个元素的和(注意:通常前缀和数组下标从 1 开始,避免边界判断)。公式推导差分数组diff,其中diff[i]表示原数组arr中arr[i]与arr[i-1]的差值(同样下标从 1 开始,diff[1] = arr[0],diff[i] = arr[i-1] - arr[i-2] for i>=2)。

2025-11-30 11:53:50 569

原创 栈和队列的互转

栈(LIFO:后进先出)和队列(FIFO:先进先出是两种核心线性数据结构,其互相转化的本质是通过 “结构组合” 或 “操作适配”,用一种结构的特性模拟另一种结构的核心行为。核心转化逻辑(本质)转化目标核心矛盾解决思路用栈实现队列栈→队列)栈 “后进先出” vs 队列 “先进先出”用队列实现栈(队列→栈)队列 “先进先出” vs 栈 “后进先出”单队列轮转:让队尾元素(最后入队)变队首(优先出队)(一)用栈实现队列入队栈(inStack):仅负责接收新元素(push操作);

2025-11-23 13:51:52 1017

原创 C语言中滑动窗口的实现

定长 vs 不定长窗口对比特性定长滑动窗口不定长滑动窗口窗口大小固定(k)动态调整(扩张 / 收缩)指针移动left 与 right 同步移动right 扩张,left 按需收缩适用场景固定长度的子串 / 子数组问题满足条件的最长 / 最短子串问题核心操作加入右元素 → 移除左元素扩张 → 校验 → 收缩核心优化点复用窗口状态:避免每次重新计算子区间的总和 / 字符状态,降低时间复杂度。边界处理:注意 left 和 right 的取值范围,避免数组越界。

2025-11-23 11:44:27 930

原创 用数列和链表模拟栈和队列

在实现栈之前,我们先简单了解下栈是什么?栈是一种仅允许在一端(栈顶)进行插入(进栈)和删除(出栈)操作的线性数据结构,核心特性是“后进先出(LIFO,Last In First Out)”。核心关键点操作受限:仅栈顶可执行数据操作,另一端(栈底)固定不可直接访问。逻辑特性:最后进入栈的元素,会最先被取出(类似叠盘子,最后叠的先拿)。存储形式:可通过数组(顺序栈)或链表(链式栈)实现,本质是线性结构的受限应用。接下来将分别用数组和链表来实现栈。栈和队列是两种操作受限的线性数据结构。

2025-11-14 18:45:13 899

原创 链表的五种反转方法

栈辅助法就是利用了**“先进后出”**的特性,用空间换时间,先 push 整个链表,再 pop 整个链表,将链表反转。递归反转链表简单来说:从链表末尾开始,先搞定最后两个的反转,再一步步往前反转每个节点与它后面已反转链表的关系。链表的反转是链表使用的一个重要操作,接下来本文将介绍 5 种反转方法。遍历原链表时,先抓牢原链表的“下一个节点”(避免断链);新头前移到当前节点(新链表变长),原头后移继续处理。把当前节点“掰弯”,让它指向新头(接入新链表);指向原链表的尾节点(即反转链表的头节点)。

2025-11-13 09:29:45 950

原创 [C语言]文件操作

类别函数功能打开 / 关闭打开和关闭文件格式化读写格式化输入输出字符读写单个字符读写字符串读写字符串读写二进制读写二进制数据读写指针操作移动和获取文件指针位置。

2025-11-09 17:12:52 602

原创 【算法】二分法的详解

在C语言中,二分法是一种在有序数组中查找特定元素的高效搜索算法,核心思想是通过不断将搜索区间一分为二,逐步缩小范围,最终定位目标值。关键思想为:1. 数据必须有序(即单调)2. 每次寻找目标数据时更新边界(即不断一分为二)二分法是一种基于“缩小区间”的高效算法,核心逻辑是通过每次排除一半无效范围,将问题规模从 n 缩减到 log2核心特点前提条件:查找类:数据需有序(升序/降序);逼近类:函数需连续且区间两端值异号。时间复杂度: O(log n) (远优于顺序遍历的 O(n) )

2025-10-28 21:01:02 1409

原创 内存对齐和大小端储存的初了解

本文介绍了结构体(struct)和共用体(union)的内存特点。结构体各成员独立占用内存,存在内存对齐规则,总大小为各成员内存之和(含填充);共用体则是成员共享内存,大小为最大成员内存(需对齐)。还通过共用体示例演示了大小端存储的差异:大端存储高位字节在低地址,小端存储反之。例如数字0x1234,大端存储为0x12、0x34,小端为0x34、0x12。

2025-10-26 19:59:38 961

原创 格式规范与内存对齐

本文摘要: 代码规范方面,强调统一缩进(4空格或Tab)、命名规范(蛇形、帕斯卡等)、括号与空格使用规则(运算符前后加空格等)以及注释要求(单行//、多行/* */)。结构体和共用体内存管理上,结构体采用内存叠加与对齐,总大小为成员之和加填充;共用体共享内存,大小为最大成员尺寸。重点讲解了内存对齐规则:结构体成员需按自身大小对齐,整体需按最大成员对齐;共用体直接按最大成员对齐。通过示例说明了不同数据类型的对齐计算方式。

2025-10-26 17:39:15 927

空空如也

空空如也

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

TA关注的人

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