<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[chenliguan的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/chenliguan</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; chenliguan]]></copyright><item><title><![CDATA[Java多线程之如何写出线程安全的程序?]]></title><link>https://blog.csdn.net/chenliguan/article/details/110688852</link><guid>https://blog.csdn.net/chenliguan/article/details/110688852</guid><author>chenliguan</author><pubDate>Sat, 05 Dec 2020 16:45:40 +0800</pubDate><description><![CDATA[1 如何写出线程安全的程序?
答：
1.1 这道题想考察什么?
答：（1）考察要点
●是否对线程安全有初步了解(初级)
●是否对线程安全的产生原因有思考；是否知道final、volatile关键字的作用；是否清楚1.5之前JavaDCL为什么有缺陷(中级)
●是否清楚的知道如何编写线程安全的程序；是否对hreadLocal的使用注意事项有认识(高级)
（2）题目剖析
●如何写出线程安全的程序？
●什么是线程安全？如何实现线程安全？
2 什么是线程安全？
答：本质是可变资源（内存）线程间共享的问题，关键是：可]]></description><category></category></item><item><title><![CDATA[Java多线程之如何停止一个线程?]]></title><link>https://blog.csdn.net/chenliguan/article/details/110325209</link><guid>https://blog.csdn.net/chenliguan/article/details/110325209</guid><author>chenliguan</author><pubDate>Sun, 29 Nov 2020 16:35:53 +0800</pubDate><description><![CDATA[1 如何停止一个线程?
答：
1.1 这道题想考察什么?
答：（1）考察要点
●是否对线程的用法有了解；是否对线程的stop方法有了解(初级)
●是否对线程stop过程中存在的问题有认识；是否熟悉interrupt中断的用法(中级)
●是否能解释清楚使用boolean标志位的好处；是否知道interrupt底层的细节(高级)
●通过该题目能够转移话题到线程安全，并阐述无误(高级)
（2）题目剖析
●如何停止一个线程?
●官方停止线程的方法被废弃，所以不能直接简单的停止线程？如何设计可以随时被中断而取消的任务]]></description><category></category></item><item><title><![CDATA[Android进阶之深入理解Activity的onActivityResult]]></title><link>https://blog.csdn.net/chenliguan/article/details/110151385</link><guid>https://blog.csdn.net/chenliguan/article/details/110151385</guid><author>chenliguan</author><pubDate>Wed, 25 Nov 2020 23:54:14 +0800</pubDate><description><![CDATA[1 Activity的onActivityResult使用起来非常麻烦，为什么不设计成回调?
答：
答：我觉得这是一个很有趣的问题，有趣的除了题目本身，也在于其引申出的感悟。我们在使用和学习Android Framework相关的内容时，除了要了解其内部实现机制，还要求自己要试着去反思，或者提问其设计的目的，这样才能帮助我们更好的理解和吸收其设计的精髓之处。
1.1 这道题想考察什么?
答：（1）考察要点
●是否熟悉onActivityResult的用法(初级)
●是否思考过用回调替代onActivityR]]></description><category></category></item><item><title><![CDATA[Java进阶之深入理解泛型的实现机制]]></title><link>https://blog.csdn.net/chenliguan/article/details/110007427</link><guid>https://blog.csdn.net/chenliguan/article/details/110007427</guid><author>chenliguan</author><pubDate>Mon, 23 Nov 2020 21:39:04 +0800</pubDate><description><![CDATA[1 Java泛型的实现机制是怎样的?
答：
1.1 这道题想考察什么?
答：（1）考察要点
●对Java泛型使用是否仅停留在集合框架的使用(初级)
●对Java泛型的实现机制的认知和理解(中级)
●是否有足够的项目开发实战和“踩坑”经验(中级)
●对泛型(或模板)编程是否有深入的对比研究(高级)
●对常见的框架原理是否有过深入剖析(高级)
（2）题目剖析
●题目区分度非常大
●回答需要提及以下几点才能显得有亮点:
①类型擦除从编译角度的细节；
②类型擦除对运行时的影响；
③类型擦除对反射的影响；
④对比类型]]></description><category></category></item><item><title><![CDATA[Java进阶之深入理解方法分派]]></title><link>https://blog.csdn.net/chenliguan/article/details/109893206</link><guid>https://blog.csdn.net/chenliguan/article/details/109893206</guid><author>chenliguan</author><pubDate>Sat, 21 Nov 2020 11:27:19 +0800</pubDate><description><![CDATA[1 怎么理解Java的方法分派？
1.1 这道题想考察什么?
●多态、虚方法表的认识(初级)
●对编译和运行时的理解和认识(中级)
●对Java语言规范和运行机制的深入认识(高级)
横向对比各类语言的能力(高级)
●Groovy , Gradle DSL 5.0以前唯一正式语言
●C++ , Native程序开发必备
●就是确定调用谁的、哪个方法
●针对方法重载的情况进行分析
●针对方法覆写的情况进行分析
答：

