自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 XML解析

通过对比 Pull 解析和 SAX 解析,可以看出它们各有优劣。Pull 解析适合结构简单的 XML 文件,代码逻辑更加直观;而 SAX 解析则更适合处理大型 XML 文件,能够节省内存并提高解析速度。在实际开发中,选择哪种解析方式取决于具体的需求。

2024-08-11 18:47:08 219

原创 剑指offer76 删除链表中重复的结点 Kotlin

根据题目要求,基本思路是使用双指针遍历链表,通过比较相邻节点的值来判断是否有重复,一个指针用来遍历链表,当出现值相等的两个节点则判断出现重复节点,需要调用另一个指针跳过,另一个指针用来跟踪不重复的最后一个节点,遍历链表的指针删除时需要特别注意处理头节点可能会被删除的情况。在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。:对于连续出现的重复节点,既要删除这些节点,又要保持链表的连接性。:最终结果是一个新的链表,删除重复元素后的链表头指针。如果发现了重复节点,

2024-08-11 18:47:00 155

原创 剑指offer18 删除链表的节点 Kotlin

题目中给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点,并返回删除后的链表头节点,同时题目假设链表中所有节点的值互不相同。给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 2 -> 1 -> 9。给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 2 -> 5 -> 9。给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。如果头节点的值等于目标值,直接返回头节点的下一个节点,删除头节点。

2024-08-11 18:46:58 252

原创 Android网络(四)网络框架的集大成者--Retrofit

首先我们定义返回数据的模型类,通过定义数据模型类,将服务器返回的商品详情页面,名称、描述、价格和图片等信息的 JSON 格式数据直接映射为 Kotlin 对象,从而避免手动解析 JSON 可能引发的错误。这样,我们可以将服务器返回的 JSON 数据自动映射到类的实例中,简化了数据的处理过程。接下来定义 API 接口,将网络请求的定义与实际调用分离。这种接口定义方式使代码结构更加清晰,有利于后期的扩展和维护。接口方法还可以定义请求参数和返回类型,从而使网络请求更加简洁和直观。通过定义。

2024-08-11 16:08:56 643

原创 Android网络(三)使用OkHttp

可以看出,OkHttp相比在功能和性能上有了显著的提升。它不仅提供了更强大的缓存和并发管理功能,还允许开发者灵活调整网络请求的各项参数,满足现代应用的复杂需求。但当我们需要高度自定义的 API 请求,或是需要与其他网络协议进行集成时,OkHttp也无法满足需求了。在专栏的下一篇文章中,我们将深入探讨更为专业的网络库Retrofit,它建立在OkHttp之上,并提供了更加简洁且易于扩展的 API,适用于复杂的 RESTful 服务集成。

2024-08-11 03:19:12 340

原创 Android网络(二)原生的HTTP请求工具--HttpURLConnection的用法

作为 Android 系统提供的原生 HTTP 请求工具,尽管功能相对简单,但它仍然具备处理基本网络请求的能力。其轻量级和系统内置的特性,使得在一些简单或对性能要求较高的场景中仍然被广泛使用。然而,随着现代应用对网络请求的复杂性和高效性的要求越来越高,的局限性也逐渐显现。比如,处理复杂的网络请求、增强的连接池管理、更好的性能优化等需求,往往需要更强大的工具来应对,OkHttp作为一个开源的 HTTP 客户端,提供了许多所不具备的高级特性。

2024-08-11 03:18:56 864

原创 Android网络(一)Android的简易浏览器--Webview组件

掌握这些网络通信的技巧和最佳实践,不仅可以提升应用的性能,还能带来更好的用户体验,使应用在各种网络环境下都能稳定运行。或者考虑使用Android提供的Webview控件,Webview相当于一个迷你浏览器,不仅能渲染 HTML 页面,还能执行 JavaScript,甚至能与原生代码进行交互。方法时,WebView 会发起一个网络请求获取网页内容。或者通过继承 WebViewclient,我们可以拦截和处理页面加载、错误和其他事件,并且控制页面加载的行为,比如处理特定的 URL 跳转、重定向、以及错误处理,

2024-08-11 03:18:53 614

原创 Kotlin中的拓展函数与运算符重载

我在学习编程的过程中,看见许多内容创作者会强调编写优雅且高效的代码的重要性。所谓优雅,其实就是代码能够清晰地表达开发者的意图,减少错误的发生,并且便于后续的维护和扩展。通过扩展函数,我们可以在不修改原有类的情况下,为其添加新功能,使代码更加简洁和直观。运算符重载则让我们可以为自定义类型定义标准运算符的新行为,使代码更符合直觉,提升可读性。总之,优雅的代码不仅提高了开发效率,还大大增强了代码的质量和可维护性。Kotlin 的这些特性,恰恰是实现编程优雅和高效的有力工具。

