<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[lly-Rachel的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Rachel23333</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Rachel23333]]></copyright><item><title><![CDATA[Eventbus 3.3.1源码分析]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/122635415</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/122635415</guid><author>Rachel23333</author><pubDate>Sat, 22 Jan 2022 12:06:53 +0800</pubDate><description><![CDATA[EventBus

EventBus is a publish/subscribe event bus for Android and Java.

EventBus是适用于Android和Java的发布/订阅事件总线。

优点：

简化组件之间的通信

将事件发送方和接收方解耦
在活动、片段和后台线程中表现良好
避免复杂且容易出错的依赖关系和生命周期问题


使代码更简单
速度快
很小（~60k jar）
在实践中被安装量超过 1，000，000，000 的应用证明
具有高级功能，如交付线程，订阅者优先级]]></description><category></category></item><item><title><![CDATA[rxjava3 源码解析]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/122586177</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/122586177</guid><author>Rachel23333</author><pubDate>Wed, 19 Jan 2022 17:36:58 +0800</pubDate><description><![CDATA[Rxjava

RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.

RxJava
– JVM的反应式扩展
– 一个用于使用Java虚拟机的可观察序列编写异步和基于事件的程序的库。
 
使用的主要设计模式包括：
观察者模式，装饰器模式，适配器模式（函数传参不同有不同]]></description><category></category></item><item><title><![CDATA[Retrofit 2.9.0 源码解析]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/122148560</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/122148560</guid><author>Rachel23333</author><pubDate>Sat, 25 Dec 2021 20:58:49 +0800</pubDate><description><![CDATA[Retrofit 2.9.0
1 Retrofit
 
1.1 retrofit介绍
A type-safe HTTP client for Android and Java. 一个安全类型的http请求的客户端。
底层网络请求是基于okhttp，retrofit对其进行了封装，提供了方便高效的网络访问框架
 
1.2 Retrofit 使用
1.2.1 简单使用
class RetrofitActivity : AppCompatActivity() {
    override fun onCreate]]></description><category></category></item><item><title><![CDATA[Android Studio登录github踩坑实录]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/121726877</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/121726877</guid><author>Rachel23333</author><pubDate>Sun, 05 Dec 2021 11:20:49 +0800</pubDate><description><![CDATA[Android Studio登录github踩坑实录
因为导入项目出现问题，重新安装了一次Android Studio
（如果下载不了SDK的问题，请先在本机完全卸载干净AS，再下载新的AS，不然下载SDK会出现无法勾选SDK版本（installed）的问题）
，导致重新登录github出现问题（查找资料很久都无法解决自己的问题），特此写博客记录一下，防止后续有人再次出现这种无聊问题谷歌很久无法解决。
问题一
点击add account，JetBrain 自动跳转界面。

点击 Authorize in G]]></description><category></category></item><item><title><![CDATA[OkHttp4.9.3源码解析]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/121708710</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/121708710</guid><author>Rachel23333</author><pubDate>Fri, 03 Dec 2021 22:53:57 +0800</pubDate><description><![CDATA[OkHttp4.9.3
okhttp内部逻辑流程图：

1. 整体结构

OkHttpClient
Request 和 Response
RealCall


OkHttpClient：核心管理类，所有内部逻辑和对象归OkHttpClient统一管理，由Builder构造器生成。
Request 和 Response：两个累完全符合http协议所定义的请求内容和响应内容

Request：发送请求封装类，包含url、method、headers、body
Response：返回结果，包含code、messa]]></description><category></category></item><item><title><![CDATA[LeetCode 300. 最长递增子序列]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/120061828</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/120061828</guid><author>Rachel23333</author><pubDate>Thu, 02 Sep 2021 15:10:08 +0800</pubDate><description><![CDATA[一、问题描述
给你一个整数数组 nums ，找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列，删除（或不删除）数组中的元素而不改变其余元素的顺序。例如，[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
二、测试数据
示例 1：
输入：nums = [10,9,2,5,3,7,101,18]
输出：4
解释：最长递增子序列是 [2,3,7,101]，因此长度为 4 。

示例 2：
输入：nums = [0,1,0,3,2,3]
输出：4

示例 3：
输入：nums =]]></description><category></category></item><item><title><![CDATA[Android 消息机制详解（源码分析ThreadLocal、Looper、Handler、AsyncTask）]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/120050720</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/120050720</guid><author>Rachel23333</author><pubDate>Wed, 01 Sep 2021 22:53:26 +0800</pubDate><description><![CDATA[Android 消息机制
1 概述
Android 的消息机制主要是指 Handler 的运行机制以及 Handler 所附带的 MessageQueue 和 Looper 的工作过程。
Android 应用是事件驱动的，每个事件都会转化为一个系统消息，即 Message 。消息中包含了事件相关的信息以及这个消息的处理人——Handler。每个进程中都有一个默认的消息队列（Message Queue，采用单链表的形式来存储消息列表），这个消息队列维护了一个待处理的消息列表，消息循环不断地从这个队列中取出消息]]></description><category></category></item><item><title><![CDATA[Binder跨进程机制]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/119921807</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/119921807</guid><author>Rachel23333</author><pubDate>Wed, 25 Aug 2021 23:32:13 +0800</pubDate><description><![CDATA[Binder跨进程机制
传统的跨进程通信方式有很多，比如 Socket、信号量、管道、内存共享、消息队列等，这些都存在于 Linux 中。
1 为什么要使用Binder？
性能方面
在移动设备上（性能受限制的设备，比如要省电），广泛地使用跨进程通信对通信机制的性能有严格的要求，Binder相对出传统的Socket方式，更加高效。Binder数据拷贝只需要一次，而管道、消息队列、Socket都需要2次，共享内存方式一次内存拷贝都不需要，但实现方式又比较复杂。
安全方面
传统的进程通信方式对于通信双方的身份并没]]></description><category></category></item><item><title><![CDATA[LeetCode 802. 找到最终的安全状态 [java实现]]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/119412734</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/119412734</guid><author>Rachel23333</author><pubDate>Thu, 05 Aug 2021 11:00:47 +0800</pubDate><description><![CDATA[一、问题描述
在有向图中，以某个节点为起始节点，从该点出发，每一步沿着图中的一条有向边行走。如果到达的节点是终点（即它没有连出的有向边），则停止。
对于一个起始节点，如果从该节点出发，无论每一步选择沿哪条有向边行走，最后必然在有限步内到达终点，则将该起始节点称作是 安全 的。
返回一个由图中所有安全的起始节点组成的数组作为答案。答案数组中的元素应当按 升序 排列。
该有向图有 n 个节点，按 0 到 n - 1 编号，其中 n 是 graph 的节点数。图以下述形式给出：graph[i] 是编号 j 节点的]]></description><category></category></item><item><title><![CDATA[LeetCode 743. 网络延迟时间 [java实现]]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/119327585</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/119327585</guid><author>Rachel23333</author><pubDate>Mon, 02 Aug 2021 16:11:48 +0800</pubDate><description><![CDATA[一、问题描述
有 n 个网络节点，标记为 1 到 n。
给你一个列表 times，表示信号经过 有向 边的传递时间。 times[i] = (ui, vi, wi)，其中 ui 是源节点，vi 是目标节点， wi 是一个信号从源节点传递到目标节点的时间。
现在，从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号？如果不能使所有节点收到信号，返回 -1 。
 
二、测试数据
示例 1：
输入：times = [[2,1,1],[2,3,1],[3,4,1]], n = 4, k = 2
输出：2
]]></description><category></category></item><item><title><![CDATA[Android设计模式——单例模式]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/119300529</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/119300529</guid><author>Rachel23333</author><pubDate>Sun, 01 Aug 2021 17:12:24 +0800</pubDate><description><![CDATA[单例模式
单例类（Singleton）
实现单例模式关键点：

构造函数私有
通过一个静态方法或枚举返回单例类对象
确保单例类的对象有且仅有一个，特别在多线程环境下
确保单例类对象在反序列化时不会重新构建对象 [ 1-4 方式都会在被反序列化时重新生成对象，必须加上如下方法：]  但枚举方法不存在这种问题。

private Object readResolve() throws ObjectStreamException{
    return sInstance; //返回现有对象，而不是默认重新生成
]]></description><category></category></item><item><title><![CDATA[LeetCode 1104. 二叉树寻路 [java实现]]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/119212548</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/119212548</guid><author>Rachel23333</author><pubDate>Thu, 29 Jul 2021 15:29:25 +0800</pubDate><description><![CDATA[一、问题描述
在一棵无限的二叉树上，每个节点都有两个子节点，树中的节点 逐行 依次按 “之” 字形进行标记。
如下图所示，在奇数行（即，第一行、第三行、第五行……）中，按从左到右的顺序进行标记；
而偶数行（即，第二行、第四行、第六行……）中，按从右到左的顺序进行标记。
给你树上某一个节点的标号 label，请你返回从根节点到该标号为 label 节点的路径，该路径是由途经的节点标号所组成的。
 
二、测试数据
示例 1：
输入：label = 14
输出：[1,3,4,14]

示例 2：
输入：label]]></description><category></category></item><item><title><![CDATA[LeetCode 863. 二叉树中所有距离为 K 的结点 [java实现]]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/119182984</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/119182984</guid><author>Rachel23333</author><pubDate>Wed, 28 Jul 2021 16:11:24 +0800</pubDate><description><![CDATA[一、问题描述
给定一个二叉树（具有根结点 root）， 一个目标结点 target ，和一个整数值 K 。
返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。
   
二、测试数据
示例 1：
输入：root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2
输出：[7,4,1]
解释：
所求结点为与目标结点（值为 5）距离为 2 的结点，
值分别为 7，4，以及 1

注意，输入的 "root" 和 "target]]></description><category></category></item><item><title><![CDATA[LeetCode 1713. 得到子序列的最少操作次数 [java实现]]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/119104957</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/119104957</guid><author>Rachel23333</author><pubDate>Mon, 26 Jul 2021 10:53:09 +0800</pubDate><description><![CDATA[一、问题描述
给你一个数组 target ，包含若干 互不相同 的整数，以及另一个整数数组 arr ，arr 可能 包含重复元素。
每一次操作中，你可以在 arr 的任意位置插入任一整数。比方说，如果 arr = [1,4,1,2] ，那么你可以在中间添加 3 得到 [1,4,**3**,1,2] 。你可以在数组最开始或最后面添加整数。
请你返回 最少 操作次数，使得 target 成为 arr 的一个子序列。
一个数组的 子序列 指的是删除原数组的某些元素（可能一个元素都不删除），同时不改变其余元素的相对]]></description><category></category></item><item><title><![CDATA[LeetCode 1743. 从相邻元素对还原数组 [java实现]]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/119081407</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/119081407</guid><author>Rachel23333</author><pubDate>Sun, 25 Jul 2021 14:14:47 +0800</pubDate><description><![CDATA[一、问题描述
存在一个由 n 个不同元素组成的整数数组 nums ，但你已经记不清具体内容。好在你还记得 nums 中的每一对相邻元素。
给你一个二维整数数组 adjacentPairs ，大小为 n - 1 ，其中每个 adjacentPairs[i] = [ui, vi] 表示元素 ui 和 vi 在 nums 中相邻。
题目数据保证所有由元素 nums[i] 和 nums[i+1] 组成的相邻元素对都存在于 adjacentPairs 中，存在形式可能是 [nums[i], nums[i+1]] ，也]]></description><category></category></item><item><title><![CDATA[java 泛型笔记]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/118945974</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/118945974</guid><author>Rachel23333</author><pubDate>Tue, 20 Jul 2021 22:17:29 +0800</pubDate><description><![CDATA[泛型
泛型，又称参数化类型
泛型类并没有自己独有的 Class 类对象。比如：并不存在 List&lt;Object&gt;.class 或是 List&lt;Interger&gt;.class，Java 编译器会将二者都视为 List.class。
泛型一些约定俗成的命名：

E - Element
K - Key
N - Number
T - Type
V - Value
T - 类型，主要用于表示第一类通用型参数。
S - 类型，主要用于表示第二类通用类型参数。
U - 类型，主要用于表示第三类通用]]></description><category></category></item><item><title><![CDATA[LeetCode 1838. 最高频元素的频数 [java实现]]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/118900697</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/118900697</guid><author>Rachel23333</author><pubDate>Mon, 19 Jul 2021 16:26:21 +0800</pubDate><description><![CDATA[一、问题描述
元素的 频数 是该元素在一个数组中出现的次数。
给你一个整数数组 nums 和一个整数 k 。在一步操作中，你可以选择 nums 的一个下标，并将该下标对应元素的值增加 1 。
执行最多 k 次操作后，返回数组中最高频元素的 最大可能频数 。
   
二、测试数据
示例 1：
输入：nums = [1,2,4], k = 5
输出：3
解释：对第一个元素执行 3 次递增操作，对第二个元素执 2 次递增操作，此时 nums = [4,4,4] 。
4 是数组中最高频元素，频数是 3 。

 
示]]></description><category></category></item><item><title><![CDATA[LeetCode 面试题 10.02. 变位词组 [java实现]]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/118880046</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/118880046</guid><author>Rachel23333</author><pubDate>Sun, 18 Jul 2021 17:24:13 +0800</pubDate><description><![CDATA[一、问题描述
编写一种方法，对字符串数组进行排序，将所有变位词组合在一起。变位词是指字母相同，但排列不同的字符串。
 
二、测试数据
示例 1：
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

提示：
所有输入均为小写字母。
不考虑答案输出的顺序。

 
三、解题思路

利用 HashMap 键值对存储区分字符串  HashMap&lt;Str]]></description><category></category></item><item><title><![CDATA[LeetCode 53. 最大子序和 [java实现]]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/118857506</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/118857506</guid><author>Rachel23333</author><pubDate>Sat, 17 Jul 2021 15:34:11 +0800</pubDate><description><![CDATA[一、问题描述
给定一个整数数组 nums ，找到一个具有最大和的连续子数组（子数组最少包含一个元素），返回其最大和。
 
二、测试数据
示例 1：
输入：nums = [-2,1,-3,4,-1,2,1,-5,4]
输出：6
解释：连续子数组 [4,-1,2,1] 的和最大，为 6 。

示例 2：
输入：nums = [1]
输出：1

提示：
1 &lt;= nums.length &lt;= 3 * 104
-105 &lt;= nums[i] &lt;= 105

 
三、解题思路


贪心算法：
]]></description><category></category></item><item><title><![CDATA[LeetCode 剑指 Offer 53 - I. 在排序数组中查找数字 I [java实现]]]></title><link>https://blog.youkuaiyun.com/Rachel23333/article/details/118811481</link><guid>https://blog.youkuaiyun.com/Rachel23333/article/details/118811481</guid><author>Rachel23333</author><pubDate>Fri, 16 Jul 2021 17:33:34 +0800</pubDate><description><![CDATA[一、问题描述
统计一个数字在排序数组中出现的次数。
 
二、测试数据
示例 1：
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2

示例 2：
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0

提示：
0 &lt;= 数组长度 &lt;= 50000

 
三、解题思路
​	利用 二分查找

找到最左边符合要求的位序
找到最右边符合要求的位序

//找到最左边符合要求的位序
	public int binarySearchFin]]></description><category></category></item></channel></rss>