...]]></description><category></category></item><item><title><![CDATA[Java进阶之深入理解内部类的本质]]></title><link>https://blog.csdn.net/chenliguan/article/details/109786036</link><guid>https://blog.csdn.net/chenliguan/article/details/109786036</guid><author>chenliguan</author><pubDate>Wed, 18 Nov 2020 22:04:01 +0800</pubDate><description><![CDATA[1 内部类
1.1 什么是内部类？
答：类都对应于一个独立的Java源文件，但一个类还可以放在另一个类的内部，称之为内部类，相对而言，包含它的类称之为外部类。不过，内部类只是Java编译器的概念，对于Java虚拟机，它是不知道内部类这回事的，每个内部类最后都会被编译为一个独立的类，生成一个独立的字节码文件。
1.2 为什么放到别的类内部呢？
答：内部类与包含它的外部类有比较密切的关系，而与其他类关系不大，定义在类内部，可以实现对外部完全隐藏，可以有更好的封装性，代码实现上也往往更为简洁。
1.3 内部类有什]]></description><category></category></item><item><title><![CDATA[算法刻意练习之字KMP算法]]></title><link>https://blog.csdn.net/chenliguan/article/details/109728582</link><guid>https://blog.csdn.net/chenliguan/article/details/109728582</guid><author>chenliguan</author><pubDate>Mon, 16 Nov 2020 21:59:00 +0800</pubDate><description><![CDATA[1 特点
（1）KMP

（2）核心：KMP算法的想法是，设法利用这个已知信息，不要把"搜索位置"移回已经比较过的位置，继续把它向后移，这样就提高了效率。
2 举例分析
有一个字符串"BBC ABCDAB ABCDABCDABDE"，我想知道，里面是否包含另一个字符串"ABCDABD"？
2.1 《部分匹配表》是如何产生的
（1）“前缀"和"后缀”。 "前缀"指除了最后一个字符以外，一个字符串的全部头部组合；"后缀"指除了第一个字符以外，一个字符串的全部尾部组合。
（2）"部分匹配值"就是"前缀"和"后缀"]]></description><category></category></item><item><title><![CDATA[算法刻意练习之动态规划]]></title><link>https://blog.csdn.net/chenliguan/article/details/109706198</link><guid>https://blog.csdn.net/chenliguan/article/details/109706198</guid><author>chenliguan</author><pubDate>Sun, 15 Nov 2020 17:05:06 +0800</pubDate><description><![CDATA[1 特点
1.1 动态规划和递归或者分治没有根本上的区别（关键看有无最优的子结构)
1.共性:找到重复子问题；
2.差异性:最优子结构、中途可以淘太欠优解；
1.2 递归问题一含有重疊的子问题，操作重复
1.记忆化搜索(自顶而下)；
2.动态规划(自底而上)；
1.3 常识
一般求解最值的问题都可以朝着动态规划的方向去想。
2 关键点：
 1.根据最优子结构定义状态：dp[n] = bestOf(dp[n-1], dp[n-2], ...)
 2.递推状态转移方程（DP方程）
   一维：dp[i] = d]]></description><category></category></item><item><title><![CDATA[算法刻意练习之位运算]]></title><link>https://blog.csdn.net/chenliguan/article/details/109704737</link><guid>https://blog.csdn.net/chenliguan/article/details/109704737</guid><author>chenliguan</author><pubDate>Sun, 15 Nov 2020 15:41:52 +0800</pubDate><description><![CDATA[1 位运算
1.1 为什么需要位运算

1.2 位运算符


1.3 算数移位与逻辑移位


1.4 位运算的应用（核心）


]]></description><category></category></item><item><title><![CDATA[算法刻意练习之布隆过滤器/LRU Cache]]></title><link>https://blog.csdn.net/chenliguan/article/details/109704463</link><guid>https://blog.csdn.net/chenliguan/article/details/109704463</guid><author>chenliguan</author><pubDate>Sun, 15 Nov 2020 15:28:10 +0800</pubDate><description><![CDATA[1 LRU Cache
1.1 特点

1.2 工作原理

1.3 替换策略