2024-08-11 03:18:50 360

原创 Kotlin 标准函数和静态方法

Kotlin中提供了很多标准函数和静态方法,标准函数包括letwithrunapply和also等,这些函数主要用于简化对象操作,静态方法则常用于工具类中定义一些不依赖于实例的通用方法。合理使用这些函数和方法,一方面能提高代码的可读性,另一方面对我们的工作效率也很有帮助,本文将对常用的标准函数和静态方法以及他们常见的使用场景进行简单的总结归纳。

2024-07-29 05:05:05 908

原创 探究 ContentProvider:实现跨程序共享数据的关键组件

在 Android 开发中,跨程序共享数据是一个常见的需求,以音乐播放器app为例,音乐播放器应用需要访问系统的媒体库,添加潜在好友需要访问手机通讯录,这些常见的功能都需要实现跨程序共享数据,而实现这一需求的核心组件就是 ContentProvider。ContentProvider 作为 Android 系统中标准的数据共享接口,提供了一种统一的方式来访问和操作不同应用间的数据。

2024-07-28 23:31:10 718

原创 剑指offer6 从尾到头打印链表 Kotlin

题目给定一个单链表,要求返回从尾到头的节点值组成的数组,这意味着我们需要从链表的尾部开始访问节点,并按此顺序收集节点的值,顺着这个思路我们首先可以想到用递归函数来解决这个问题,递归函数的调用栈本身就具有后进先出的特性,这与我们需要的从尾到头的顺序是非常吻合。我们从头到尾遍历链表,将每个节点的值压入栈中,然后再弹出栈中的所有元素,得到的顺序就是从尾到头的顺序。输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。和结果列表,这将导致链表的后续节点先被访问。,表示链表的当前节点。

2024-07-21 21:23:48 137

原创 Android的异步任务实现

在Android应用开发中,异步任务处理是确保应用响应性和性能的关键。随着用户对流畅体验的期望不断提高,传统的同步执行方式已经无法满足需求。异步执行允许应用在后台处理耗时操作,同时保持前台界面的流畅和响应。在早期的Android开发中,异步任务通常通过手动创建线程或使用Thread和Handler来实现。这种方式虽然有效,但代码复杂且容易出错。随着AsyncTask的引入,开发者获得了一种更简单的异步任务处理方式。AsyncTask允许在后台线程中执行耗时操作,并在操作完成后将结果回调到主线程。

2024-07-21 21:22:17 1140

原创 Android线程与线程池

在Android开发中,线程扮演着重要的角色,然而,线程并不是无限制的资源。如果一个应用程序不断地创建和销毁线程,就像工厂频繁地雇佣和解雇工人一样,这不仅效率低下,还可能引发资源管理上的问题,而线程池正是这一问题的解决方案。它们是轻量级的进程,共享同一进程的资源,但拥有自己的执行堆栈和程序计数器。三种线程池提供了不同的并发策略,根据应用程序的具体需求选择最合适的线程池类型,以实现性能和资源利用的优化。线程池的使用应根据任务的特性和预期的并发需求来选择,以确保应用程序的效率和响应性。在实际应用中,通常在。

2024-07-21 21:20:54 839

原创 剑指offer52 两个链表的第一个公共结点 Kotlin

输入分为是3段,第一段是第一个链表的非公共部分,第二段是第二个链表的非公共部分,第三段是第一个链表和第二个链表的公共部分。后台会将这3个参数组装为两个链表,并将这两个链表对应的头节点传入到函数FindFirstCommonNode里面,用户得到的输入只有pHead1和pHead2。题目保证输入的链表是无环的,因此不存在环的干扰。输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。返回传入的pHead1和pHead2的第一个公共结点,后台会打印以该节点为头节点的链表。

2024-07-21 21:20:32 365

原创 剑指offer24 反转链表 Kotlin

给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。我们不妨先考虑使用递归法,先递归到链表的末端,再从末端开始反转链表的指针,递归到头结点时,返回新的头结点,但我们很快回意识到由于递归调用栈空间复杂度为 O(n),不符合题目要求,因此不仅递归法不能使用,使用栈方法也不能满足题目要求。如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。要求:空间复杂度 O(1),时间复杂度 O(n)。

2024-07-21 21:18:51 164

原创 剑指offer25 合并两个排序的链表 Kotlin

比较两个链表当前节点的值,选择较小的节点作为合并后的链表的当前节点。但递归方法在处理较长链表时可能会导致栈溢出,并且递归调用本身需要额外的空间,空间复杂度为 O(n),也无法满足题目要求,因此我们考虑用迭代法解题。输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。题目要求合并两个链表,双指针法一次遍历两个链表,利用双指针分别指向两个链表的当前节点也是非常高效的选择,下面是使用迭代法配合双指针的具体实现。要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

