<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[huidev的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/huidev</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; huidev]]></copyright><item><title><![CDATA[SparseArray 理解]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/120814145</link><guid>https://blog.youkuaiyun.com/huidev/article/details/120814145</guid><author>huidev</author><pubDate>Sun, 17 Oct 2021 19:22:14 +0800</pubDate><description><![CDATA[一、介绍

SparseArray(稀疏数组) ； Android内部特有的api ； SparseArray更节省内存空间；

android 提供的数据结构， 功能类似HashMap ； 与map不同的是key 只能是int ；



二、使用


SparseArray&lt;Object&gt; sparseArray = new SparseArray&lt;&gt;(0);
        sparseArray.put(0,null);
        sparseArray.put(1,"a]]></description><category></category></item><item><title><![CDATA[阻塞队列LinkedBlockingQueue]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/103874044</link><guid>https://blog.youkuaiyun.com/huidev/article/details/103874044</guid><author>huidev</author><pubDate>Tue, 07 Jan 2020 19:37:15 +0800</pubDate><description><![CDATA[阻塞队列LinkedBlockingQueue 与平常接触的LinkedList 的最大不同之处就是LinkedBlockingQueue 支持阻塞添加与阻塞删除方法。

阻塞添加


阻塞添加是指当队列满时，阻塞加入线程，直到不满时才唤醒阻塞线程，才能执行加入操作。

阻塞删除


阻塞删除是指当队列为空时，阻塞删除线程，直到不为空才唤醒阻塞线程，才能执行删除操作。

由此可见这不就是生产者消费...]]></description><category></category></item><item><title><![CDATA[线程池原理]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/103801198</link><guid>https://blog.youkuaiyun.com/huidev/article/details/103801198</guid><author>huidev</author><pubDate>Mon, 06 Jan 2020 11:37:33 +0800</pubDate><description><![CDATA[多线程是开发常用的技术，Android 开发更是对UI 线程进行了限制，耗时操作必须放到子线程，new Thread 很简单就创建了一个子线程，但如果大型项目，很多地方都new Thread ，那么有一个问题就是我们将无法管理我的线程，大量的创建线程，占用过多资源，而且它们之间也会相互竞争，还有就是创建线程与线程执行完的销毁操作都是一部分系统开销。所以引入线程池很有意义。

描述

...]]></description><category></category></item><item><title><![CDATA[插件化学习之Hook 是怎么回事]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/103422252</link><guid>https://blog.youkuaiyun.com/huidev/article/details/103422252</guid><author>huidev</author><pubDate>Fri, 06 Dec 2019 20:21:34 +0800</pubDate><description><![CDATA[最近在学插件化的东西，插件化提到了一个Hook 技术，发现Hook 这个词什么意思都不知道，经过研究学习后有了一定的理解，这里做一下对Hook 理解的笔记。

下面通过一个例子来理解Hook ，启动一个没有在AndroidManifest.xml 注册的Activity；

我们知道Android 的Activity 是需要在AndroidManifest.xml 注册的，如果没注册是不能创建成功...]]></description><category></category></item><item><title><![CDATA[Android 8.0 Activity 启动流程]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/103362598</link><guid>https://blog.youkuaiyun.com/huidev/article/details/103362598</guid><author>huidev</author><pubDate>Tue, 03 Dec 2019 17:55:34 +0800</pubDate><description><![CDATA[从Activity 的启动流程不仅可以更加的熟悉Activity 的相关知识点，还可以学习架构设计的思想，设计模式，大型项目代码结构。。，所以Activity 启动流程还是很值得看一看的。

在应用层调用startActivity 后，会经过一系列的调用，经过进程间通信（IPC），调用到ActivityManagerService （AMS）的startActivity 方法，这样程序走到了系统服...]]></description><category></category></item><item><title><![CDATA[插件化基础知识（反射，动态代理，类加载器）]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/103335969</link><guid>https://blog.youkuaiyun.com/huidev/article/details/103335969</guid><author>huidev</author><pubDate>Sun, 01 Dec 2019 23:08:43 +0800</pubDate><description><![CDATA[Java 反射

获得Class对象

获取类的构造函数

调用类的私有方法

获取类的私有字段并修改值

代理

静态代理

动态代理

动态代理的简单应用

类加载器

类加载器分类

双亲委派模型

几个重要函数

自定义ClassLoader

Android 类加载器

PathClassLoader

DexClassLoader

Java 反射

Java 反射机制在程序运行时，对...]]></description><category></category></item><item><title><![CDATA[Wireshark 抓包，TCP 的连接与断开]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/103030017</link><guid>https://blog.youkuaiyun.com/huidev/article/details/103030017</guid><author>huidev</author><pubDate>Tue, 12 Nov 2019 17:10:50 +0800</pubDate><description><![CDATA[Wireshark是一个网络封包分析软件。帮你撷取网络封包，并尽可能显示出最为详细的网络封包资料。

Wireshark 可以获取HTTP，也能获取HTTPS，但是不能解密HTTPS，只能帮你捕获包，没有密钥是看不懂HTTPS 的，HTTPS 可以使用Charles 。Https 抓包。

直接网上下载安装Wireshark ，打开界面如下，



双击后开始抓包



你会发现Wireshar...]]></description><category></category></item><item><title><![CDATA[Https 及抓包]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/102961776</link><guid>https://blog.youkuaiyun.com/huidev/article/details/102961776</guid><author>huidev</author><pubDate>Fri, 08 Nov 2019 16:01:42 +0800</pubDate><description><![CDATA[Https相关概念

什么是SSL/TLS协议？

加密相关的概念

对称加密

非对称加密

散列函数Hash（摘要算法）

数字签名

TLS握手过程

Client Hello

Server Hello

Certificate(Server)

Server Key Exchange

Certificate Request

Server Hello Done

Certificat...]]></description><category></category></item><item><title><![CDATA[Java 算法题笔记（十一）]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/102214608</link><guid>https://blog.youkuaiyun.com/huidev/article/details/102214608</guid><author>huidev</author><pubDate>Sun, 06 Oct 2019 10:34:42 +0800</pubDate><description><![CDATA[和为s 的两个数

输入一个递增排序的数组和一个数字s，在数组中查找两个数，得它们的和正好是s。如果有多对数字的和等于s，输出任意一对即可。

举例说明

例如输入数组｛1 、2 、4、7 、11 、15 ｝和数字15. 由于4+ 11 = 15 ，因此输出4 和11 。

暴力破解当然可以，但是考虑到数组有序为递增的，所以要用一下这个条件，更好。


public static List&lt;...]]></description><category></category></item><item><title><![CDATA[Java 算法题笔记（十）全排列相关]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/100974125</link><guid>https://blog.youkuaiyun.com/huidev/article/details/100974125</guid><author>huidev</author><pubDate>Wed, 18 Sep 2019 10:18:18 +0800</pubDate><description><![CDATA[Leecode17. 电话号码的字母组合



参考题解：https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/solution/dian-hua-hao-ma-de-zi-mu-zu-he-by-leetcode/


class Solution {

//    感觉做这个题substring 方法要...]]></description><category></category></item><item><title><![CDATA[git 命令使用]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/90668261</link><guid>https://blog.youkuaiyun.com/huidev/article/details/90668261</guid><author>huidev</author><pubDate>Wed, 29 May 2019 15:25:43 +0800</pubDate><description><![CDATA[git status 查看状态


On branch master    // 你目前在哪个分支
Your branch is up to date with 'origin/master'.    // 你最新的分支是'origin/master'

nothing to commit, working tree clean    // 没有什么课提交的，工作树是干净的

查看状态有更改的情...]]></description><category></category></item><item><title><![CDATA[Java 算法题笔记（九）]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/89928142</link><guid>https://blog.youkuaiyun.com/huidev/article/details/89928142</guid><author>huidev</author><pubDate>Tue, 07 May 2019 20:11:40 +0800</pubDate><description><![CDATA[买卖股票的最佳时机

给定一个数组，它的第i个元素是一支给定股票第i天的价格。

如果你最多只允许完成一笔交易（即买入和卖出一支股票），设计一个算法来计算你所能获取的最大利润。

注意你不能在买入股票前卖出股票。

示例 1:


输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天（股票价格 = 1）的时候买入，在第 5 天（股票价格 = 6）的时候卖出，最大利润 = ...]]></description><category></category></item><item><title><![CDATA[气泡样式的自定义View]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/89816565</link><guid>https://blog.youkuaiyun.com/huidev/article/details/89816565</guid><author>huidev</author><pubDate>Sat, 04 May 2019 19:09:45 +0800</pubDate><description><![CDATA[自己学习自定义View 画了一个简单的自定义View ，做一下笔记。


public class BubbleView extends View {

    private Paint mPaint;
    private Path path;


    // 默认定义圆角为80 个像素点，后期可以考虑加到属性里
    private int corner = 80;

    pub...]]></description><category></category></item><item><title><![CDATA[归并排序]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/89787098</link><guid>https://blog.youkuaiyun.com/huidev/article/details/89787098</guid><author>huidev</author><pubDate>Fri, 03 May 2019 14:38:43 +0800</pubDate><description><![CDATA[private void mergeSort(int[] arr,int start,int end){
        if (start &lt; end){
            int mid = (start + end) / 2; // 划分子序列

            mergeSort(arr,start,mid); // 对左侧子序列进行拆分
            me...]]></description><category></category></item><item><title><![CDATA[生产者消费者]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/89785404</link><guid>https://blog.youkuaiyun.com/huidev/article/details/89785404</guid><author>huidev</author><pubDate>Fri, 03 May 2019 11:11:49 +0800</pubDate><description><![CDATA[之前看博客学了一种生产者消费者的写法，做一下笔记，以便回顾，因为感觉自己还没有很好的吸收。

可以有多个生产与多个消费，LinkedList就像一个仓库容器，生产者往里加，消费者往外拿，只要没到满或空，就会这样进行下去，直到停止程序；

如果满了，生产者进行等待（说明生产的太快了，可以歇会了），消费者进行消费后会通知它，它再干活。

如果空了，消费者进行等待（说明消费的太快了，消费完了，没得消...]]></description><category></category></item><item><title><![CDATA[二叉树的坡度]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/89647022</link><guid>https://blog.youkuaiyun.com/huidev/article/details/89647022</guid><author>huidev</author><pubDate>Sun, 28 Apr 2019 22:10:02 +0800</pubDate><description><![CDATA[给定一个二叉树，计算整个树的坡度。

一个树的节点的坡度定义即为，该节点左子树的结点之和和右子树结点之和的差的绝对值。空结点的的坡度是0。

整个树的坡度就是其所有节点的坡度之和。

示例:


输入: 
         1
       /   \
      2     3
输出: 1
解释: 
结点的坡度 2 : 0
结点的坡度 3 : 0
结点的坡度 1 : |2-3| = 1
树的坡度...]]></description><category></category></item><item><title><![CDATA[二叉树的层平均值]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/89637599</link><guid>https://blog.youkuaiyun.com/huidev/article/details/89637599</guid><author>huidev</author><pubDate>Sun, 28 Apr 2019 14:36:12 +0800</pubDate><description><![CDATA[给定一个非空二叉树, 返回一个由每层节点平均值组成的数组.

示例 1:


输入:
    3
   / \
  9  20
    /  \
   15   7
输出: [3, 14.5, 11]
解释:
第0层的平均值是 3,  第1层是 14.5, 第2层是 11. 因此返回 [3, 14.5, 11].


这个特别像二叉树的广度优先遍历，如果忘了可以看看Java 二叉树，深度优先遍历，...]]></description><category></category></item><item><title><![CDATA[修剪二叉搜索树]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/89636825</link><guid>https://blog.youkuaiyun.com/huidev/article/details/89636825</guid><author>huidev</author><pubDate>Sun, 28 Apr 2019 14:19:17 +0800</pubDate><description><![CDATA[给定一个二叉搜索树，同时给定最小边界L和最大边界R。通过修剪二叉搜索树，使得所有节点的值在[L, R]中 (R&gt;=L) 。你可能需要改变树的根节点，所以结果应当返回修剪好的二叉搜索树的新的根节点。

示例 1:


输入: 
    1
   / \
  0   2

  L = 1
  R = 2

输出: 
    1
      \
       2


示例 2:


输入: 
...]]></description><category></category></item><item><title><![CDATA[把二叉搜索树转换为累加树]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/89634099</link><guid>https://blog.youkuaiyun.com/huidev/article/details/89634099</guid><author>huidev</author><pubDate>Sun, 28 Apr 2019 13:45:26 +0800</pubDate><description><![CDATA[给定一个二叉搜索树（Binary Search Tree），把它转换成为累加树（Greater Tree)，使得每个节点的值是原来的节点值加上所有大于它的节点值之和。

例如：


输入: 二叉搜索树:
              5
            /   \
           2     13

输出: 转换为累加树:
             18
            /  ...]]></description><category></category></item><item><title><![CDATA[叶子相似的树]]></title><link>https://blog.youkuaiyun.com/huidev/article/details/89633712</link><guid>https://blog.youkuaiyun.com/huidev/article/details/89633712</guid><author>huidev</author><pubDate>Sun, 28 Apr 2019 11:01:51 +0800</pubDate><description><![CDATA[请考虑一颗二叉树上所有的叶子，这些叶子的值按从左到右的顺序排列形成一个叶值序列。



举个例子，如上图所示，给定一颗叶值序列为(6, 7, 4, 9, 8)的树。

如果有两颗二叉树的叶值序列是相同，那么我们就认为它们是叶相似的。

如果给定的两个头结点分别为root1和root2的树是叶相似的，则返回true；否则返回false。

思路：深度优先搜索，递归，找到叶子...]]></description><category></category></item></channel></rss>