1.4 模板
/**
 * 哈希表 + 双向链表：一个哈希表和一个双向链表维护所有在缓存中的键值对
 *
 * 双向链表按照被使用的顺序存储了这些键值对，靠近头部的键值对是最近使用的，而靠近尾部的键值对是最久未使用的。
 * 哈希表即为普通的哈希映射（HashMap），通过缓存数据的键映射到其在双向链表中的位置。
 *
 * 思路：
 * 1.用字典来存储 key-value 结构，这样对于查找操作时间复杂度就是 O(1)；
 ]]></description><category></category></item><item><title><![CDATA[算法刻意练习之字典树/并查集]]></title><link>https://blog.csdn.net/chenliguan/article/details/109701545</link><guid>https://blog.csdn.net/chenliguan/article/details/109701545</guid><author>chenliguan</author><pubDate>Sun, 15 Nov 2020 11:50:39 +0800</pubDate><description><![CDATA[1 字典树
1.1 特点
又叫Trie树、前缀树（Prefix Tree）、单词查找树或键树，是一种多叉树结构
1.2 对比树、二叉搜索树
（1）树

（2）二叉搜索树

1.3 基本结构
（1）基本结构

（2）真实的字典树

上图是一棵Trie树，表示了关键字集合{“a”, “to”, “tea”, “ted”, “ten”, “i”, “in”, “inn”} 。从上图可以归纳出Trie树的基本性质。
1.4 基本性质

1.5 核心思想
1.6 场景
（1）搜索前缀匹配、字符串检索、词频统计、字符串]]></description><category></category></item><item><title><![CDATA[Java进阶之深入理解Char]]></title><link>https://blog.csdn.net/chenliguan/article/details/109169791</link><guid>https://blog.csdn.net/chenliguan/article/details/109169791</guid><author>chenliguan</author><pubDate>Mon, 19 Oct 2020 22:05:55 +0800</pubDate><description><![CDATA[1 byte[]中的Unicode码
（1）Unicode码中的ASCII 码

（2）Unicode码中的非 ASCII 编码。简体中文汉字编码方式：GB2312编码等
Unicode码 26007 对应的字符为 斗
Unicode码 32599 对应的字符为 罗

（3）char[] 转换为byte[]


2 1字节=1byte=8bit=8位二进制；1int=4字节=32bit
bit又名比特、位，简称b，是计算机硬盘中的最小存储单位，是二进制中的一个数位“0”或数位“1”。
ASCII码值就是用一]]></description><category></category></item><item><title><![CDATA[Android系统分析之带着问题看事件分发机制]]></title><link>https://blog.csdn.net/chenliguan/article/details/108697138</link><guid>https://blog.csdn.net/chenliguan/article/details/108697138</guid><author>chenliguan</author><pubDate>Sun, 20 Sep 2020 19:32:49 +0800</pubDate><description><![CDATA[1 讲讲Android的事件分发机制？
答：
3 简述事件传递的流程
答：
2 为什么会有事件分发机制?
答：
3 ViewGroup的事件分发涉及到哪些过程和方法？
答：
3 View中为什么会有dispatchTouchEvent方法，它存在的意义是什么？
答：
3 View中为什么没有onInterceptTouchEvent事件拦截方法？
答：
3 用伪代码表示ViewGroup的事件分发过程并解释？
答：
3 ViewGroup和View同时注册了事件监听器(onClick等)，哪个会执行?
答：]]></description><category></category></item><item><title><![CDATA[算法刻意练习之二分查找]]></title><link>https://blog.csdn.net/chenliguan/article/details/108687567</link><guid>https://blog.csdn.net/chenliguan/article/details/108687567</guid><author>chenliguan</author><pubDate>Sun, 20 Sep 2020 00:00:53 +0800</pubDate><description><![CDATA[1 三个前提条件
1. 目标函数单调性（单调递增或者递减）。二分的数据必须是有序的，这样可以通过它的某些特征排除掉比如说 前半部分 或 后半部分；
2. 存在上下界（bounded）；
3. 能够通过索引访问（index accessible)；
2 代码模板
public int binarySearch(int[] array, int target) {
    int left = 0, right = array.length - 1, mid;
    while (left &lt;= rig]]></description><category></category></item><item><title><![CDATA[算法刻意练习之DFS/BFS/双向BFS/剪枝]]></title><link>https://blog.csdn.net/chenliguan/article/details/108687427</link><guid>https://blog.csdn.net/chenliguan/article/details/108687427</guid><author>chenliguan</author><pubDate>Sat, 19 Sep 2020 23:38:59 +0800</pubDate><description><![CDATA[1 搜索
1.1 特点
（1）如果遍历的数据结构本身没有任何特点，就遍历所有的节点，同时保证

每个点访问一次，
且仅访问一次
最后找到结果

（2）对于节点的访问顺序不限，可分为

深度优先  depth first search
广度优先 breadth first search

（3） 在树（图/状态集）中寻找特定结点
public class TreeNode { 
	public int val; 
	public TreeNode left, right; 
	public TreeNode(]]></description><category></category></item><item><title><![CDATA[算法刻意练习之堆/二叉堆]]></title><link>https://blog.csdn.net/chenliguan/article/details/108570843</link><guid>https://blog.csdn.net/chenliguan/article/details/108570843</guid><author>chenliguan</author><pubDate>Mon, 14 Sep 2020 00:15:36 +0800</pubDate><description><![CDATA[1 堆 Heap
1.1 特点
（1）递归 - 循环，通过函数体来进行的循环；
（2）盗梦空间的梦境
1.2 递归状态树
（1）示例
2 二叉堆 Binary Heap
2.1 特点
（1）递归 - 循环，通过函数体来进行的循环；
（2）盗梦空间的梦境
2.2 递归状态树
（1）示例

...]]></description><category></category></item><item><title><![CDATA[算法刻意练习之递归/分治/回溯/贪心算法]]></title><link>https://blog.csdn.net/chenliguan/article/details/108570125</link><guid>https://blog.csdn.net/chenliguan/article/details/108570125</guid><author>chenliguan</author><pubDate>Mon, 14 Sep 2020 00:00:10 +0800</pubDate><description><![CDATA[1 递归（Recursion）
1.1 特点
（1）递归 - 循环，通过函数体来进行的循环；
（2）盗梦空间的梦境

1.2 递归状态
（1）示例

1.4 递归思维要点
（1）不要人肉进行递归（最大误区），初学者可以在纸上画出递归的状态树，慢慢熟练之后一定要抛弃这样的习惯。一定要记住：直接看函数本身开始写即可。否则，永远没办法掌握、熟练使用递归；
（2）找到最近最简的方法，将其拆解成可重复解决的问题（找最近重复子问题）。原因是我们写的程序的指令，只包括 if else 、 for 和 while loop]]></description><category></category></item><item><title><![CDATA[算法刻意练习之树/二叉树/二叉搜索树/AVL树和红黑树]]></title><link>https://blog.csdn.net/chenliguan/article/details/108557237</link><guid>https://blog.csdn.net/chenliguan/article/details/108557237</guid><author>chenliguan</author><pubDate>Sun, 13 Sep 2020 00:29:45 +0800</pubDate><description><![CDATA[1 树 Tree
1.1 特点
（1）树 Tree：
1.2 演示
（1）示例

2 二叉树 Binary Tree
2.1 特点
（1）二叉树 Binary Tree：
2.2 演示
（1）构造

（2）示例

（3）分类


2.3 二叉树遍历
（1）前序遍历( Pre-order ) : 根 - 左 - 右；
（2）中序遍历( In-order ) : 左 - 根 - 右；
（3）后序遍历( Post-order ) : 左 - 右 - 根；
（4）模板

3 图 Graph
3.1 特点
（1）树和]]></description><category></category></item><item><title><![CDATA[算法刻意练习之栈/队列/双端队列/优先队列]]></title><link>https://blog.csdn.net/chenliguan/article/details/108303622</link><guid>https://blog.csdn.net/chenliguan/article/details/108303622</guid><author>chenliguan</author><pubDate>Sun, 30 Aug 2020 11:18:47 +0800</pubDate><description><![CDATA[1 栈（Stack）
1.1 特点
（1）Stack：先入后出；添加、删除皆为 O(1)

1.2 演示
（1）主要API

（2）示例

2 队列（Queue）
2.1 特点
（1）Queue：先入先出；添加、删除皆为 O(1)

2.2 演示
（1）主要API

（2）示例

2.3 时间复杂度
3 双端队列（Deque）
3.1 特点
（1）Stack：两端可以进出的Queue，即是Deque - double ended queue；插入和删除都是 O(1) 操作；

3.2 演示
（1）主要API]]></description><category></category></item><item><title><![CDATA[算法刻意练习之数组/链表/跳表]]></title><link>https://blog.csdn.net/chenliguan/article/details/108300950</link><guid>https://blog.csdn.net/chenliguan/article/details/108300950</guid><author>chenliguan</author><pubDate>Sat, 29 Aug 2020 23:20:00 +0800</pubDate><description><![CDATA[1 数组
申请数组时Memory Controller在内存中给你开辟一块连续的内存地址；
通过访问Memory Controller来访问数组，复杂度是O(1)；
可以随机访问任何一个元素；
问题在于 插入 和 删除 频繁的情况下, 数组不好用；
插入需要挪动元素 O(1)、O(n)；
删除也需要挪动元素， 然后给数组最后一位设置为空来触发GC, O(n)；
2 链表
3 跳表

...]]></description><category></category></item></channel></rss>