2024-07-21 21:18:43 238

原创 剑指offer59 滑动窗口的最大值 Kotlin

解决滑动窗口问题通常需要用到双指针技术,通过维护一个固定大小的窗口来遍历数组。在每次窗口滑动过程中,计算并记录下窗口内所需的统计量,如最大值、最小值或总和。为了提高效率,可以使用额外的数据结构,例如单调队列或平衡树,来快速找到窗口内的最大或最小元素。通过这种方式,可以在线性时间内完成窗口的更新和统计量的计算。

2024-07-14 22:51:17 698

原创 剑指offer73 翻转单词序列 Kotlin

压栈和出栈操作都是线性时间的,但因为每个单词都要单独处理,所以总体时间复杂度是O(n),符合题目要求。使用两个索引变量(指针)遍历字符串,一个从左到右,另一个从右到左,用于反转字符串中的字符或单词。首先,我们需要将字符串按空格分割成单词数组,然后反转这个单词数组,使单词顺序恢复正常。如果单词后面紧跟着标点符号,需要将标点符号与单词一起反转,最后,将反转后的单词数组重新拼接成一个字符串。进阶:空间复杂度 O(n) O(n) ,时间复杂度 O(n) O(n) ,保证没有只包含空格的字符串。

2024-07-14 21:31:56 232

原创 剑指offer31 栈的压入、弹出序列 Kotlin

两种种解法的时间复杂度同样是O(n),其中n是压栈序列的长度。在大多数情况下,这两种方法的效率差异不大,因为它们的基本操作是相同的。双指针法的好处是不需要额外的空间来存储每个元素的索引。

2024-07-14 21:31:52 327

原创 Android消息机制

以上便是消息机制的原理及组件解析,消息机制的运行过程,可以简单地用下图来理解。

2024-07-14 21:31:49 1005

原创 剑指offer 30JZ30 包含min函数的栈 Kotlin

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 min 函数,输入操作时保证 pop、top 和 min 函数操作时,栈中一定有元素。输入: ["PSH-1","PSH2","MIN","TOP","POP","PSH1","TOP","MIN"]"POP"表示弹出栈顶元素,弹出2,栈中元素为-1。"PSH-1"表示将-1压入栈中,栈中元素为-1。"PSH2"表示将2压入栈中,栈中元素为2,-1。"PSH1"表示将1压入栈中,栈中元素为1,-1。输出: -1,2,1,-1。

2024-07-07 17:06:49 353

原创 剑指offer 09用两个栈实现队列 Kotlin

用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能。首先,题目明确指出我们只能使用两个栈作为数据结构,并且队列中的元素必须是整数类型。这意味着我们不能依赖队列或其他数据结构的特性,而必须完全依靠栈的操作来实现队列的功能。要求:存储n个元素的空间复杂度为 O(n)O(n) ,插入与删除的时间复杂度都是 O(1)O(1)首先,我们得明白栈和队列的区别。这要求我们的实现必须高效,以保证操作的快速性。,这是一个直接的栈操作,模拟队列的入队行为。

2024-07-07 17:06:47 164

原创 Fragment详解

当Fragment与Activity关联时,Fragment的生命周期会受到Activity的影响,例如在Activity的onPause时,关联的Fragment也会收到对应的生命周期回调。本文将详细介绍什么是Fragment、Fragment的生命周期、使用方式、回退栈、与Activity之间的通信及其优化、以及如何处理运行时配置的变化。Activity作为应用程序中的一个页面或交互单元,可以包含多个Fragment,每个Fragment可以看作是Activity的一个部分或子页面。

2024-07-07 17:06:42 674

原创 Service 的典型使用实例--一家秩序运行的咖啡厅

理解和应用 Service 是 Android 应用开发中的重要部分。本文介绍了几种典型的 Service 使用场景:不可交互的后台服务(startService)、可交互的后台服务(bindService)、混合模式服务(startService 和 bindService),以及前台服务(Foreground Service)。不可交互的后台服务适合那些需要在后台默默执行任务的场景,比如自动化的数据备份或周期性的系统清理。

2024-07-07 17:06:39 792

原创 滑动谜题通解--广度优先算法(BFS)

/ 棋盘状态// 空白格子的坐标// 父状态,用于记录路径i++) {@Override@OverridePuzzleState 类:用于表示每个状态的棋盘配置。board' 存储当前的棋盘状态,'emptyX'和 'emptyY'记录空白格子的位置,'parent'记录当前状态的父状态,以便构建路径。

2024-07-07 17:06:36 704 1

Android网络(一)Android的简易浏览器-Webview组件

Android网络(一)Android的简易浏览器-Webview组件

2024-08-10

BFS实现滑动谜题求通解

BFS实现滑动谜题求通解

2024-07-07

空空如也

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

TA关注的人

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