├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── algorithms ├── README.MD ├── algorithm-common │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── leetcode │ │ └── common │ │ ├── array │ │ └── ArrayUtils.java │ │ ├── linkedlist │ │ ├── LinkedListUtils.java │ │ └── ListNode.java │ │ ├── print │ │ └── PrintUtils.java │ │ └── tree │ │ ├── TreeNode.java │ │ └── TreeUtils.java ├── algorithm │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ ├── bloomfilter │ │ └── BloomFilter.java │ │ ├── consistenthash │ │ └── ConsistentHash.java │ │ ├── gcdlcm │ │ ├── Gcd1.java │ │ ├── Gcd2.java │ │ └── Gcd3.java │ │ ├── sort │ │ └── QuickSort.java │ │ └── util │ │ └── ArrayUtil.java ├── datastructure │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ ├── atguigu │ │ ├── graph │ │ │ └── Graph.java │ │ ├── hashtab │ │ │ └── HashTabDemo.java │ │ ├── linkedlist │ │ │ ├── DoubleLinkedListDemo.java │ │ │ ├── Josepfu.java │ │ │ ├── SingleLinkedListDemo.java │ │ │ └── skiplist │ │ │ │ ├── v1 │ │ │ │ └── SkipSet.java │ │ │ │ ├── v2 │ │ │ │ └── SkipList.java │ │ │ │ └── v3 │ │ │ │ └── SkipList2.java │ │ ├── queue │ │ │ ├── ArrayQueueDemo.java │ │ │ └── CircleArrayQueueDemo.java │ │ ├── recursion │ │ │ ├── Maze.java │ │ │ ├── Queue8.java │ │ │ └── Recursion.java │ │ ├── search │ │ │ ├── BinarySearch.java │ │ │ ├── FibonacciSearch.java │ │ │ ├── InsertValueSearch.java │ │ │ └── SeqSearch.java │ │ ├── sort │ │ │ ├── DubbleSort.java │ │ │ ├── HeapSort.java │ │ │ ├── InsertSort.java │ │ │ ├── MergeSort.java │ │ │ ├── QuickSort.java │ │ │ ├── QuickSort2.java │ │ │ ├── RadixSort.java │ │ │ ├── SelectSort.java │ │ │ ├── ShellSort.java │ │ │ ├── TimeComplexity.java │ │ │ └── heap │ │ │ │ ├── Heap.java │ │ │ │ ├── Heap2.java │ │ │ │ └── HeapOperator.java │ │ ├── sparsematrix │ │ │ ├── BestSpmatrix.java │ │ │ └── SparseMatrix.java │ │ ├── stack │ │ │ ├── ArrayStackDemo.java │ │ │ ├── InCalculator.java │ │ │ └── SuCalculator.java │ │ └── tree │ │ │ ├── ArrBinaryTreeDemo.java │ │ │ ├── BinaryTreeDemo.java │ │ │ ├── ThreadingBinaryTreeDemo.java │ │ │ ├── avl │ │ │ └── AVLTreeDemo.java │ │ │ ├── binarysorttree │ │ │ └── BinarySortTreeDemo.java │ │ │ ├── huffmancode │ │ │ └── HuffmanCode.java │ │ │ └── huffmantree │ │ │ └── HuffmanTree.java │ │ └── util │ │ └── ArrayUtil.java ├── go │ └── algorithm │ │ └── leetcode │ │ ├── array │ │ ├── 两数之和_II_输入有序数组_167_简单 │ │ │ ├── Solution1.go │ │ │ ├── Solution2.go │ │ │ └── Solution3.go │ │ ├── 反转字符串_344_简单 │ │ │ └── Solution1.go │ │ ├── 反转字符串中的元音字母_345_简单 │ │ │ └── Solution1.go │ │ ├── 合并两个有序数组_88_简单 │ │ │ ├── Solution1.go │ │ │ └── Solution2.go │ │ ├── 数组中的第K个最大元素_215_中等 │ │ │ └── Solution1.go │ │ ├── 无重复字符的最长子串_3_中等 │ │ │ └── Solution1.go │ │ ├── 盛最多水的容器_11_中等 │ │ │ └── Solution1.go │ │ ├── 长度最小的子数组_209_中等 │ │ │ ├── Solution1.go │ │ │ └── Solution2.go │ │ ├── 颜色分类_75_中等 │ │ │ ├── Solution1.go │ │ │ └── Solution2.go │ │ └── 验证回文串_125_Easy │ │ │ ├── Solution1.go │ │ │ └── Solution2.go │ │ └── lc69.go ├── interview │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ ├── Main.java │ │ └── cn │ │ └── lastwhisper │ │ └── interview │ │ ├── lejian │ │ └── Test1.java │ │ ├── other │ │ └── Main.java │ │ ├── scanner │ │ └── Main.java │ │ └── 美团点评 │ │ └── 合并金币 │ │ └── Test01.java ├── leetcode │ ├── array │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── leetcode │ │ │ └── array │ │ │ ├── 两数之和_II_输入有序数组_167_简单 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ │ │ ├── 使数组唯一的最小增量_945_中等 │ │ │ └── Solution1.java │ │ │ ├── 删除排序数组中的重复项_26_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 删除排序数组中的重复项_II_80_中等 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 区间合并 │ │ │ └── 矩形重叠_836_简单 │ │ │ │ ├── Solution1.java │ │ │ │ └── Solution2.java │ │ │ ├── 卡牌分组_914_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 反转字符串_344_简单 │ │ │ └── Solution1.java │ │ │ ├── 反转字符串中的元音字母_345_简单 │ │ │ └── Solution1.java │ │ │ ├── 合并两个有序数组_88_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 多数元素_169_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 将数组分成和相等的三个部_1013_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 找到字符串中所有字母异位词_438_中等 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── backup.md │ │ │ ├── 排序数组_912_中等 │ │ │ ├── README.md │ │ │ ├── 交换 │ │ │ │ ├── BubbleSort.java │ │ │ │ ├── Quick2Sort.java │ │ │ │ └── QuickSort.java │ │ │ ├── 分配 │ │ │ │ ├── CountSort.java │ │ │ │ └── RadixSort.java │ │ │ ├── 归并 │ │ │ │ └── MergeSort.java │ │ │ ├── 插入 │ │ │ │ ├── InsertSort.java │ │ │ │ └── ShellSort.java │ │ │ └── 选择 │ │ │ │ ├── HeapSort.java │ │ │ │ └── SelectSort.java │ │ │ ├── 数组中的第K个最大元素_215_中等 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 无重复字符的最长子串_3_中等 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 最小覆盖子串_76_hard │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ ├── Solution3.java │ │ │ └── Solution4.java │ │ │ ├── 有效的字母异位词_242_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 盛最多水的容器_11_中等 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 移动零_283_简单 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ │ │ ├── 移除元素_27_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 缺失的第一个正数_41_困难 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── YourVersion1.java │ │ │ ├── 螺旋矩阵_54_中等 │ │ │ └── Solution1.java │ │ │ ├── 错误的集合_645_简单 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ ├── Solution3.java │ │ │ └── Solution4.java │ │ │ ├── 长度最小的子数组_209_中等 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ ├── Solution3.java │ │ │ ├── Solution4.java │ │ │ ├── Solution5.java │ │ │ └── Solution6.java │ │ │ ├── 颜色分类_75_中等 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ └── 验证回文串_125_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ ├── binarysearch │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── leetcode │ │ │ └── binarysearch │ │ │ ├── pow_50_中等 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ │ │ ├── 二分查找_704_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 寻找旋转排序数组中的最小值II_154_困难 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 寻找旋转排序数组中的最小值_153_中等 │ │ │ └── Solution1.java │ │ │ └── 搜索插入位置_35_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ ├── binarytree │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── leetcode │ │ │ └── binarytree │ │ │ ├── 二叉搜索树的最近公共祖先_235_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 二叉搜索树结点最小距离_783_简单 │ │ │ └── Solution1.java │ │ │ ├── 二叉树的所有路径_257_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 二叉树的最大深度_104_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 二叉树的最小深度_111_简单 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ │ │ ├── 二叉树的直径_543_简单 │ │ │ └── Solution1.java │ │ │ ├── 单词的压缩编码_820_中等 │ │ │ └── Solution1.java │ │ │ ├── 完全二叉树的节点个数_222_中等 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ │ │ ├── 实现Trie前缀树_208_中等 │ │ │ └── Trie.java │ │ │ ├── 对称二叉树_101_简单 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ ├── Solution3.java │ │ │ └── Solution6.java │ │ │ ├── 左叶子之和_404_简单 │ │ │ ├── Solution.java │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 平衡二叉树_110_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 求根到叶子节点数字之和_129_中等 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 相同的树_100_简单 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ ├── Solution3.java │ │ │ ├── Solution4.java │ │ │ ├── Solution5.java │ │ │ └── Solution6.java │ │ │ ├── 翻转二叉树_226_简单 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ ├── Solution3.java │ │ │ ├── Solution4.java │ │ │ └── Solution5.java │ │ │ ├── 路径总和_112_简单 │ │ │ ├── Solution1.java │ │ │ ├── Solution4.java │ │ │ └── Solution5.java │ │ │ ├── 路径总和_III_437_简单 │ │ │ └── Solution1.java │ │ │ ├── 路径总和_II_113_中等 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ └── 验证二叉搜索树_98_中等 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ ├── bitoperation │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── leetcode │ │ │ └── bitoperation │ │ │ └── 位1的个数_191_简单 │ │ │ └── Solution.java │ ├── dfsbfs │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── leetcode │ │ │ └── dfsbfs │ │ │ ├── 地图分析_1162_中等 │ │ │ └── Solution1.java │ │ │ ├── 岛屿的最大面积_695_中等 │ │ │ └── Solution1.java │ │ │ └── 腐烂的橘子_994_简单 │ │ │ └── Solution1.java │ ├── divide │ │ └── pom.xml │ ├── dynamic │ │ ├── README.md │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── leetcode │ │ │ └── dynamic │ │ │ ├── knapsack01 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ ├── Solution3.java │ │ │ ├── Solution4.java │ │ │ ├── Solution5.java │ │ │ └── knapsack01.md │ │ │ ├── 三角形最小路径和_120_中等 │ │ │ ├── README.md │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ ├── Solution3.java │ │ │ └── Solution4.java │ │ │ ├── 不同路径II_63_中等 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 不同路径_62_中等 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 买卖股票的最佳时机_121_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 分割等和子集_416_中等 │ │ │ ├── 416.md │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ ├── Solution3.java │ │ │ └── Solution4.java │ │ │ ├── 完全平方数_279_中等 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ │ │ ├── 戳气球_312_困难 │ │ │ └── Solution1.java │ │ │ ├── 打家劫舍_198_简单 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── recursion │ │ │ │ ├── Solution1.java │ │ │ │ └── Solution2.java │ │ │ ├── 整数拆分_343_中等 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ ├── Solution3.java │ │ │ └── Solution4.java │ │ │ ├── 斐波那契数_509_简单 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ ├── Solution3.java │ │ │ ├── Solution4.java │ │ │ └── Solution5.java │ │ │ ├── 最大子序和_53_简单 │ │ │ ├── README.md │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ │ │ ├── 最小路径和_64_中等 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ ├── Solution3.java │ │ │ ├── Solution4.java │ │ │ └── recursion │ │ │ │ ├── Solution1.java │ │ │ │ ├── Solution2.java │ │ │ │ ├── Solution3.java │ │ │ │ └── Solution4.java │ │ │ ├── 最长上升子序列_300_中等 │ │ │ └── Solution1.java │ │ │ ├── 最长公共子序列_1143_中等 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 爬楼梯_70_简单 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ ├── Solution3.java │ │ │ ├── Solution4.java │ │ │ └── Solution5.java │ │ │ ├── 解码方法_91_中等 │ │ │ └── Solution1.java │ │ │ └── 零钱兑换_322_中等 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ ├── greedy │ │ ├── README.md │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── leetcode │ │ │ └── greedy │ │ │ ├── 买卖股票的最佳时机II_122_简单 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ ├── Solution3.java │ │ │ └── Solution4.java │ │ │ ├── 分发饼干_455_简单 │ │ │ └── Solution1.java │ │ │ ├── 判断子序列_392_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ └── 无重叠区间_435_中等 │ │ │ └── Solution1.java │ ├── hashtable │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── leetcode │ │ │ └── hashtable │ │ │ ├── 三数之和_15_中等 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ │ │ ├── 两个数组的交集_349_Esay │ │ │ └── Solution1.java │ │ │ ├── 两个数组的交集_II_350_Esay │ │ │ └── Solution1.java │ │ │ ├── 两数之和_1_简单 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ │ │ ├── 单词规律_290_Easy │ │ │ └── Solution1.java │ │ │ ├── 同构字符串_205_Esay │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 四数之和_18_Middle │ │ │ ├── Example.java │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 四数相加_II_454_中等 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 回旋镖的数量_447_简单 │ │ │ └── Solution1.java │ │ │ ├── 字母异位词分组_49_中等 │ │ │ └── Solution1.java │ │ │ ├── 存在重复元素_III_220_中等 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ │ │ ├── 存在重复元素_II_219_简单 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ │ │ ├── 快乐数_202_Easy │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ ├── Solution3.java │ │ │ ├── Test.java │ │ │ ├── Test2.java │ │ │ └── data │ │ │ ├── 找出第k小的距离对_719_困难 │ │ │ └── Solution1.java │ │ │ ├── 拼写单词_1160_简单 │ │ │ └── Solution1.java │ │ │ ├── 最接近的三数之和_16_Middle │ │ │ └── Solution1.java │ │ │ ├── 有效的字母异位词_242_Easy │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 根据字符出现频率排序_451_Middle │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 直线上最多的点数_149_困难 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ │ │ └── 长回文串_409_简单 │ │ │ └── Solution1.java │ ├── leetcode-common │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── leetcode │ │ │ └── common │ │ │ ├── array │ │ │ └── ArrayUtil.java │ │ │ ├── linkedlist │ │ │ ├── LinkedListUtil.java │ │ │ └── ListNode.java │ │ │ ├── print │ │ │ └── PrintUtil.java │ │ │ └── tree │ │ │ ├── TreeNode.java │ │ │ ├── TreeUtil.java │ │ │ └── TrieNode.java │ ├── leetcode大纲.md │ ├── linkedlist │ │ ├── README.MD │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── leetcode │ │ │ └── common │ │ │ └── linkedlist │ │ │ ├── 两两交换链表中的节点_24_中等 │ │ │ └── Solution1.java │ │ │ ├── 两数相加_2_中等 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 两数相加_II_445_中等 │ │ │ └── Solution1.java │ │ │ ├── 分隔链表_86_中等 │ │ │ └── Solution1.java │ │ │ ├── 删除排序链表中的重复元素_83_简单 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ │ │ ├── 删除排序链表中的重复元素_II_82_中等 │ │ │ └── Solution1.java │ │ │ ├── 删除链表中的节点_237_简单 │ │ │ └── Solution1.java │ │ │ ├── 删除链表的倒数第N个节点_19_中等 │ │ │ └── Solution1.java │ │ │ ├── 反转链表_206_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 反转链表_II_92_中等 │ │ │ └── Solution1.java │ │ │ ├── 合并两个有序链表_21_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 回文链表_234_简单 │ │ │ └── Solution1.java │ │ │ ├── 奇偶链表_328_中等 │ │ │ └── Solution1.java │ │ │ ├── 环形链表_141_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 相交链表_160_简单 │ │ │ ├── Solution1.java │ │ │ └── 参考 │ │ │ ├── 移除链表元素_203_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 设计跳表_1206_困难 │ │ │ └── Skiplist.java │ │ │ ├── 重排链表_143_中等 │ │ │ └── Solution1.java │ │ │ └── 链表的中间结点_876_简单 │ │ │ └── Solution.java │ ├── other │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── leetcode │ │ │ └── other │ │ │ ├── LRU缓存机制_146_中等 │ │ │ ├── LRUCache.java │ │ │ └── MyLRUCache.java │ │ │ ├── 二进制求和_67_简单 │ │ │ └── Solution1.java │ │ │ ├── 分糖果II_1103_简单 │ │ │ └── Solution.java │ │ │ ├── 四的幂_342_简单 │ │ │ └── Solution1.java │ │ │ └── 重复叠加字符串匹配_686_简单 │ │ │ └── Solution1.java │ ├── pom.xml │ ├── readme.md │ ├── recursion-backtracking │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── leetcode │ │ │ └── recurionbacktracking │ │ │ ├── N皇后II_52_困难 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── N皇后_51_困难 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 二进制手表_401_简单 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ │ │ ├── 全排列_46_中等 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ │ │ ├── 全排列_II_47_中等 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 单词搜索_79_中等 │ │ │ └── Solution1.java │ │ │ ├── 复原IP地址_93_中等 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ │ │ ├── 岛屿数量_200_中等 │ │ │ └── Solution1.java │ │ │ ├── 正则表达式匹配_10_困难 │ │ │ └── Solution1.java │ │ │ ├── 电话号码的字母组合_17_中等 │ │ │ └── Solution1.java │ │ │ ├── 组合_77_中等 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ ├── 剪枝.png │ │ │ └── 组合.png │ │ │ ├── 组合总和_39_中等 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ └── 组合总和_II_40_中等 │ │ │ └── Solution1.java │ ├── stackqueue │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── leetcode │ │ │ └── stackqueue │ │ │ ├── 二叉树的中序遍历_94_中等 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ ├── Solution3.java │ │ │ └── SolutionCommand.java │ │ │ ├── 二叉树的前序遍历_144_中等 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ ├── Solution3.java │ │ │ ├── Solution4.java │ │ │ └── SolutionCommand.java │ │ │ ├── 二叉树的右视图_199_中等 │ │ │ └── Solution1.java │ │ │ ├── 二叉树的后序遍历_145_困难 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ ├── Solution3.java │ │ │ ├── Solution4.java │ │ │ ├── SolutionCommand.java │ │ │ └── 参考.txt │ │ │ ├── 二叉树的层次遍历_102_中等 │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ │ │ ├── 二叉树的层次遍历_II_107_简单 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 二叉树的锯齿形层次遍历_103_中等 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 前K个高频元素_347_中等 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 合并K个排序链表_23_困难 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ ├── 完全平方数_279_中等 │ │ │ └── Solution1.java │ │ │ ├── 扁平化嵌套列表迭代器_341_中等 │ │ │ ├── NestedInteger.java │ │ │ ├── NestedIterator.java │ │ │ ├── NestedIterator1.java │ │ │ └── 参考 │ │ │ ├── 数据流移动平均值_346_简单 │ │ │ └── MovingAverage.java │ │ │ ├── 最小栈_155_简单 │ │ │ └── MinStack.java │ │ │ ├── 有效的括号_20_简单 │ │ │ └── Solution1.java │ │ │ ├── 用队列实现栈_225_简单 │ │ │ ├── MyStack.java │ │ │ └── MyStack1.java │ │ │ ├── 简化路径_71_中等 │ │ │ └── Solution1.java │ │ │ ├── 逆波兰表达式求值_150_中等 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ └── 验证栈序列_946_中等 │ │ │ └── Solution1.java │ ├── string │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── leetcode │ │ │ └── string │ │ │ ├── 字符串的最大公因子_1071_简单 │ │ │ └── Solution1.java │ │ │ ├── 翻转字符串里的单词_151_中等 │ │ │ └── Solution1.java │ │ │ └── 面试题01_06_字符串压缩_简单 │ │ │ └── Solution1.java │ ├── union-find │ │ └── pom.xml │ └── week │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── leetcode │ │ └── week │ │ ├── one175 │ │ ├── 制造字母异位词的最小步骤数_5333_中等 │ │ │ └── Solution.java │ │ ├── 参加考试的最大学生数_5335_困难 │ │ │ └── Solution.java │ │ ├── 推文计数_5334_中等 │ │ │ └── TweetCounts.java │ │ └── 检查整数及其两倍数是否存在_简单_5332 │ │ │ └── Solution.java │ │ ├── one176 │ │ ├── 最后K个数的乘积_5341 │ │ │ └── ProductOfNumbers.java │ │ ├── 最多可以参加的会议数目_5342 │ │ │ └── Solution.java │ │ └── 统计有序矩阵中的负数_5340 │ │ │ └── Solution.java │ │ ├── one177 │ │ ├── 形成三的最大倍数_5172_困难 │ │ │ └── Solution.java │ │ ├── 日期之间隔几天_5169_简单 │ │ │ └── Solution.java │ │ ├── 最接近的因数_5171_中等 │ │ │ └── Solution.java │ │ └── 验证二叉树_5170_中等 │ │ │ └── Solution.java │ │ ├── one178 │ │ ├── 有多少小于当前数字的数字_5344 │ │ │ └── Solution.java │ │ └── 通过投票对团队排名_5345 │ │ │ └── Solution.java │ │ ├── one180 │ │ ├── 矩阵中的幸运数_5356_简单 │ │ │ ├── Solution.java │ │ │ └── Solution1.java │ │ └── 设计一个支持增量操作的栈_5357_中等 │ │ │ └── CustomStack.java │ │ ├── one183 │ │ ├── 将二进制表示减到1的步骤数_5377_中等 │ │ │ └── Solution.java │ │ └── 非递增顺序的最小子序列_5376_简单 │ │ │ └── Solution.java │ │ └── tow20 │ │ └── 根据数字二进制下1的数目排序_5323_简单 │ │ └── Solution.java ├── leetcode2 │ ├── README.md │ ├── backtracking │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ ├── N皇后_51_困难 │ │ │ └── Solution.java │ │ │ ├── 全排列II_47_中等 │ │ │ └── Solution.java │ │ │ ├── 全排列_46_中等 │ │ │ ├── Solution.java │ │ │ └── Solution2.java │ │ │ ├── 划分为k个相等的子集_698_中等 │ │ │ └── Solution.java │ │ │ ├── 子集II_90_中等 │ │ │ └── Solution.java │ │ │ ├── 子集_78_中等 │ │ │ └── Solution.java │ │ │ └── 组合_77_中等 │ │ │ └── Solution.java │ ├── binarysearch │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ ├── 二分查找_704_简单 │ │ │ └── Solution.java │ │ │ ├── 在排序数组中查找元素的第一个和最后一个位置_34_中等 │ │ │ ├── Solution.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ │ │ ├── 搜索旋转排序数组_33_中等 │ │ │ └── Solution.java │ │ │ └── 搜索旋转排序数组_II_81_中等 │ │ │ └── Solution.java │ ├── dfsbfs │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ ├── 太平洋大西洋流水问题_417_中等 │ │ │ ├── Solution.java │ │ │ └── Solution_my.java │ │ │ ├── 岛屿的最大面积_695_中等 │ │ │ ├── Solution.java │ │ │ └── Solution2.java │ │ │ └── 省份数量_547_中等 │ │ │ └── Solution.java │ ├── dynamic2 │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ ├── knapsack01 │ │ │ └── knapsack01.md │ │ │ ├── 打家劫舍_198_中等 │ │ │ ├── Solution.java │ │ │ └── Solution2.java │ │ │ ├── 爬楼梯_70_简单 │ │ │ └── Solution.java │ │ │ └── 零钱兑换_322_中等 │ │ │ ├── Solution.java │ │ │ └── Solution2.java │ ├── greedy │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ ├── 买卖股票的最佳时机II_122_简单 │ │ │ └── Solution.java │ │ │ ├── 分发糖果_135_困难 │ │ │ └── Solution1.java │ │ │ ├── 分发饼干_455_简单 │ │ │ └── Solution1.java │ │ │ └── 无重叠区间_435_中等 │ │ │ └── Solution.java │ ├── leetcode2-common │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ ├── array │ │ │ └── ArrayUtil.java │ │ │ ├── linkedlist │ │ │ ├── LinkedListUtil.java │ │ │ └── ListNode.java │ │ │ ├── print │ │ │ └── PrintUtil.java │ │ │ └── tree │ │ │ ├── TreeNode.java │ │ │ ├── TreeUtil.java │ │ │ └── TrieNode.java │ ├── linkedlist │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ ├── K个一组翻转链表_25_困难 │ │ │ └── Solution.java │ │ │ ├── 两两交接链表中的节点_24_中等 │ │ │ └── Solution.java │ │ │ ├── 反转链表_206_简单 │ │ │ ├── Solution.java │ │ │ └── Solution2.java │ │ │ ├── 合并两个有序链表_21_中等 │ │ │ └── Solution.java │ │ │ ├── 回文链表_234_简单 │ │ │ └── Solution.java │ │ │ ├── 排序链表_148_中等 │ │ │ └── Solution.java │ │ │ └── 相交链表_160_简单 │ │ │ └── Solution.java │ ├── other-algo │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ └── LRU缓存_146_中等 │ │ │ ├── LRUCache.java │ │ │ └── LRUCache2.java │ ├── point │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ ├── 两数之和_II_输入有序数组_167_简单 │ │ │ └── Solution.java │ │ │ ├── 合并两个有序数组_88_简单 │ │ │ └── Solution.java │ │ │ ├── 最小覆盖子串_76_困难 │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ │ └── 环形链表_II_142_中等 │ │ │ └── Solution1.java │ ├── pom.xml │ ├── sort │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ ├── sort │ │ │ ├── BucketSort.java │ │ │ ├── Heap1.java │ │ │ ├── Heap2.java │ │ │ ├── QuickSort1.java │ │ │ ├── QuickSort2.java │ │ │ ├── QuickSort3.java │ │ │ └── README.md │ │ │ ├── 前K个高频元素_347_中等 │ │ │ └── Solution.java │ │ │ ├── 数组中的第K个最大元素_215_中等 │ │ │ ├── Solution.java │ │ │ └── Solution2.java │ │ │ ├── 根据字符出现频率排序_451_中等 │ │ │ └── Solution.java │ │ │ └── 颜色分类_75_中等 │ │ │ └── Solution.java │ ├── src │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ └── 接雨水_42_困难 │ │ │ ├── README.md │ │ │ ├── Solution1.java │ │ │ ├── Solution2.java │ │ │ └── Solution3.java │ └── tree │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── cunchang │ │ ├── 二叉树展开为链表_114_中等 │ │ └── Solution.java │ │ ├── 二叉树的前序遍历_144_简单 │ │ └── Solution.java │ │ ├── 二叉树的层平均值_637_简单 │ │ └── Solution.java │ │ ├── 二叉树的最大深度_104_简单 │ │ ├── Solution.java │ │ └── Solution2.java │ │ ├── 二叉树的直径_543_简单 │ │ └── Solution.java │ │ ├── 从中序与后序遍历序列构造二叉树_106_中等 │ │ ├── Solution.java │ │ └── Solution2.java │ │ ├── 从前序与中序遍历序列构造二叉树_105_中等 │ │ └── Solution.java │ │ ├── 删点成林_1110_简单 │ │ └── Solution.java │ │ ├── 填充每个节点的下一个右侧节点指针_116_中等 │ │ └── Solution.java │ │ ├── 对称二叉树_101_简单 │ │ └── Solution.java │ │ ├── 平衡二叉树_110_简单 │ │ └── Solution.java │ │ ├── 最大二叉树_654_中等 │ │ └── Solution.java │ │ ├── 根据前序和后序遍历构造二叉树_889_中等 │ │ └── Solution.java │ │ ├── 翻转二叉树_226_简单 │ │ ├── Solution.java │ │ └── Solution2.java │ │ └── 路径总和_III_437_中等 │ │ └── Solution.java ├── niuke │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── cunchang │ │ ├── od │ │ ├── DemoMain1.java │ │ ├── DemoMain2.java │ │ ├── Main1.java │ │ ├── Main2.java │ │ └── Main3.java │ │ ├── scanner │ │ └── Main.java │ │ └── 没有重复项数字的全排列_BM55 │ │ └── Solution.java ├── offer │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── offer │ │ ├── 单例 │ │ ├── Singleton1.java │ │ ├── Singleton2.java │ │ ├── Singleton3.java │ │ ├── Singleton4.java │ │ ├── Singleton5.java │ │ └── Singleton6.java │ │ ├── 面试题03_数组中重复的数字_简单 │ │ ├── Solution1.java │ │ ├── Solution2.java │ │ └── Solution_3_2.java │ │ ├── 面试题04_二维数组中的查找_简单 │ │ └── Solution1.java │ │ ├── 面试题05_替换空格_简单 │ │ ├── Solution.java │ │ └── Solution1.java │ │ ├── 面试题06_从尾到头打印链表_简单 │ │ └── Solution1.java │ │ ├── 面试题07_重建二叉树_中等 │ │ └── Solution1.java │ │ ├── 面试题08_二叉树的下一个节点 │ │ └── Solution_8.java │ │ ├── 面试题09_用两个栈实现队列_简单 │ │ ├── CQueue1.java │ │ └── CQueue2.java │ │ ├── 面试题10_II_青蛙跳台阶问题_简单 │ │ └── Solution.java │ │ ├── 面试题10_I_斐波那契数列_简单 │ │ └── Solution.java │ │ ├── 面试题11_旋转数组的最小数字_简单 │ │ └── Solution1.java │ │ ├── 面试题12_矩阵中的路径_中等 │ │ └── Solution1.java │ │ ├── 面试题13_机器人的运动范围_中等 │ │ ├── Solution1.java │ │ └── o │ │ │ ├── Solution1.java │ │ │ └── Solution2.java │ │ ├── 面试题14_II_剪绳子_中等 │ │ └── Solution1.java │ │ ├── 面试题14_I_剪绳子_中等 │ │ ├── Solution1.java │ │ └── Solution2.java │ │ ├── 面试题15_二进制中1的个数_简单 │ │ └── Solution.java │ │ ├── 面试题16_数值的整数次方_中等 │ │ ├── Solution1.java │ │ ├── Solution2.java │ │ └── Solution3.java │ │ ├── 面试题17_打印从1到最大的n位数_简单 │ │ └── Solution1.java │ │ ├── 面试题18_删除链表的节点_简单 │ │ └── Solution1.java │ │ ├── 面试题19_正则表达式匹配 │ │ └── Solution1.java │ │ ├── 面试题20_表示数值的字符串 │ │ └── Solution1.java │ │ ├── 面试题21_调整数组顺序使奇数位于偶数前面 │ │ ├── Solution1.java │ │ └── Solution2.java │ │ ├── 面试题22_链表中倒数第k个节点 │ │ └── Solution1.java │ │ ├── 面试题24_反转链表 │ │ ├── Solution1.java │ │ └── Solution2.java │ │ ├── 面试题25_合并两个排序的链表 │ │ └── Solution1.java │ │ ├── 面试题26_树的子结构 │ │ └── Solution1.java │ │ ├── 面试题27_二叉树的镜像 │ │ └── Solution1.java │ │ ├── 面试题28_对称的二叉树 │ │ └── Solution1.java │ │ ├── 面试题29_顺时针打印矩阵 │ │ └── Solution1.java │ │ ├── 面试题30_包含min函数的栈 │ │ └── MinStack.java │ │ ├── 面试题31_栈的压入弹出序列 │ │ └── Solution1.java │ │ ├── 面试题32_III_从上到下打印二叉树III │ │ └── Solution1.java │ │ ├── 面试题32_II_从上到下打印二叉树II │ │ └── Solution1.java │ │ ├── 面试题32_I_从上到下打印二叉树 │ │ └── Solution1.java │ │ ├── 面试题33_二叉搜索树的后序遍历序列 │ │ └── Solution1.java │ │ ├── 面试题34_二叉树中和为某一值的路径 │ │ └── Solution1.java │ │ ├── 面试题39_数组中出现次数超过一半的数字 │ │ └── Solution1.java │ │ ├── 面试题40_最小的k个数 │ │ └── Solution1.java │ │ ├── 面试题57_II_和为s的连续正数序列_简单 │ │ └── Solution1.java │ │ ├── 面试题59_II_队列的最大值 │ │ └── MaxQueue.java │ │ ├── 面试题59_I_滑动窗口的最大值 │ │ ├── Solution.java │ │ └── Solution1.java │ │ └── 面试题62_圆圈中最后剩下的数字 │ │ ├── Solution1.java │ │ └── Solution2.java ├── pom.xml └── test │ ├── pom.xml │ └── src │ └── main │ └── java │ └── cn │ └── cunchang │ ├── Main.java │ └── Main2.java ├── bigdata ├── flink-cdc │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── cunchang │ │ ├── FlinkCDC.java │ │ ├── FlinkCDC2.java │ │ ├── FlinkSQLCDC.java │ │ └── func │ │ └── CustomerDeserializationSchema.java ├── flink │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── cunchang │ │ │ ├── README.txt │ │ │ ├── batch │ │ │ ├── BatchWordCountJava.java │ │ │ └── transformation │ │ │ │ ├── BatchCrossJava.java │ │ │ │ ├── BatchFirstNJava.java │ │ │ │ ├── BatchJoinJava.java │ │ │ │ ├── BatchMapPartitionJava.java │ │ │ │ └── BatchOuterJoinJava.java │ │ │ ├── kafkaconnector │ │ │ ├── StreamKafkaSinkJava.java │ │ │ └── StreamKafkaSourceJava.java │ │ │ ├── stream │ │ │ ├── SocketWindowWordCountJava.java │ │ │ ├── sink │ │ │ │ └── StreamRedisSinkJava.java │ │ │ ├── source │ │ │ │ └── StreamCollectionSourceJava.java │ │ │ └── transformation │ │ │ │ ├── MyPartitionerJava.java │ │ │ │ ├── StreamConnectJava.java │ │ │ │ ├── StreamPartitionOpJava.java │ │ │ │ ├── StreamSideOutputJava.java │ │ │ │ ├── StreamSplitJava.java │ │ │ │ └── StreamUnionJava.java │ │ │ ├── tablesql │ │ │ ├── CreateTableEnvironmentJava.java │ │ │ ├── DataSetToTableJava.java │ │ │ ├── DataStreamToTableJava.java │ │ │ ├── TableAPIAndSQLOpJava.java │ │ │ ├── TableToDataSetJava.java │ │ │ └── TableToDataStreamJava.java │ │ │ └── window │ │ │ ├── CountWindowOpJava.java │ │ │ ├── MyTimeWindowJava.java │ │ │ ├── TimeWindowOpJava.java │ │ │ └── WatermarkOpJava.java │ │ ├── resources │ │ └── log4j.properties │ │ └── scala │ │ └── com │ │ └── imooc │ │ └── scala │ │ ├── batch │ │ ├── BatchWordCountScala.scala │ │ └── transformation │ │ │ ├── BatchCrossScala.scala │ │ │ ├── BatchFirstNScala.scala │ │ │ ├── BatchJoinScala.scala │ │ │ ├── BatchMapPartitionScala.scala │ │ │ └── BatchOuterJoinScala.scala │ │ ├── kafkaconnector │ │ ├── StreamKafkaSinkScala.scala │ │ └── StreamKafkaSourceScala.scala │ │ ├── stream │ │ ├── SocketWindowWordCountScala.scala │ │ ├── sink │ │ │ └── StreamRedisSinkScala.scala │ │ ├── source │ │ │ └── StreamCollectionSourceScala.scala │ │ └── transformation │ │ │ ├── MyPartitionerScala.scala │ │ │ ├── StreamConnectScala.scala │ │ │ ├── StreamPartitionOpScala.scala │ │ │ ├── StreamSideOutputScala.scala │ │ │ ├── StreamSplitScala.scala │ │ │ └── StreamUnionScala.scala │ │ ├── tablesql │ │ ├── CreateTableEnvironmentScala.scala │ │ ├── DataSetToTableScala.scala │ │ ├── DataStreamToTableScala.scala │ │ ├── TableAPIAndSQLOpScala.scala │ │ ├── TableToDataSetScala.scala │ │ └── TableToDataStreamScala.scala │ │ └── window │ │ ├── CountWindowOpScala.scala │ │ ├── MyTimeWindowScala.scala │ │ ├── TimeWindowOpScala.scala │ │ ├── WatermarkOpForAllowedLatenessScala.scala │ │ ├── WatermarkOpForSideOutputLateDataScala.scala │ │ ├── WatermarkOpMoreParallelismScala.scala │ │ └── WatermarkOpScala.scala ├── hadoop │ ├── hdfs │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── cn │ │ │ │ └── cunchang │ │ │ │ └── HdfsOp.java │ │ │ └── resources │ │ │ └── log4j.properties │ ├── mapreduce │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── cn │ │ │ │ └── cunchang │ │ │ │ └── mr │ │ │ │ ├── GenerateDat.java │ │ │ │ ├── HadoopSerialize.java │ │ │ │ ├── JavaSerialize.java │ │ │ │ ├── README.md │ │ │ │ ├── SmallFileMap.java │ │ │ │ ├── SmallFileSeq.java │ │ │ │ ├── WordCountJob.java │ │ │ │ ├── WordCountJobNoReduce.java │ │ │ │ ├── WordCountJobQueue.java │ │ │ │ ├── WordCountJobSeq.java │ │ │ │ ├── WordCountJobSkew.java │ │ │ │ └── WordCountJobSkewRandKey.java │ │ │ └── resources │ │ │ └── log4j.properties │ └── pom.xml └── imooc-flink │ ├── data │ ├── access.json │ ├── access.log │ ├── nest │ │ ├── 1 │ │ │ ├── a.txt │ │ │ └── b.txt │ │ ├── 2 │ │ │ ├── c.txt │ │ │ └── d.txt │ │ └── wc.txt │ ├── people.csv │ ├── wc.data │ └── wc.txt │ ├── imooc-clickhouse │ └── pom.xml │ ├── imooc-flink-basic │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── com │ │ └── imooc │ │ └── flink │ │ └── basic │ │ ├── BatchWCApp.java │ │ └── StreamingWCApp.java │ ├── imooc-flink-dataset │ └── pom.xml │ ├── imooc-flink-datastream │ ├── README.md │ ├── pom.xml │ ├── src │ │ └── main │ │ │ ├── java │ │ │ └── com │ │ │ │ └── imooc │ │ │ │ └── flink │ │ │ │ ├── partitioner │ │ │ │ ├── PKPartitioner.java │ │ │ │ └── PartitionerApp.java │ │ │ │ ├── sink │ │ │ │ ├── PKMySQLSink.java │ │ │ │ ├── PKRedisSink.java │ │ │ │ └── SinkApp.java │ │ │ │ ├── source │ │ │ │ ├── AccessSource.java │ │ │ │ ├── AccessSourceV2.java │ │ │ │ ├── SourceApp.java │ │ │ │ ├── Student.java │ │ │ │ └── StudentSource.java │ │ │ │ ├── state │ │ │ │ ├── CheckpointApp.java │ │ │ │ └── StateApp.java │ │ │ │ ├── transformation │ │ │ │ ├── Access.java │ │ │ │ ├── PKMapFunction.java │ │ │ │ └── TransformationApp.java │ │ │ │ ├── utils │ │ │ │ └── MySQLUtils.java │ │ │ │ ├── window │ │ │ │ ├── PKProcessWindowFunction.java │ │ │ │ └── WindowApp.java │ │ │ │ └── wm │ │ │ │ └── EventTimeWMApp.java │ │ │ └── resources │ │ │ └── log4j.properties │ └── test.sql │ ├── imooc-flink-project │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── com │ │ └── imooc │ │ └── flink │ │ ├── app │ │ ├── GaodeApp.java │ │ ├── OsUserCntAppV1.java │ │ ├── OsUserCntAppV2.java │ │ ├── OsUserCntAppV3.java │ │ ├── OsUserCntAppV4.java │ │ ├── ProvinceUserCntAppV1.java │ │ ├── TopNAppV1.java │ │ └── TopNTest.java │ │ ├── domain │ │ ├── Access.java │ │ ├── EventCatagoryProductCount.java │ │ └── Product.java │ │ ├── udf │ │ ├── GaodeLocationMapFunction.java │ │ ├── TopNAggregateFunction.java │ │ └── TopNWindowFunction.java │ │ └── utils │ │ └── StringUtils.java │ ├── imooc-flink-sql │ └── pom.xml │ ├── imooc-flink-upgrade │ └── pom.xml │ └── pom.xml ├── distributed ├── READEME.MD ├── gateway │ ├── README.md │ ├── service-order-load1 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── lastwhisper │ │ │ │ │ └── service │ │ │ │ │ └── ServiceB1Application.java │ │ │ └── resources │ │ │ │ └── application.yml │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── servicea │ │ │ └── ServiceAApplicationTests.java │ ├── service-order-load2 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── lastwhisper │ │ │ │ │ └── service │ │ │ │ │ └── ServiceB2Application.java │ │ │ └── resources │ │ │ │ └── application.yml │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── servicea │ │ │ └── ServiceAApplicationTests.java │ ├── service-product │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── lastwhisper │ │ │ │ │ └── service │ │ │ │ │ └── ServiceAApplication.java │ │ │ └── resources │ │ │ │ └── application.yml │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── service │ │ │ └── ServiceAApplicationTests.java │ └── zuul-gateway │ │ ├── pom.xml │ │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── zuul │ │ │ │ └── ZuulGatewayApplication.java │ │ └── resources │ │ │ ├── META-INF │ │ │ └── additional-spring-configuration-metadata.json │ │ │ └── application.yml │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── zuul │ │ └── ZuulGatewayApplicationTests.java ├── gray │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── cunchang │ │ │ ├── Application.java │ │ │ ├── v1 │ │ │ ├── Constant.java │ │ │ ├── GrayHelper.java │ │ │ ├── InterfaceWeightGroup.java │ │ │ ├── WeightCategory.java │ │ │ ├── WeightRandom.java │ │ │ └── WeightTest.java │ │ │ └── v2 │ │ │ ├── Constant.java │ │ │ ├── GrayHelper.java │ │ │ ├── InterfaceWeightGroup.java │ │ │ ├── UrlListEnum.java │ │ │ ├── WeightCategory.java │ │ │ ├── WeightTest.java │ │ │ └── web │ │ │ ├── GrayConfigController.java │ │ │ └── req │ │ │ ├── RequestConfig.java │ │ │ └── RequestConfigParam.java │ │ └── resources │ │ └── application.yml ├── hystrix │ ├── README.MD │ ├── eshop-cache-ha │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── lastwhisper │ │ │ │ │ └── cache │ │ │ │ │ └── ha │ │ │ │ │ ├── CacheApplication.java │ │ │ │ │ ├── controller │ │ │ │ │ ├── CacheController.java │ │ │ │ │ └── HelloController.java │ │ │ │ │ ├── filter │ │ │ │ │ └── HystrixRequestContextFilter.java │ │ │ │ │ ├── http │ │ │ │ │ └── HttpClientUtils.java │ │ │ │ │ ├── hystrix │ │ │ │ │ └── command │ │ │ │ │ │ ├── GetBrandNameCommand.java │ │ │ │ │ │ ├── GetCityNameCommand.java │ │ │ │ │ │ ├── GetProductInfoCommand.java │ │ │ │ │ │ ├── GetProductInfosCommand.java │ │ │ │ │ │ └── UpdateProductInfoCommand.java │ │ │ │ │ ├── local │ │ │ │ │ ├── BrandCache.java │ │ │ │ │ └── LocationCache.java │ │ │ │ │ ├── mapper │ │ │ │ │ └── UserMapper.java │ │ │ │ │ └── model │ │ │ │ │ └── ProductInfo.java │ │ │ └── resources │ │ │ │ ├── application.properties │ │ │ │ ├── mybatis │ │ │ │ └── UserMapper.xml │ │ │ │ └── templates │ │ │ │ └── hello.html │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── cache │ │ │ └── ha │ │ │ ├── CircuitBreakerTest.java │ │ │ └── RejectTest.java │ ├── eshop-product-ha │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── lastwhisper │ │ │ │ │ └── product │ │ │ │ │ └── ha │ │ │ │ │ ├── ProductApplication.java │ │ │ │ │ ├── controller │ │ │ │ │ ├── HelloController.java │ │ │ │ │ └── ProductController.java │ │ │ │ │ └── mapper │ │ │ │ │ └── UserMapper.java │ │ │ └── resources │ │ │ │ ├── application.properties │ │ │ │ ├── mybatis │ │ │ │ └── UserMapper.xml │ │ │ │ └── templates │ │ │ │ └── hello.html │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── product │ │ │ └── ha │ │ │ └── ProductHaApplicationTests.java │ └── pom.xml ├── lock │ ├── flow1 │ │ ├── Thread Group100.jmx │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── cunchang │ │ │ │ │ ├── Application1.java │ │ │ │ │ ├── config │ │ │ │ │ └── RedisConfig.java │ │ │ │ │ └── controller │ │ │ │ │ ├── GoodController1.java │ │ │ │ │ ├── GoodController2.java │ │ │ │ │ ├── GoodController3.java │ │ │ │ │ ├── GoodController4.java │ │ │ │ │ ├── GoodController5.java │ │ │ │ │ ├── GoodController6.java │ │ │ │ │ ├── GoodController7_1.java │ │ │ │ │ ├── GoodController7_2.java │ │ │ │ │ └── GoodController8.java │ │ │ └── resources │ │ │ │ ├── application.properties │ │ │ │ └── lua │ │ │ │ └── DelLockScript.lua │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ └── Application1Tests.java │ ├── flow2 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── cunchang │ │ │ │ │ ├── Application2.java │ │ │ │ │ ├── config │ │ │ │ │ └── RedisConfig.java │ │ │ │ │ └── controller │ │ │ │ │ ├── GoodController.java │ │ │ │ │ └── GoodController8.java │ │ │ └── resources │ │ │ │ └── application.properties │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ └── Application2Tests.java │ ├── jedis │ │ ├── README.md │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── cn │ │ │ │ └── cunchang │ │ │ │ ├── JedisUtil.java │ │ │ │ ├── asynqueue │ │ │ │ └── RedisDelayingQueue.java │ │ │ │ ├── basic │ │ │ │ ├── BasicOperation.java │ │ │ │ └── StringOper.java │ │ │ │ ├── bloomfilter │ │ │ │ ├── BloomTest.java │ │ │ │ ├── BloomTest2.java │ │ │ │ ├── BloomTest3.java │ │ │ │ └── GuavaBloom.java │ │ │ │ ├── cluster │ │ │ │ ├── ClusterTest.java │ │ │ │ └── JedisClusterFactory.java │ │ │ │ ├── common │ │ │ │ └── Const.java │ │ │ │ ├── hyperloglog │ │ │ │ └── PfTest.java │ │ │ │ ├── lock │ │ │ │ ├── LockDome.java │ │ │ │ ├── RedisWithReentrantLock.java │ │ │ │ └── real │ │ │ │ │ ├── Client.java │ │ │ │ │ ├── CodeBlock.java │ │ │ │ │ └── LockUtil.java │ │ │ │ ├── partition │ │ │ │ └── PartitionTest.java │ │ │ │ ├── pipeline │ │ │ │ └── PipelineTest.java │ │ │ │ ├── publishersubscriber │ │ │ │ ├── PublisherTest.java │ │ │ │ └── SubscriberTest.java │ │ │ │ ├── sentinel │ │ │ │ └── SentinelTest.java │ │ │ │ └── transaction │ │ │ │ └── TransactionTest.java │ │ │ └── resources │ │ │ └── Setnx_Expire_Srcipt.lua │ └── redisson │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── cunchang │ │ ├── RedissonUtil.java │ │ └── lock │ │ ├── DemoMain.java │ │ ├── LockDemo.java │ │ ├── MultiLockDemo.java │ │ ├── RedLockDemo.java │ │ ├── TryLockDemo.java │ │ └── test │ │ └── ThreadGcTest.java ├── mq │ ├── activemq │ │ ├── README.MD │ │ ├── activemq-api │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ └── main │ │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── latwhisper │ │ │ │ │ └── activemq │ │ │ │ │ ├── Constant.java │ │ │ │ │ ├── queue │ │ │ │ │ ├── QueueConsumer.java │ │ │ │ │ └── QueueProducer.java │ │ │ │ │ └── topic │ │ │ │ │ ├── TopicConsumer.java │ │ │ │ │ └── TopicProducer.java │ │ │ │ └── resources │ │ │ │ └── jms规范接口.jpg │ │ ├── activemq-spring │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ └── main │ │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── lastwhisper │ │ │ │ │ └── activemq │ │ │ │ │ ├── amq │ │ │ │ │ ├── consumer │ │ │ │ │ │ ├── queue │ │ │ │ │ │ │ ├── QueueReceiver1.java │ │ │ │ │ │ │ └── QueueReceiver2.java │ │ │ │ │ │ └── topic │ │ │ │ │ │ │ ├── TopicReceiver1.java │ │ │ │ │ │ │ └── TopicReceiver2.java │ │ │ │ │ └── producer │ │ │ │ │ │ ├── QueueSender.java │ │ │ │ │ │ └── TopicSender.java │ │ │ │ │ └── ctrl │ │ │ │ │ └── DemoController.java │ │ │ │ ├── resources │ │ │ │ ├── spring-amq.xml │ │ │ │ ├── spring-main.xml │ │ │ │ └── spring-mvc.xml │ │ │ │ └── webapp │ │ │ │ ├── WEB-INF │ │ │ │ └── web.xml │ │ │ │ └── index.jsp │ │ └── pom.xml │ ├── rabbitmq │ │ ├── README.md │ │ ├── RabbitMQ安装文档.txt │ │ ├── pom.xml │ │ ├── rabbitmq-api │ │ │ ├── README.md │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── rabbitmq │ │ │ │ ├── api │ │ │ │ ├── ack │ │ │ │ │ ├── Consumer.java │ │ │ │ │ ├── MyConsumer.java │ │ │ │ │ └── Producer.java │ │ │ │ ├── confirm │ │ │ │ │ ├── Consumer.java │ │ │ │ │ └── Producer.java │ │ │ │ ├── consumer │ │ │ │ │ ├── Consumer.java │ │ │ │ │ ├── MyConsumer.java │ │ │ │ │ └── Producer.java │ │ │ │ ├── dlx │ │ │ │ │ ├── Consumer.java │ │ │ │ │ ├── MyConsumer.java │ │ │ │ │ └── Producer.java │ │ │ │ ├── exchange │ │ │ │ │ ├── direct │ │ │ │ │ │ ├── Consumer4DirectExchange.java │ │ │ │ │ │ └── Producer4DirectExchange.java │ │ │ │ │ ├── fanout │ │ │ │ │ │ ├── Consumer4FanoutExchange.java │ │ │ │ │ │ └── Producer4FanoutExchange.java │ │ │ │ │ └── topic │ │ │ │ │ │ ├── Consumer4TopicExchange.java │ │ │ │ │ │ └── Producer4TopicExchange.java │ │ │ │ ├── limit │ │ │ │ │ ├── Consumer.java │ │ │ │ │ ├── MyConsumer.java │ │ │ │ │ └── Producer.java │ │ │ │ ├── message │ │ │ │ │ ├── Consumer.java │ │ │ │ │ └── Producer.java │ │ │ │ └── returnlistener │ │ │ │ │ ├── Consumer.java │ │ │ │ │ └── Producer.java │ │ │ │ ├── common │ │ │ │ └── Constant.java │ │ │ │ └── quickstart │ │ │ │ ├── Consumer.java │ │ │ │ └── Producer.java │ │ ├── rabbitmq-spring │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ ├── main │ │ │ │ ├── java │ │ │ │ │ └── cn │ │ │ │ │ │ └── lastwhisper │ │ │ │ │ │ └── rabbitmq │ │ │ │ │ │ ├── Application.java │ │ │ │ │ │ ├── adapter │ │ │ │ │ │ └── MessageDelegate.java │ │ │ │ │ │ ├── config │ │ │ │ │ │ └── RabbitMQConfig.java │ │ │ │ │ │ ├── convert │ │ │ │ │ │ ├── ConverterBody.java │ │ │ │ │ │ ├── ImageMessageConverter.java │ │ │ │ │ │ ├── PDFMessageConverter.java │ │ │ │ │ │ └── TextMessageConverter.java │ │ │ │ │ │ └── entity │ │ │ │ │ │ ├── Order.java │ │ │ │ │ │ └── Packaged.java │ │ │ │ └── resources │ │ │ │ │ └── application.properties │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── rabbitmq │ │ │ │ └── ApplicationTests.java │ │ ├── rabbitmq-springboot-consumer │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ ├── main │ │ │ │ ├── java │ │ │ │ │ └── com │ │ │ │ │ │ └── bfxy │ │ │ │ │ │ └── springboot │ │ │ │ │ │ ├── Application.java │ │ │ │ │ │ ├── MainConfig.java │ │ │ │ │ │ ├── conusmer │ │ │ │ │ │ └── RabbitReceiver.java │ │ │ │ │ │ └── entity │ │ │ │ │ │ └── Order.java │ │ │ │ └── resources │ │ │ │ │ └── application.properties │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── bfxy │ │ │ │ └── springboot │ │ │ │ └── ApplicationTests.java │ │ ├── rabbitmq-springboot-producer-reliable │ │ │ ├── docs │ │ │ │ └── test.sql │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ ├── main │ │ │ │ ├── java │ │ │ │ │ └── com │ │ │ │ │ │ └── bfxy │ │ │ │ │ │ └── springboot │ │ │ │ │ │ ├── Application.java │ │ │ │ │ │ ├── MainConfig.java │ │ │ │ │ │ ├── config │ │ │ │ │ │ ├── database │ │ │ │ │ │ │ ├── BaseMapper.java │ │ │ │ │ │ │ ├── DruidDataSourceConfig.java │ │ │ │ │ │ │ ├── DruidDataSourceSettings.java │ │ │ │ │ │ │ ├── MybatisDataSourceConfig.java │ │ │ │ │ │ │ └── MybatisMapperScanerConfig.java │ │ │ │ │ │ └── task │ │ │ │ │ │ │ └── TaskSchedulerConfig.java │ │ │ │ │ │ ├── constant │ │ │ │ │ │ └── Constants.java │ │ │ │ │ │ ├── entity │ │ │ │ │ │ ├── BrokerMessageLog.java │ │ │ │ │ │ └── Order.java │ │ │ │ │ │ ├── mapper │ │ │ │ │ │ ├── BrokerMessageLogMapper.java │ │ │ │ │ │ └── OrderMapper.java │ │ │ │ │ │ ├── mapping │ │ │ │ │ │ ├── BrokerMessageLogMapper.xml │ │ │ │ │ │ └── OrderMapper.xml │ │ │ │ │ │ ├── producer │ │ │ │ │ │ ├── RabbitOrderSender.java │ │ │ │ │ │ └── RabbitSender.java │ │ │ │ │ │ ├── service │ │ │ │ │ │ └── OrderService.java │ │ │ │ │ │ ├── task │ │ │ │ │ │ └── RetryMessageTasker.java │ │ │ │ │ │ └── utils │ │ │ │ │ │ └── FastJsonConvertUtil.java │ │ │ │ └── resources │ │ │ │ │ ├── application.properties │ │ │ │ │ └── druid.properties │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── bfxy │ │ │ │ └── springboot │ │ │ │ └── ApplicationTests.java │ │ ├── rabbitmq-springboot-producer │ │ │ ├── .gitignore │ │ │ ├── mvnw │ │ │ ├── mvnw.cmd │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ ├── main │ │ │ │ ├── java │ │ │ │ │ └── com │ │ │ │ │ │ └── bfxy │ │ │ │ │ │ └── springboot │ │ │ │ │ │ ├── Application.java │ │ │ │ │ │ ├── MainConfig.java │ │ │ │ │ │ ├── entity │ │ │ │ │ │ └── Order.java │ │ │ │ │ │ └── producer │ │ │ │ │ │ └── RabbitSender.java │ │ │ │ └── resources │ │ │ │ │ └── application.properties │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── bfxy │ │ │ │ └── springboot │ │ │ │ └── ApplicationTests.java │ │ ├── rabbitmq-springcloudstream-consumer │ │ │ ├── .gitignore │ │ │ ├── mvnw │ │ │ ├── mvnw.cmd │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ ├── main │ │ │ │ ├── java │ │ │ │ │ └── com │ │ │ │ │ │ └── bfxy │ │ │ │ │ │ └── rabbitmq │ │ │ │ │ │ ├── Application.java │ │ │ │ │ │ └── stream │ │ │ │ │ │ ├── Barista.java │ │ │ │ │ │ └── RabbitmqReceiver.java │ │ │ │ └── resources │ │ │ │ │ └── application.properties │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── bfxy │ │ │ │ └── rabbitmq │ │ │ │ └── ApplicationTests.java │ │ └── rabbitmq-springcloudstream-producer │ │ │ ├── .gitignore │ │ │ ├── mvnw │ │ │ ├── mvnw.cmd │ │ │ ├── pom.xml │ │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── bfxy │ │ │ │ │ └── rabbitmq │ │ │ │ │ ├── Application.java │ │ │ │ │ └── stream │ │ │ │ │ ├── Barista.java │ │ │ │ │ └── RabbitmqSender.java │ │ │ └── resources │ │ │ │ └── application.properties │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── bfxy │ │ │ └── rabbitmq │ │ │ └── ApplicationTests.java │ └── rocketmq │ │ ├── pom.xml │ │ ├── rocketmq-api │ │ ├── README.md │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ ├── batch │ │ │ ├── Consumer.java │ │ │ ├── ListSplitter.java │ │ │ ├── SimpleBatchProducer.java │ │ │ └── SplitBatchProducer.java │ │ │ ├── consumer │ │ │ ├── broadcast │ │ │ │ └── BroadCastConsumer.java │ │ │ ├── pull │ │ │ │ ├── PullConsumer.java │ │ │ │ └── PullScheduleConsumer.java │ │ │ ├── push │ │ │ │ └── PushConsumer.java │ │ │ └── retry │ │ │ │ ├── Consumer.java │ │ │ │ └── Producer.java │ │ │ ├── contants │ │ │ └── Const.java │ │ │ ├── filter │ │ │ ├── Consumer.java │ │ │ ├── Producer.java │ │ │ ├── SqlConsumer.java │ │ │ └── SqlProducer.java │ │ │ ├── ordermsg │ │ │ ├── ConsumerInOrder.java │ │ │ └── Producer.java │ │ │ ├── producer │ │ │ ├── PushConsumer.java │ │ │ ├── async │ │ │ │ └── AsyncProducer.java │ │ │ ├── oneway │ │ │ │ └── OnewayProducer.java │ │ │ └── sync │ │ │ │ └── SyncProducer.java │ │ │ ├── quickstart │ │ │ ├── Consumer.java │ │ │ └── Producer.java │ │ │ ├── schedulemsg │ │ │ ├── ScheduledMessageConsumer.java │ │ │ └── ScheduledMessageProducer.java │ │ │ └── transaction │ │ │ ├── Consumer.java │ │ │ ├── TransactionListenerImpl.java │ │ │ └── TransactionProducer.java │ │ ├── springboot-rocketmq │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── roy │ │ │ │ │ └── rocketmq │ │ │ │ │ ├── RocketMQSBApplication.java │ │ │ │ │ ├── basic │ │ │ │ │ ├── SpringConsumer.java │ │ │ │ │ └── SpringProducer.java │ │ │ │ │ ├── config │ │ │ │ │ ├── ExtRocketMQTemplate.java │ │ │ │ │ ├── MyTransactionImpl.java │ │ │ │ │ └── Swagger2.java │ │ │ │ │ ├── controller │ │ │ │ │ └── MQTestController.java │ │ │ │ │ └── domain │ │ │ │ │ ├── OrderPaidEvent.java │ │ │ │ │ ├── ProductWithPayload.java │ │ │ │ │ └── User.java │ │ │ └── resources │ │ │ │ └── application.properties │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── roy │ │ │ └── rocketmq │ │ │ └── SpringRocketTest.java │ │ └── springcloud-alibaba-rocketmq │ │ ├── README.md │ │ ├── pom.xml │ │ ├── rocketmq-consumer │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── cn │ │ │ │ └── cunchang │ │ │ │ ├── RocketmqConsumerApplication.java │ │ │ │ ├── listener │ │ │ │ ├── MessageChannel.java │ │ │ │ └── PayNoticeConsumer.java │ │ │ │ └── message │ │ │ │ └── PayResultMsg.java │ │ │ └── resources │ │ │ └── application.yml │ │ └── rocketmq-producer │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── cunchang │ │ │ ├── RocketmqProducerApplication.java │ │ │ ├── message │ │ │ ├── MessageChannel.java │ │ │ └── PayResultMsg.java │ │ │ └── producer │ │ │ └── ProducerController.java │ │ └── resources │ │ └── application.yml ├── session │ ├── jwt-session │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── cunchang │ │ │ │ │ ├── Application.java │ │ │ │ │ ├── config │ │ │ │ │ ├── LoginIntercepter.java │ │ │ │ │ └── WebMvcConfig.java │ │ │ │ │ └── controller │ │ │ │ │ └── UserController.java │ │ │ └── resources │ │ │ │ └── application.properties │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ └── ApplicationTests.java │ ├── redis-session │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── cunchang │ │ │ │ │ ├── Application.java │ │ │ │ │ └── controller │ │ │ │ │ └── UserController.java │ │ │ └── resources │ │ │ │ └── application.yml │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ └── ApplicationTests.java │ ├── spring-session │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── cuchang │ │ │ │ │ ├── Application.java │ │ │ │ │ └── controller │ │ │ │ │ └── UserController.java │ │ │ └── resources │ │ │ │ └── application.yml │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── cuchang │ │ │ └── ApplicationTests.java │ └── tomcat-session │ │ ├── pom.xml │ │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── cuchang │ │ │ │ ├── Application.java │ │ │ │ └── controller │ │ │ │ └── UserController.java │ │ └── resources │ │ │ └── application.properties │ │ └── test │ │ └── java │ │ └── cn │ │ └── cuchang │ │ └── ApplicationTests.java ├── sharding-sphere │ └── ShardingSphereDemo │ │ ├── README.md │ │ ├── pom.xml │ │ ├── sql │ │ ├── course.sql │ │ ├── t_dict.sql │ │ └── t_user.sql │ │ └── src │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── roy │ │ │ │ └── shardingDemo │ │ │ │ ├── ShardingJDBCApplication.java │ │ │ │ ├── algorithem │ │ │ │ ├── MyComplexDSShardingAlgorithm.java │ │ │ │ ├── MyComplexTableShardingAlgorithm.java │ │ │ │ ├── MyHintTableShardingAlgorithm.java │ │ │ │ ├── MyPreciseDSShardingAlgorithm.java │ │ │ │ ├── MyPreciseTableShardingAlgorithm.java │ │ │ │ ├── MyRangeDSShardingAlgorithm.java │ │ │ │ └── MyRangeTableShardingAlgorithm.java │ │ │ │ ├── entity │ │ │ │ ├── Course.java │ │ │ │ ├── Dict.java │ │ │ │ └── User.java │ │ │ │ └── mapper │ │ │ │ ├── CourseMapper.java │ │ │ │ ├── DictMapper.java │ │ │ │ └── UserMapper.java │ │ └── resources │ │ │ ├── application.properties │ │ │ ├── application01.properties │ │ │ ├── application02.properties │ │ │ ├── application03.properties │ │ │ ├── application04.properties │ │ │ └── application05.properties │ │ └── test │ │ └── java │ │ └── com │ │ └── roy │ │ └── shardingDemo │ │ └── ShardingJDBCTest.java ├── springcloud-debug │ ├── consumer │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── cn │ │ │ │ └── cunchang │ │ │ │ ├── ConsumerApplication.java │ │ │ │ └── HelloFeignClient.java │ │ │ └── resources │ │ │ └── application.yml │ ├── pom.xml │ └── producer │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── cunchang │ │ │ ├── HelloController.java │ │ │ └── ProducerApplication.java │ │ └── resources │ │ └── application.yml ├── springcloud-netflix │ ├── api-gateway │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── lastwhisper │ │ │ │ │ └── apigateway │ │ │ │ │ ├── ApiGatewayApplication.java │ │ │ │ │ ├── config │ │ │ │ │ ├── CorsConfig.java │ │ │ │ │ └── ZuulConfig.java │ │ │ │ │ ├── constant │ │ │ │ │ ├── CookieConstant.java │ │ │ │ │ └── RedisConstant.java │ │ │ │ │ ├── exception │ │ │ │ │ └── RateLimitException.java │ │ │ │ │ ├── filter │ │ │ │ │ ├── AuthBuyerFilter.java │ │ │ │ │ ├── AuthFilter.java │ │ │ │ │ ├── AuthSellerFilter.java │ │ │ │ │ ├── PostResponseHeaderFilter.java │ │ │ │ │ ├── PreTokenFilter.java │ │ │ │ │ └── RateLimiterFilter.java │ │ │ │ │ └── utils │ │ │ │ │ └── CookieUtil.java │ │ │ └── resources │ │ │ │ └── bootstrap.yml │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── apigateway │ │ │ └── ApiGatewayApplicationTests.java │ ├── client │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── lastwhisper │ │ │ │ │ └── client │ │ │ │ │ └── ClientApplication.java │ │ │ └── resources │ │ │ │ └── application.yml │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── client │ │ │ └── ClientApplicationTests.java │ ├── config │ │ ├── Dockerfile │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── lastwhisper │ │ │ │ │ └── config │ │ │ │ │ └── ConfigApplication.java │ │ │ └── resources │ │ │ │ └── application.yml │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── config │ │ │ └── ConfigApplicationTests.java │ ├── doc │ │ ├── API.md │ │ ├── README.md │ │ ├── springcloud.sql │ │ └── 思考与收获.txt │ ├── eureka │ │ ├── Dockerfile │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── lastwhisper │ │ │ │ │ └── eureka │ │ │ │ │ └── EurekaApplication.java │ │ │ └── resources │ │ │ │ └── application.yml │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── eureka │ │ │ └── EurekaApplicationTests.java │ ├── order-old │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── lastwhisper │ │ │ │ │ └── order │ │ │ │ │ ├── OrderApplication.java │ │ │ │ │ ├── client │ │ │ │ │ └── ProductClient.java │ │ │ │ │ ├── conf │ │ │ │ │ └── RestTemplateConfig.java │ │ │ │ │ ├── controller │ │ │ │ │ ├── FeignClientController.java │ │ │ │ │ ├── OrderController.java │ │ │ │ │ └── RestTemplateClientController.java │ │ │ │ │ ├── convert │ │ │ │ │ └── OrderForm2OrderDTOConvert.java │ │ │ │ │ ├── domain │ │ │ │ │ ├── OrderDetail.java │ │ │ │ │ ├── OrderMaster.java │ │ │ │ │ └── ProductInfo.java │ │ │ │ │ ├── dto │ │ │ │ │ ├── CartDTO.java │ │ │ │ │ └── OrderDTO.java │ │ │ │ │ ├── enums │ │ │ │ │ ├── OrderStatusEnum.java │ │ │ │ │ ├── PayStatusEnum.java │ │ │ │ │ └── ResultEnum.java │ │ │ │ │ ├── exception │ │ │ │ │ └── OrderException.java │ │ │ │ │ ├── form │ │ │ │ │ └── OrderForm.java │ │ │ │ │ ├── repository │ │ │ │ │ ├── OrderDetailRepository.java │ │ │ │ │ └── OrderMasterRepository.java │ │ │ │ │ ├── service │ │ │ │ │ ├── OrderService.java │ │ │ │ │ └── impl │ │ │ │ │ │ └── OrderServiceImpl.java │ │ │ │ │ ├── utils │ │ │ │ │ ├── KeyUtil.java │ │ │ │ │ └── ResultVOUtil.java │ │ │ │ │ └── vo │ │ │ │ │ └── ResultVO.java │ │ │ └── resources │ │ │ │ └── application.yml │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── order │ │ │ ├── OrderApplicationTests.java │ │ │ └── repository │ │ │ ├── OrderDetailRepositoryTest.java │ │ │ └── OrderMasterRepositoryTest.java │ ├── order │ │ ├── order-client │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── order │ │ │ │ └── client │ │ │ │ └── OrderClient.java │ │ ├── order-common │ │ │ └── pom.xml │ │ ├── order-server │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ ├── main │ │ │ │ ├── java │ │ │ │ │ └── cn │ │ │ │ │ │ └── lastwhisper │ │ │ │ │ │ └── order │ │ │ │ │ │ ├── OrderApplication.java │ │ │ │ │ │ ├── conf │ │ │ │ │ │ └── RestTemplateConfig.java │ │ │ │ │ │ ├── controller │ │ │ │ │ │ ├── EnvController.java │ │ │ │ │ │ ├── FeignClientController.java │ │ │ │ │ │ ├── HystrixController.java │ │ │ │ │ │ ├── OrderController.java │ │ │ │ │ │ ├── RestTemplateClientController.java │ │ │ │ │ │ └── SendMessageController.java │ │ │ │ │ │ ├── convert │ │ │ │ │ │ └── OrderForm2OrderDTOConvert.java │ │ │ │ │ │ ├── domain │ │ │ │ │ │ ├── OrderDetail.java │ │ │ │ │ │ ├── OrderMaster.java │ │ │ │ │ │ └── ProductInfo.java │ │ │ │ │ │ ├── dto │ │ │ │ │ │ ├── CartDTO.java │ │ │ │ │ │ └── OrderDTO.java │ │ │ │ │ │ ├── enums │ │ │ │ │ │ ├── OrderStatusEnum.java │ │ │ │ │ │ ├── PayStatusEnum.java │ │ │ │ │ │ └── ResultEnum.java │ │ │ │ │ │ ├── exception │ │ │ │ │ │ └── OrderException.java │ │ │ │ │ │ ├── form │ │ │ │ │ │ └── OrderForm.java │ │ │ │ │ │ ├── message │ │ │ │ │ │ ├── AmqpReceiver.java │ │ │ │ │ │ ├── ProductInfoReceiver.java │ │ │ │ │ │ ├── StreamClient.java │ │ │ │ │ │ └── StreamReceiver.java │ │ │ │ │ │ ├── repository │ │ │ │ │ │ ├── OrderDetailRepository.java │ │ │ │ │ │ └── OrderMasterRepository.java │ │ │ │ │ │ ├── service │ │ │ │ │ │ ├── OrderService.java │ │ │ │ │ │ └── impl │ │ │ │ │ │ │ └── OrderServiceImpl.java │ │ │ │ │ │ ├── utils │ │ │ │ │ │ ├── JsonUtil.java │ │ │ │ │ │ ├── KeyUtil.java │ │ │ │ │ │ └── ResultVOUtil.java │ │ │ │ │ │ └── vo │ │ │ │ │ │ └── ResultVO.java │ │ │ │ └── resources │ │ │ │ │ ├── META-INF │ │ │ │ │ └── additional-spring-configuration-metadata.json │ │ │ │ │ ├── application.txt │ │ │ │ │ └── bootstrap.yml │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── order │ │ │ │ ├── MqSenderTest.java │ │ │ │ ├── OrderApplicationTests.java │ │ │ │ └── repository │ │ │ │ ├── OrderDetailRepositoryTest.java │ │ │ │ └── OrderMasterRepositoryTest.java │ │ └── pom.xml │ ├── pom.xml │ ├── product-old │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── lastwhisper │ │ │ │ │ └── product │ │ │ │ │ ├── ProductApplication.java │ │ │ │ │ ├── controller │ │ │ │ │ ├── ProductController.java │ │ │ │ │ └── ServerController.java │ │ │ │ │ ├── domain │ │ │ │ │ ├── ProductCategory.java │ │ │ │ │ └── ProductInfo.java │ │ │ │ │ ├── dto │ │ │ │ │ └── CartDTO.java │ │ │ │ │ ├── enums │ │ │ │ │ ├── ProductStatusEnum.java │ │ │ │ │ └── ResultEnum.java │ │ │ │ │ ├── exception │ │ │ │ │ └── ProductExecption.java │ │ │ │ │ ├── repository │ │ │ │ │ ├── ProductCategoryRepository.java │ │ │ │ │ └── ProductInfoRepository.java │ │ │ │ │ ├── service │ │ │ │ │ ├── CategoryService.java │ │ │ │ │ ├── ProductService.java │ │ │ │ │ └── impl │ │ │ │ │ │ ├── CategoryServiceImpl.java │ │ │ │ │ │ └── ProductServiceImpl.java │ │ │ │ │ ├── utils │ │ │ │ │ └── ResultVOUtil.java │ │ │ │ │ └── vo │ │ │ │ │ ├── ProductInfoVO.java │ │ │ │ │ ├── ProductVO.java │ │ │ │ │ └── ResultVO.java │ │ │ └── resources │ │ │ │ └── application.yml │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── product │ │ │ ├── ProductApplicationTests.java │ │ │ ├── repository │ │ │ ├── ProductCategoryRepositoryTest.java │ │ │ └── ProductInfoRepositoryTest.java │ │ │ └── service │ │ │ ├── CategoryServiceTest.java │ │ │ └── ProductServiceTest.java │ ├── product │ │ ├── pom.xml │ │ ├── product-client │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── product │ │ │ │ └── client │ │ │ │ └── ProductClient.java │ │ ├── product-common │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── product │ │ │ │ └── common │ │ │ │ ├── DecreaseStockInput.java │ │ │ │ └── ProductInfoOutput.java │ │ └── product-server │ │ │ ├── pom.xml │ │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── product │ │ │ │ ├── ProductApplication.java │ │ │ │ ├── controller │ │ │ │ ├── ProductController.java │ │ │ │ └── ServerController.java │ │ │ │ ├── domain │ │ │ │ ├── ProductCategory.java │ │ │ │ └── ProductInfo.java │ │ │ │ ├── dto │ │ │ │ └── CartDTO.java │ │ │ │ ├── enums │ │ │ │ ├── ProductStatusEnum.java │ │ │ │ └── ResultEnum.java │ │ │ │ ├── exception │ │ │ │ └── ProductExecption.java │ │ │ │ ├── repository │ │ │ │ ├── ProductCategoryRepository.java │ │ │ │ └── ProductInfoRepository.java │ │ │ │ ├── service │ │ │ │ ├── CategoryService.java │ │ │ │ ├── ProductService.java │ │ │ │ └── impl │ │ │ │ │ ├── CategoryServiceImpl.java │ │ │ │ │ └── ProductServiceImpl.java │ │ │ │ ├── utils │ │ │ │ ├── JsonUtil.java │ │ │ │ └── ResultVOUtil.java │ │ │ │ └── vo │ │ │ │ ├── ProductInfoVO.java │ │ │ │ ├── ProductVO.java │ │ │ │ └── ResultVO.java │ │ │ └── resources │ │ │ ├── application.txt │ │ │ └── bootstrap.yml │ └── user │ │ ├── pom.xml │ │ └── user-server │ │ ├── pom.xml │ │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── user │ │ │ │ ├── UserApplication.java │ │ │ │ ├── constant │ │ │ │ ├── CookieConstant.java │ │ │ │ └── RedisConstant.java │ │ │ │ ├── controller │ │ │ │ └── LoginController.java │ │ │ │ ├── domain │ │ │ │ └── UserInfo.java │ │ │ │ ├── enums │ │ │ │ ├── ResultEnum.java │ │ │ │ └── RoleEnum.java │ │ │ │ ├── repository │ │ │ │ └── UserRepository.java │ │ │ │ ├── service │ │ │ │ ├── UserService.java │ │ │ │ └── impl │ │ │ │ │ └── UserServiceImpl.java │ │ │ │ ├── utils │ │ │ │ ├── CookieUtil.java │ │ │ │ ├── JsonUtil.java │ │ │ │ └── ResultVOUtil.java │ │ │ │ └── vo │ │ │ │ └── ResultVO.java │ │ └── resources │ │ │ └── bootstrap.yml │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── test │ │ └── UserApplicationTests.java └── transaction │ ├── README.md │ ├── demo │ ├── account-service │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── cn │ │ │ │ └── itcast │ │ │ │ └── account │ │ │ │ ├── AccountApplication.java │ │ │ │ ├── entity │ │ │ │ └── Account.java │ │ │ │ ├── mapper │ │ │ │ └── AccountMapper.java │ │ │ │ ├── service │ │ │ │ ├── AccountService.java │ │ │ │ └── impl │ │ │ │ │ └── AccountServiceImpl.java │ │ │ │ └── web │ │ │ │ └── AccountController.java │ │ │ └── resources │ │ │ └── application.yml │ ├── eureka-server │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── cn │ │ │ │ └── itcast │ │ │ │ └── eureka │ │ │ │ └── EurekaApplication.java │ │ │ └── resources │ │ │ └── application.yml │ ├── order-service │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── cn │ │ │ │ └── itcast │ │ │ │ └── order │ │ │ │ ├── OrderApplication.java │ │ │ │ ├── client │ │ │ │ ├── AccountClient.java │ │ │ │ └── StorageClient.java │ │ │ │ ├── entity │ │ │ │ └── Order.java │ │ │ │ ├── mapper │ │ │ │ └── OrderMapper.java │ │ │ │ ├── service │ │ │ │ ├── OrderService.java │ │ │ │ └── impl │ │ │ │ │ └── OrderServiceImpl.java │ │ │ │ └── web │ │ │ │ └── OrderController.java │ │ │ └── resources │ │ │ └── application.yml │ ├── pom.xml │ └── storage-service │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── itcast │ │ │ └── storage │ │ │ ├── StorageApplication.java │ │ │ ├── entity │ │ │ └── Storage.java │ │ │ ├── mapper │ │ │ └── StorageMapper.java │ │ │ ├── service │ │ │ ├── StorageService.java │ │ │ └── impl │ │ │ │ └── StorageServiceImpl.java │ │ │ └── web │ │ │ └── StorageController.java │ │ └── resources │ │ └── application.yml │ ├── seata-AT-demo │ ├── account-service │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── cn │ │ │ │ └── itcast │ │ │ │ └── account │ │ │ │ ├── AccountApplication.java │ │ │ │ ├── config │ │ │ │ └── DataSourceProxyConfig.java │ │ │ │ ├── entity │ │ │ │ └── Account.java │ │ │ │ ├── mapper │ │ │ │ └── AccountMapper.java │ │ │ │ ├── service │ │ │ │ ├── AccountService.java │ │ │ │ └── impl │ │ │ │ │ └── AccountServiceImpl.java │ │ │ │ └── web │ │ │ │ └── AccountController.java │ │ │ └── resources │ │ │ ├── application.yml │ │ │ ├── file.conf │ │ │ └── registry.conf │ ├── eureka-server │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── cn │ │ │ │ └── itcast │ │ │ │ └── eureka │ │ │ │ └── EurekaApplication.java │ │ │ └── resources │ │ │ └── application.yml │ ├── order-service │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── cn │ │ │ │ └── itcast │ │ │ │ └── order │ │ │ │ ├── OrderApplication.java │ │ │ │ ├── client │ │ │ │ ├── AccountClient.java │ │ │ │ └── StorageClient.java │ │ │ │ ├── config │ │ │ │ └── DataSourceProxyConfig.java │ │ │ │ ├── entity │ │ │ │ └── Order.java │ │ │ │ ├── mapper │ │ │ │ └── OrderMapper.java │ │ │ │ ├── service │ │ │ │ ├── OrderService.java │ │ │ │ └── impl │ │ │ │ │ └── OrderServiceImpl.java │ │ │ │ └── web │ │ │ │ └── OrderController.java │ │ │ └── resources │ │ │ ├── application.yml │ │ │ ├── file.conf │ │ │ └── registry.conf │ ├── pom.xml │ └── storage-service │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── itcast │ │ │ └── storage │ │ │ ├── StorageApplication.java │ │ │ ├── config │ │ │ └── DataSourceProxyConfig.java │ │ │ ├── entity │ │ │ └── Storage.java │ │ │ ├── mapper │ │ │ └── StorageMapper.java │ │ │ ├── service │ │ │ ├── StorageService.java │ │ │ └── impl │ │ │ │ └── StorageServiceImpl.java │ │ │ └── web │ │ │ └── StorageController.java │ │ └── resources │ │ ├── application.yml │ │ ├── file.conf │ │ └── registry.conf │ ├── seata_demo.sql │ └── 分布式事务.zip ├── framework ├── flyway │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── flyway │ │ │ └── App.java │ │ └── resources │ │ └── db │ │ └── migration │ │ ├── V1__Create_person_table.sql │ │ └── V2__Add_people.sql ├── guava │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ ├── bloomfilter │ │ └── TestBloomFilter.java │ │ ├── cache │ │ └── TestCache.java │ │ ├── collection │ │ └── MapTest.java │ │ └── limit │ │ ├── TestRateLimiter.java │ │ └── TokenBucket.java ├── hutool │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── cunchang │ │ ├── IDUtilTest.java │ │ └── ZipUtilTest.java ├── pinyin4j │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ ├── DeCode.java │ │ └── PinYinUtil.java └── tika │ ├── pom.xml │ └── src │ ├── main │ ├── java │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── TikaApplication.java │ └── resources │ │ └── application.properties │ └── test │ ├── java │ └── cn │ │ └── lastwhisper │ │ ├── TikaApplicationTests.java │ │ └── TikaTest.java │ └── resources │ ├── TikaApplication.java │ ├── application.properties │ ├── mapreduce-osdi04.pdf │ ├── office.xlsx │ ├── template.xls │ ├── timg │ ├── timg.gif │ ├── timg.jpg │ ├── timg.jpg.zip │ ├── transportation.png │ ├── 测试.docx │ └── 测试.xlsx ├── java-advance ├── README.md ├── annotation │ ├── PluggableAnnotationProcessingAPI │ │ ├── mylombok-test │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── cn │ │ │ │ └── cunchang │ │ │ │ └── Person.java │ │ └── mylombok │ │ │ ├── pom.xml │ │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── cn │ │ │ │ └── cunchang │ │ │ │ ├── MyGetter.java │ │ │ │ └── MyGetterProcessor.java │ │ │ └── resources │ │ │ └── META-INF │ │ │ └── services │ │ │ └── javax.annotation.processing.Processor │ ├── README.md │ └── annatation │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── cunchang │ │ ├── AnnotationTest.java │ │ ├── corejava │ │ ├── buttons3 │ │ │ ├── ButtonFrame.java │ │ │ └── ButtonTest.java │ │ └── runtimeAnnotations │ │ │ ├── ActionListenerFor.java │ │ │ └── ActionListenerInstaller.java │ │ ├── dynamicvalue │ │ ├── JsonProperty.java │ │ └── StudentRsp.java │ │ └── syntax │ │ ├── Level.java │ │ ├── MetaAnnotation.java │ │ ├── MyAnnotation.java │ │ └── UseAnnotation.java ├── groovy │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── cunchang │ │ │ ├── Client.java │ │ │ ├── Constants.java │ │ │ └── PaymentRequestOrderBO.java │ │ └── resources │ │ ├── Demo.groovy │ │ └── rsp.json ├── javaagent │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ ├── Agent.java │ │ └── AgentTest.java ├── javassist │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── javassist │ │ ├── DispatcherServletCollect.java │ │ ├── Error1.java │ │ ├── Error2.java │ │ ├── JavassistDynamicProxyClass.java │ │ ├── JavassistDynamicProxyInterface.java │ │ ├── JavassistMonitorMethod.java │ │ ├── JavassistMonitorServlet.java │ │ └── StringUtil.java ├── network │ └── socketproxy │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── cunchang │ │ ├── CreateSecretKey.java │ │ ├── LineBuffer.java │ │ ├── ProxyHandleThread.java │ │ ├── ProxyServer.java │ │ ├── SocketHandle.java │ │ └── SocketProxy.java ├── proxy │ ├── README.md │ ├── com │ │ └── sun │ │ │ └── proxy │ │ │ └── $Proxy0.class │ ├── jdk-proxy │ │ ├── README.md │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ ├── v1 │ │ │ ├── ProxyInvocationHandler.java │ │ │ ├── ProxyTest.java │ │ │ ├── Subject.java │ │ │ ├── SubjectImpl.java │ │ │ └── equal │ │ │ │ ├── $Proxy0.java │ │ │ │ ├── ProxyInvocationHandler.java │ │ │ │ ├── ProxyTest.java │ │ │ │ ├── Subject.java │ │ │ │ └── SubjectImpl.java │ │ │ ├── v2 │ │ │ ├── ProxyInvocationHandler.java │ │ │ ├── ProxyTest.java │ │ │ └── Subject.java │ │ │ └── v3 │ │ │ ├── AbstractProxy.java │ │ │ ├── ProxyInvocationHandler.java │ │ │ └── ProxyTest.java │ ├── mybatis-mapper │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ ├── Main.java │ │ │ ├── MyMapperProxy.java │ │ │ ├── SqlSession.java │ │ │ ├── SysUser.java │ │ │ └── UserMapper.java │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── cunchang │ │ ├── Client.java │ │ ├── Moveable.java │ │ ├── Tank.java │ │ ├── cglib │ │ └── RunMethodIntercepot.java │ │ ├── jdkdynamic │ │ └── JdkTimeHandler.java │ │ ├── myjdkdynamic │ │ ├── InvocationHandler.java │ │ ├── MyClassLoader.java │ │ ├── Proxy1.java │ │ ├── Proxy2.java │ │ ├── Proxy3.java │ │ └── TimeHandler.java │ │ └── staticproxy │ │ ├── combination │ │ ├── TankLogProxy1.java │ │ └── TankTimeProxy1.java │ │ └── inherit │ │ ├── TankLogTimeProxy.java │ │ └── TankTimeProxy.java └── spi │ ├── README.md │ ├── pom.xml │ ├── spi-jdbc-interface │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── jdbc │ │ ├── Driver.java │ │ └── DriverManager.java │ ├── spi-mysql │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── mysql │ │ │ └── MysqlDriver.java │ │ └── resources │ │ └── META-INF │ │ └── services │ │ └── cn.jdbc.Driver │ ├── spi-oracle │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── oracle │ │ │ └── OracleDriver.java │ │ └── resources │ │ └── META-INF │ │ └── services │ │ └── cn.jdbc.Driver │ └── web-client │ ├── pom.xml │ └── src │ └── main │ ├── java │ └── cn │ │ └── lastwhisper │ │ └── JdbcUtil.java │ └── resources │ └── META-INF │ └── services │ └── cn.jdbc.Driver ├── java-basic ├── README.MD ├── basic │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── cunchang │ │ │ ├── Jsq.java │ │ │ ├── Main.java │ │ │ ├── README.md │ │ │ ├── RandomTest.java │ │ │ ├── collection │ │ │ ├── ArraysTest.java │ │ │ ├── Intersection.java │ │ │ └── README.md │ │ │ ├── cpu │ │ │ └── ControlCpu.java │ │ │ ├── date │ │ │ ├── AggregateTypeEnum.java │ │ │ ├── LocalDateTest.java │ │ │ ├── LocalDateUtil.java │ │ │ └── Pair.java │ │ │ ├── decimal │ │ │ └── BigDecimalTest.java │ │ │ ├── guava │ │ │ ├── bloomfilter │ │ │ │ └── TestBloomFilter.java │ │ │ ├── cache │ │ │ │ └── TestCache.java │ │ │ ├── collection │ │ │ │ └── MapTest.java │ │ │ └── limit │ │ │ │ ├── TestRateLimiter.java │ │ │ │ └── TokenBucket.java │ │ │ ├── hutool │ │ │ ├── IDUtilTest.java │ │ │ └── ZipUtilTest.java │ │ │ ├── json │ │ │ ├── FeatureComment.java │ │ │ ├── JSONObjectTest.java │ │ │ └── biz │ │ │ │ ├── Biz.java │ │ │ │ ├── BizTest.java │ │ │ │ └── RuleTypeEnum.java │ │ │ ├── packagesacn │ │ │ ├── ClasspathPackageScanner.java │ │ │ ├── PackageScanner.java │ │ │ └── StringUtil.java │ │ │ ├── pinyin4j │ │ │ ├── DeCode.java │ │ │ └── PinYinUtil.java │ │ │ ├── regex │ │ │ └── RegExTest.java │ │ │ ├── spring │ │ │ ├── SpringELTest.java │ │ │ └── StopWatchTest.java │ │ │ ├── str │ │ │ └── StringTest.java │ │ │ ├── sugar │ │ │ └── type │ │ │ │ ├── A.java │ │ │ │ ├── B.java │ │ │ │ └── README.md │ │ │ ├── sysproperty │ │ │ └── SystemProperty.java │ │ │ └── trycatch │ │ │ └── ForTryFinallyTest.java │ │ └── resources │ │ └── log4j2.xml ├── concurrent │ ├── README.md │ ├── jmm-specification │ │ ├── README.md │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ ├── AsIfSerialSample.java │ │ │ ├── Jmm01_HappensBefore.java │ │ │ ├── Jmm02_CpuCache.java │ │ │ ├── Jmm03_CodeVisibility.java │ │ │ ├── Jmm04_CodeAtomic.java │ │ │ ├── Jmm05_CodeReorder.java │ │ │ ├── Jmm06_MemoryBarrier.java │ │ │ ├── Jmm07_ByteCodeJitDump.java │ │ │ ├── JmmCausalityCase16Test.java │ │ │ ├── dcl │ │ │ └── Singleton.java │ │ │ ├── tmodel │ │ │ └── ThreadModel.java │ │ │ └── util │ │ │ └── UnsafeInstance.java │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── concurrent │ │ ├── UncaughtExceptionHandler │ │ ├── ExecuteCaught.java │ │ ├── ExecuteCaught2.java │ │ ├── InitiativeCaught.java │ │ ├── NoCaughtThread.java │ │ ├── README.md │ │ ├── Task.java │ │ └── WitchCaughtThread.java │ │ ├── basic │ │ ├── Daemon.java │ │ ├── DeadLockDemo.java │ │ ├── Deprecated.java │ │ ├── Interrupted │ │ │ ├── InterruptLockSupportDemo.java │ │ │ ├── InterruptNotAliveDemo.java │ │ │ ├── InterruptReadCancelDemo.java │ │ │ ├── InterruptReadDemo.java │ │ │ ├── InterruptRunnableDemo.java │ │ │ ├── InterruptSynchronizedDemo.java │ │ │ ├── InterruptWaitingDemo.java │ │ │ ├── README.md │ │ │ └── Shutdown.java │ │ ├── README.md │ │ ├── SleepUtils.java │ │ ├── communicate │ │ │ ├── Join.java │ │ │ ├── Piped.java │ │ │ ├── README.md │ │ │ └── WaitNotify.java │ │ ├── createthread │ │ │ └── TestCallable.java │ │ ├── state │ │ │ ├── ThreadState.java │ │ │ └── jstack.txt │ │ ├── synchronized1 │ │ │ ├── Juc_PrintMarkWord.java │ │ │ ├── README.md │ │ │ ├── T0_BasicLock.java │ │ │ ├── T0_ObjectSize.java │ │ │ ├── T0_ObjectStackAlloc.java │ │ │ └── T0_heavyWeightMonitor.java │ │ ├── threadlocal │ │ │ ├── AlibabaThreadLocalDemo.java │ │ │ ├── InheritableThreadLocalDemo.java │ │ │ ├── InheritableThreadLocalDemo2.java │ │ │ ├── README.md │ │ │ ├── ThreadLocalDemo.java │ │ │ ├── ThreadLocalDemo2.java │ │ │ ├── ThreadLocalMemoryLeak.java │ │ │ └── ThreadLocal_GC_Demo.java │ │ └── volatileDemo │ │ │ ├── Main.java │ │ │ ├── VolatileDemo.java │ │ │ ├── VolatileDemo2.java │ │ │ ├── VolatileRefExample.java │ │ │ └── VolatileRefExample2.java │ │ ├── example │ │ ├── README.md │ │ ├── alternate │ │ │ └── TestABCAlternateForLock.java │ │ ├── future │ │ │ ├── Data.java │ │ │ ├── FutureClient.java │ │ │ ├── FutureData.java │ │ │ ├── Main.java │ │ │ ├── README.md │ │ │ └── RealData.java │ │ └── productconsumer │ │ │ ├── blockqueue │ │ │ └── ProdConsumer_BlockQueueDemo.java │ │ │ ├── lockcondition │ │ │ └── TestProductAndConsumerForLock.java │ │ │ └── waitnotify │ │ │ ├── TestProductAndConsumer.java │ │ │ └── TestProductAndConsumer2.java │ │ ├── juc │ │ ├── README.md │ │ ├── aqs │ │ │ ├── AQSDemo.java │ │ │ ├── README.md │ │ │ ├── ThreadNoSafe.java │ │ │ ├── ThreadSafe.java │ │ │ ├── mylock1 │ │ │ │ ├── MLock.java │ │ │ │ └── Main.java │ │ │ └── mylock2 │ │ │ │ ├── MLock.java │ │ │ │ └── Main.java │ │ ├── blockingqueue │ │ │ ├── ArrayBlockingQueueDemo.java │ │ │ ├── DelayQueueDemo.java │ │ │ ├── PriorityBlockingQueueDemo.java │ │ │ └── SynchronousQueueDemo.java │ │ ├── cas │ │ │ ├── ABADemo.java │ │ │ ├── AtomicIntegerTest.java │ │ │ └── CASDemo.java │ │ ├── completefuture │ │ │ ├── CFutureMain1.java │ │ │ ├── CFutureMain2.java │ │ │ ├── CFutureMain3.java │ │ │ ├── CFutureMain4.java │ │ │ ├── CFutureMain5.java │ │ │ ├── CFutureMain6.java │ │ │ └── README.md │ │ ├── executor │ │ │ ├── ForkJoinPoolTest.java │ │ │ ├── README.md │ │ │ ├── RejectedExecutionHandlerTest.java │ │ │ ├── ScheduledExecutorTest.java │ │ │ ├── ThreadPoolExceptionTest.java │ │ │ ├── ThreadPoolIdTest.java │ │ │ └── trace │ │ │ │ ├── CatchException.java │ │ │ │ ├── DivTask.java │ │ │ │ ├── README.md │ │ │ │ ├── TraceMain.java │ │ │ │ └── TraceThreadPoolExecutor.java │ │ ├── future │ │ │ ├── FutureTest.java │ │ │ └── Task.java │ │ ├── lock │ │ │ ├── ReentrantLockDemo.java │ │ │ ├── ReentrantLockInterruptedDemo.java │ │ │ ├── SpinLockDemo.java │ │ │ ├── TestLock.java │ │ │ ├── TestManyReadOneWriteCollection.java │ │ │ └── TestReadWriteLock.java │ │ ├── locksupport │ │ │ ├── LockSupportDemo.java │ │ │ └── README.md │ │ └── tools │ │ │ ├── ExchangerDemo.java │ │ │ ├── README.md │ │ │ ├── TestCountDownLatch.java │ │ │ ├── TestCountDownLatch2.java │ │ │ ├── TestCyclicBarrier.java │ │ │ ├── TestCyclicBarrier2.java │ │ │ └── TestSemaphore.java │ │ └── unsafe │ │ ├── README.md │ │ ├── UnSafeCreateTest.java │ │ ├── UnSafeMemoryTest.java │ │ ├── UnSafeOpArrayTest.java │ │ ├── UnSafeParkTest.java │ │ └── UnsafeCasTest.java ├── design-pattern │ ├── README.md │ ├── notes │ │ ├── 创建型模式——单例模式(四).md │ │ ├── 创建型模式——原型模式(五).md │ │ ├── 创建型模式——工厂方法(一).md │ │ ├── 创建型模式——建造者模式(三).md │ │ ├── 创建型模式——抽象工厂(二).md │ │ ├── 创建型模式——简单工厂(不在GOF23种设计模式中).md │ │ ├── 结构型模式——享元模式.md │ │ ├── 结构型模式——代理模式(七).md │ │ ├── 结构型模式——外观模式(一).md │ │ ├── 结构型模式——桥接模式(六).md │ │ ├── 结构型模式——组合模式(五).md │ │ ├── 结构型模式——装饰者模式(二).md │ │ ├── 结构型模式——适配器模式(三).md │ │ ├── 行为型模式——中介者模式(八).md │ │ ├── 行为型模式——命令模式(七).md │ │ ├── 行为型模式——备忘录模式(六).md │ │ ├── 行为型模式——模板方法(一).md │ │ ├── 行为型模式——状态模式(十一).md │ │ ├── 行为型模式——策略模式(三).md │ │ ├── 行为型模式——观察者模式(五).md │ │ ├── 行为型模式——解释器模式(四).md │ │ ├── 行为型模式——访问者模式(十).md │ │ ├── 行为型模式——责任链模式(九).md │ │ └── 行为型模式——迭代器模式(二).md │ ├── pom.xml │ ├── src │ │ └── main │ │ │ └── java │ │ │ └── com │ │ │ └── desgin │ │ │ ├── advance │ │ │ └── decorator_vs_proxy │ │ │ │ ├── Boxer.java │ │ │ │ ├── BoxerImpl.java │ │ │ │ ├── Client.java │ │ │ │ ├── README.md │ │ │ │ ├── decorator │ │ │ │ └── FastShoesDecorator.java │ │ │ │ └── proxy │ │ │ │ └── AgentProxy.java │ │ │ ├── mashibing │ │ │ ├── chainofresponsibility │ │ │ │ ├── README.md │ │ │ │ ├── abstractImpl │ │ │ │ │ ├── v1 │ │ │ │ │ │ ├── Client.java │ │ │ │ │ │ └── Handler.java │ │ │ │ │ ├── v2 │ │ │ │ │ │ ├── Chain.java │ │ │ │ │ │ ├── ChainClient.java │ │ │ │ │ │ └── ChainHandler.java │ │ │ │ │ └── v3 │ │ │ │ │ │ ├── Chain.java │ │ │ │ │ │ ├── ChainClient.java │ │ │ │ │ │ └── ChainHandler.java │ │ │ │ └── interfaceImpl │ │ │ │ │ ├── v1 │ │ │ │ │ ├── Main.java │ │ │ │ │ └── MsgProcessor.java │ │ │ │ │ ├── v2 │ │ │ │ │ ├── FaceFilter.java │ │ │ │ │ ├── Filter.java │ │ │ │ │ ├── HTMLFilter.java │ │ │ │ │ ├── Main.java │ │ │ │ │ ├── MsgProcessor.java │ │ │ │ │ └── SesitiveFilter.java │ │ │ │ │ ├── v3 │ │ │ │ │ ├── FaceFilter.java │ │ │ │ │ ├── Filter.java │ │ │ │ │ ├── FilterChain.java │ │ │ │ │ ├── HTMLFilter.java │ │ │ │ │ ├── Main.java │ │ │ │ │ └── SesitiveFilter.java │ │ │ │ │ ├── v4 │ │ │ │ │ ├── FaceFilter.java │ │ │ │ │ ├── Filter.java │ │ │ │ │ ├── FilterChain.java │ │ │ │ │ ├── HTMLFilter.java │ │ │ │ │ ├── Main.java │ │ │ │ │ ├── Request.java │ │ │ │ │ ├── Response.java │ │ │ │ │ └── SesitiveFilter.java │ │ │ │ │ └── v5 │ │ │ │ │ ├── AbstractFilter.java │ │ │ │ │ ├── FaceFilter.java │ │ │ │ │ ├── Filter.java │ │ │ │ │ ├── FilterChain.java │ │ │ │ │ ├── HTMLFilter.java │ │ │ │ │ ├── Main.java │ │ │ │ │ ├── Request.java │ │ │ │ │ ├── Response.java │ │ │ │ │ └── SesitiveFilter.java │ │ │ ├── command │ │ │ │ ├── Boy.java │ │ │ │ ├── Command.java │ │ │ │ ├── HugCommand.java │ │ │ │ ├── MM.java │ │ │ │ └── ShoppingCommand.java │ │ │ ├── iterator │ │ │ │ ├── ArrayList.java │ │ │ │ ├── Cat.java │ │ │ │ ├── Collection.java │ │ │ │ ├── Iterator.java │ │ │ │ ├── LinkedList.java │ │ │ │ ├── Node.java │ │ │ │ ├── Test.java │ │ │ │ └── generic │ │ │ │ │ └── GenericArrayList.java │ │ │ └── strategy │ │ │ │ ├── Cat.java │ │ │ │ ├── CatHeightComparator.java │ │ │ │ ├── CatWeightComparator.java │ │ │ │ ├── Comparable.java │ │ │ │ ├── Comparator.java │ │ │ │ ├── DataSorter.java │ │ │ │ ├── Dog.java │ │ │ │ └── Test.java │ │ │ ├── pattern │ │ │ ├── behavioral │ │ │ │ ├── chainofresponsibility │ │ │ │ │ └── README.md │ │ │ │ ├── command │ │ │ │ │ ├── CloseCourseVideoCommand.java │ │ │ │ │ ├── Command.java │ │ │ │ │ ├── CourseVideo.java │ │ │ │ │ ├── OpenCourseVideoCommand.java │ │ │ │ │ ├── Staff.java │ │ │ │ │ └── Test.java │ │ │ │ ├── interpreter │ │ │ │ │ ├── Calculator.java │ │ │ │ │ ├── Client.java │ │ │ │ │ ├── DivNode.java │ │ │ │ │ ├── ModNode.java │ │ │ │ │ ├── MulNode.java │ │ │ │ │ ├── Node.java │ │ │ │ │ ├── SymbolNode.java │ │ │ │ │ ├── ValueNode.java │ │ │ │ │ └── springel │ │ │ │ │ │ └── SpringTest.java │ │ │ │ ├── iterator │ │ │ │ │ ├── Course.java │ │ │ │ │ ├── CourseAggregate.java │ │ │ │ │ ├── CourseAggregateImpl.java │ │ │ │ │ ├── CourseIterator.java │ │ │ │ │ ├── CourseIteratorImpl.java │ │ │ │ │ └── Test.java │ │ │ │ ├── mediator │ │ │ │ │ ├── StudyGroup.java │ │ │ │ │ ├── Test.java │ │ │ │ │ ├── User.java │ │ │ │ │ └── my │ │ │ │ │ │ ├── Client.java │ │ │ │ │ │ ├── HouseOwner.java │ │ │ │ │ │ ├── Mediator.java │ │ │ │ │ │ ├── MediatorStructure.java │ │ │ │ │ │ ├── Person.java │ │ │ │ │ │ └── Tenant.java │ │ │ │ ├── memento │ │ │ │ │ ├── Article.java │ │ │ │ │ ├── ArticleMemento.java │ │ │ │ │ ├── ArticleMementoManager.java │ │ │ │ │ ├── Test.java │ │ │ │ │ └── my │ │ │ │ │ │ ├── Caretaker.java │ │ │ │ │ │ ├── Client.java │ │ │ │ │ │ ├── Memento.java │ │ │ │ │ │ └── Role.java │ │ │ │ ├── observer │ │ │ │ │ ├── Course.java │ │ │ │ │ ├── Question.java │ │ │ │ │ ├── Teacher.java │ │ │ │ │ ├── Test.java │ │ │ │ │ ├── guavatest │ │ │ │ │ │ ├── GuavaEvent.java │ │ │ │ │ │ └── GuavaEventTest.java │ │ │ │ │ └── my │ │ │ │ │ │ ├── Observer.java │ │ │ │ │ │ ├── Observerable.java │ │ │ │ │ │ ├── Test.java │ │ │ │ │ │ ├── User.java │ │ │ │ │ │ └── WechatServer.java │ │ │ │ ├── state │ │ │ │ │ ├── CourseVideoContext.java │ │ │ │ │ ├── CourseVideoState.java │ │ │ │ │ ├── PauseState.java │ │ │ │ │ ├── PlayState.java │ │ │ │ │ ├── SpeedState.java │ │ │ │ │ ├── StopState.java │ │ │ │ │ └── Test.java │ │ │ │ ├── strategy │ │ │ │ │ ├── EmptyPromotionStrategy.java │ │ │ │ │ ├── FanXianPromotionStrategy.java │ │ │ │ │ ├── LiJianPromotionStrategy.java │ │ │ │ │ ├── ManJianPromotionStrategy.java │ │ │ │ │ ├── PromotionActivity.java │ │ │ │ │ ├── PromotionStrategy.java │ │ │ │ │ ├── PromotionStrategyFactory.java │ │ │ │ │ └── Test.java │ │ │ │ ├── templatemethod │ │ │ │ │ ├── ACourse.java │ │ │ │ │ ├── DesignPatternCourse.java │ │ │ │ │ ├── FECourse.java │ │ │ │ │ ├── Test.java │ │ │ │ │ └── my │ │ │ │ │ │ ├── Abstract.java │ │ │ │ │ │ ├── ConcreteClass_BaoCai.java │ │ │ │ │ │ ├── ConcreteClass_CaiXin.java │ │ │ │ │ │ └── Test.java │ │ │ │ └── visitor │ │ │ │ │ ├── CodingCourse.java │ │ │ │ │ ├── Course.java │ │ │ │ │ ├── FreeCourse.java │ │ │ │ │ ├── IVisitor.java │ │ │ │ │ ├── Test.java │ │ │ │ │ └── Visitor.java │ │ │ ├── creational │ │ │ │ ├── abstractfactory │ │ │ │ │ ├── Article.java │ │ │ │ │ ├── CourseFactory.java │ │ │ │ │ ├── JavaArticle.java │ │ │ │ │ ├── JavaCourseFactory.java │ │ │ │ │ ├── JavaVideo.java │ │ │ │ │ ├── PythonArticle.java │ │ │ │ │ ├── PythonCourseFactory.java │ │ │ │ │ ├── PythonVideo.java │ │ │ │ │ ├── Test.java │ │ │ │ │ └── Video.java │ │ │ │ ├── builder │ │ │ │ │ ├── Coach.java │ │ │ │ │ ├── Course.java │ │ │ │ │ ├── CourseActualBuilder.java │ │ │ │ │ ├── CourseBuilder.java │ │ │ │ │ ├── Test.java │ │ │ │ │ └── V2 │ │ │ │ │ │ ├── Course.java │ │ │ │ │ │ └── Test.java │ │ │ │ ├── factorymethod │ │ │ │ │ ├── FEVideo.java │ │ │ │ │ ├── FEVideoFactory.java │ │ │ │ │ ├── JavaVideo.java │ │ │ │ │ ├── JavaVideoFactory.java │ │ │ │ │ ├── PythonVideo.java │ │ │ │ │ ├── PythonVideoFactory.java │ │ │ │ │ ├── Test.java │ │ │ │ │ ├── Video.java │ │ │ │ │ └── VideoFactory.java │ │ │ │ ├── prototype │ │ │ │ │ ├── abstractprototype │ │ │ │ │ │ ├── A.java │ │ │ │ │ │ └── B.java │ │ │ │ │ └── my │ │ │ │ │ │ ├── Resume.java │ │ │ │ │ │ └── Test.java │ │ │ │ ├── simplefactory │ │ │ │ │ ├── JavaVideo.java │ │ │ │ │ ├── PythonVideo.java │ │ │ │ │ ├── Test.java │ │ │ │ │ ├── Video.java │ │ │ │ │ └── VideoFactory.java │ │ │ │ └── singleton │ │ │ │ │ ├── CASSingleton.java │ │ │ │ │ ├── CASSingletonTest.java │ │ │ │ │ ├── ContainerSingleton.java │ │ │ │ │ ├── EnumInstance.java │ │ │ │ │ ├── HungrySingleton.java │ │ │ │ │ ├── LazyDoubleCheckSingleton.java │ │ │ │ │ ├── LazySingleton.java │ │ │ │ │ ├── StaticInnerClassSingleton.java │ │ │ │ │ ├── T.java │ │ │ │ │ ├── Test.java │ │ │ │ │ ├── Test1.java │ │ │ │ │ ├── ThreadLocalInstance.java │ │ │ │ │ ├── ThreadTest.java │ │ │ │ │ └── my │ │ │ │ │ ├── Singleton1.java │ │ │ │ │ ├── Singleton2.java │ │ │ │ │ ├── Singleton3.java │ │ │ │ │ ├── Singleton4.java │ │ │ │ │ └── Singleton5.java │ │ │ └── structural │ │ │ │ ├── adapter │ │ │ │ ├── classadapter │ │ │ │ │ ├── Adaptee.java │ │ │ │ │ ├── Adapter.java │ │ │ │ │ ├── ConcreteTarget.java │ │ │ │ │ ├── Target.java │ │ │ │ │ └── Test.java │ │ │ │ ├── exmaple │ │ │ │ │ ├── AC220.java │ │ │ │ │ ├── DC5.java │ │ │ │ │ ├── PowerAdapter.java │ │ │ │ │ └── Test.java │ │ │ │ └── objectadapter │ │ │ │ │ ├── Adaptee.java │ │ │ │ │ ├── Adapter.java │ │ │ │ │ ├── ConcreteTarget.java │ │ │ │ │ ├── Target.java │ │ │ │ │ └── Test.java │ │ │ │ ├── bridge │ │ │ │ ├── ABCBank.java │ │ │ │ ├── Account.java │ │ │ │ ├── Bank.java │ │ │ │ ├── DepositAccount.java │ │ │ │ ├── ICBCBank.java │ │ │ │ ├── SavingAccount.java │ │ │ │ └── Test.java │ │ │ │ ├── composite │ │ │ │ ├── CatalogComponent.java │ │ │ │ ├── Course.java │ │ │ │ ├── CourseCatalog.java │ │ │ │ └── Test.java │ │ │ │ ├── decorator │ │ │ │ ├── IODecorator.java │ │ │ │ ├── v1 │ │ │ │ │ ├── Battercake.java │ │ │ │ │ ├── BattercakeWithEgg.java │ │ │ │ │ ├── BattercakeWithEggSausage.java │ │ │ │ │ └── Test.java │ │ │ │ └── v2 │ │ │ │ │ ├── ABattercake.java │ │ │ │ │ ├── AbstractDecorator.java │ │ │ │ │ ├── Battercake.java │ │ │ │ │ ├── EggDecorator.java │ │ │ │ │ ├── SausageDecorator.java │ │ │ │ │ └── Test.java │ │ │ │ ├── facade │ │ │ │ ├── GiftExchangeService.java │ │ │ │ ├── PointsGift.java │ │ │ │ ├── PointsPaymentService.java │ │ │ │ ├── QualifyService.java │ │ │ │ ├── ShippingService.java │ │ │ │ └── Test.java │ │ │ │ ├── flyweight │ │ │ │ ├── Employee.java │ │ │ │ ├── EmployeeFactory.java │ │ │ │ ├── Manager.java │ │ │ │ ├── Test.java │ │ │ │ └── application │ │ │ │ │ └── IntegerDemo.java │ │ │ │ └── proxy │ │ │ │ └── README.md │ │ │ └── principle │ │ │ ├── demeter │ │ │ ├── Boss.java │ │ │ ├── Course.java │ │ │ ├── TeamLeader.java │ │ │ └── Test.java │ │ │ ├── dependencyInversion │ │ │ ├── v1 │ │ │ │ ├── Bottom.java │ │ │ │ ├── Car.java │ │ │ │ ├── Client.java │ │ │ │ ├── Framework.java │ │ │ │ └── Tire.java │ │ │ └── v2 │ │ │ │ ├── Bottom.java │ │ │ │ ├── Car.java │ │ │ │ ├── Client.java │ │ │ │ ├── Framework.java │ │ │ │ └── Tire.java │ │ │ ├── interfacesegregation │ │ │ ├── Bird.java │ │ │ ├── Dog.java │ │ │ ├── IAnimalAction.java │ │ │ ├── IEatAnimalAction.java │ │ │ ├── IFlyAnimalAction.java │ │ │ └── ISwimAnimalAction.java │ │ │ ├── openclose │ │ │ ├── ICourse.java │ │ │ ├── JavaCourse.java │ │ │ ├── JavaDiscountCourse.java │ │ │ └── Test.java │ │ │ └── singleresponsibility │ │ │ ├── Bird.java │ │ │ ├── CourseImpl.java │ │ │ ├── FlyBird.java │ │ │ ├── ICourse.java │ │ │ ├── ICourseContent.java │ │ │ ├── ICourseManager.java │ │ │ ├── Test.java │ │ │ └── WalkBird.java │ └── uml │ │ └── 设计模式.mdj ├── feature-jdk5 │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── lastwhisper │ │ │ ├── AutoBox.java │ │ │ ├── StaticImport.java │ │ │ ├── VariableParameter.java │ │ │ ├── annotation │ │ │ ├── AnnotationTest.java │ │ │ ├── JsonProperty.java │ │ │ ├── MyAnnotation.java │ │ │ ├── StudentRsp.java │ │ │ └── UseAnnotation.java │ │ │ ├── enums │ │ │ ├── EnumTest.java │ │ │ ├── WeekDay.java │ │ │ └── WeekDay1.java │ │ │ ├── equals │ │ │ ├── EqualsWithExtends.java │ │ │ └── HashCode.java │ │ │ ├── exception │ │ │ └── ErrorAndException.java │ │ │ ├── generic │ │ │ ├── Generic1.java │ │ │ ├── Generic2.java │ │ │ ├── Generic3.java │ │ │ └── Generic4 │ │ │ │ ├── BaseDao.java │ │ │ │ ├── BaseDaoImpl.java │ │ │ │ ├── Client.java │ │ │ │ ├── Person.java │ │ │ │ ├── PersonDao.java │ │ │ │ └── PersonDaoImpl.java │ │ │ ├── introspection │ │ │ ├── IntrospectorTest.java │ │ │ └── Point.java │ │ │ ├── io │ │ │ ├── io │ │ │ │ ├── PropertiesDemo.java │ │ │ │ ├── StringCodingDemo.java │ │ │ │ ├── bytestream │ │ │ │ │ ├── BufferedInputStreamDemo.java │ │ │ │ │ ├── BufferedOutputStreamDemo.java │ │ │ │ │ ├── FileInputStreamDemo.java │ │ │ │ │ ├── FileOutputStreamDemo.java │ │ │ │ │ └── IOByteStreamCopyFile.java │ │ │ │ ├── charstream │ │ │ │ │ ├── BufferedReaderDemo.java │ │ │ │ │ ├── BufferedWriterDemo.java │ │ │ │ │ ├── IOCharBufferStreamCopyFile.java │ │ │ │ │ ├── IOCharStreamCopyFile.java │ │ │ │ │ ├── InputStreamReaderDemo.java │ │ │ │ │ ├── OutputStreamWriterDemo.java │ │ │ │ │ └── other │ │ │ │ │ │ └── LineNumberReaderDemo.java │ │ │ │ ├── file │ │ │ │ │ └── FileDemo.java │ │ │ │ └── otherstream │ │ │ │ │ ├── ByteArrayStreamDemo.java │ │ │ │ │ ├── DataStreamDemo.java │ │ │ │ │ ├── ObjectStreamDemo.java │ │ │ │ │ ├── Person.java │ │ │ │ │ ├── PrintWriterDemo.java │ │ │ │ │ ├── RandomAccessFileDemo.java │ │ │ │ │ ├── SequenceInputStreamDemo.java │ │ │ │ │ ├── SystemInDemo.java │ │ │ │ │ └── SystemOutDemo.java │ │ │ ├── nio │ │ │ │ ├── README.md │ │ │ │ ├── TestBlockingNIO.java │ │ │ │ ├── TestBuffer.java │ │ │ │ ├── TestChannel.java │ │ │ │ ├── TestNIO.java │ │ │ │ ├── TestNIOPathFiles.java │ │ │ │ ├── TestNIO_UDP.java │ │ │ │ ├── TestPipe.java │ │ │ │ ├── v1 │ │ │ │ │ ├── BIOServer.java │ │ │ │ │ └── Client.java │ │ │ │ ├── v2 │ │ │ │ │ ├── MockNIOServer.java │ │ │ │ │ └── MyNIOServer.java │ │ │ │ └── v3 │ │ │ │ │ ├── NIOClient.java │ │ │ │ │ └── NIOServer.java │ │ │ └── socket │ │ │ │ ├── TCPClient.java │ │ │ │ ├── TCPServer.java │ │ │ │ ├── UDPClient.java │ │ │ │ └── UDPServer.java │ │ │ ├── reflect │ │ │ ├── ReflectExecutMain.java │ │ │ ├── ReflectForClass.java │ │ │ ├── ReflectForConstructor.java │ │ │ ├── ReflectForField.java │ │ │ ├── ReflectForMethod.java │ │ │ ├── ReflectPoint.java │ │ │ ├── ReflectToArray.java │ │ │ ├── ReflectUpdateField.java │ │ │ ├── ReflectUtils.java │ │ │ └── pojo │ │ │ │ └── MyObject.java │ │ │ └── serializable │ │ │ ├── Test.java │ │ │ ├── Test2.java │ │ │ └── Test3.java │ │ └── resources │ │ ├── ExtClassloaderJar.jar │ │ └── config.properties ├── feature-jdk8 │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── cunchang │ │ ├── annotation │ │ ├── MyAnnotation.java │ │ ├── MyAnnotations.java │ │ └── TestAnnotation.java │ │ ├── date │ │ ├── LocalDateTest.java │ │ ├── TestLocalDateTime.java │ │ └── TestLocalDateTime2.java │ │ ├── interfa │ │ └── MyInterface.java │ │ ├── lambda │ │ ├── Employee.java │ │ ├── MyFun.java │ │ ├── TestLambda.java │ │ ├── TestLambda2.java │ │ ├── TestLambda3.java │ │ ├── TestMethodRef.java │ │ ├── example │ │ │ ├── MyFun2.java │ │ │ ├── MyFun3.java │ │ │ └── TestLambda.java │ │ └── strategy │ │ │ ├── EmployeeAgeFilter.java │ │ │ ├── EmployeeSalaryFilter.java │ │ │ └── Filter.java │ │ ├── optional │ │ ├── Godness.java │ │ ├── Man.java │ │ ├── NewMan.java │ │ └── TestOptional.java │ │ ├── stream │ │ ├── CollectorsTest.java │ │ ├── Employee.java │ │ ├── Status.java │ │ ├── StreamMapFlatMapDemo.java │ │ ├── TestStreamAPI.java │ │ ├── TestStreamAPI2.java │ │ ├── TestStreamAPI3.java │ │ ├── example │ │ │ ├── TestStreamAPI.java │ │ │ ├── TestTransaction.java │ │ │ ├── Trader.java │ │ │ └── Transaction.java │ │ └── parallel │ │ │ ├── ForkJoinCalculate.java │ │ │ └── TestForkJoin.java │ │ └── 参考.txt ├── interview │ ├── README.MD │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── interview │ │ │ ├── AccessModifier │ │ │ ├── A1.java │ │ │ ├── A2.java │ │ │ ├── defaulttest │ │ │ │ ├── A.java │ │ │ │ └── B.java │ │ │ ├── privatetest │ │ │ │ ├── A.java │ │ │ │ └── B.java │ │ │ ├── protectedtest │ │ │ │ ├── A.java │ │ │ │ └── B.java │ │ │ └── publictest │ │ │ │ ├── A.java │ │ │ │ └── B.java │ │ │ ├── ComparableAndComparator │ │ │ └── CompareComparatorAndComparableTest.java │ │ │ ├── EqualsAndhashCode │ │ │ ├── ConflictHashCodeTest1.java │ │ │ ├── ConflictHashCodeTest2.java │ │ │ ├── EqualsTest1.java │ │ │ ├── EqualsTest2.java │ │ │ ├── EqualsTest3.java │ │ │ └── NormalHashCodeTest.java │ │ │ ├── Exception │ │ │ ├── FinallyReturnTest.java │ │ │ ├── FinallyTest.java │ │ │ ├── ThrowsAndThrowTest.java │ │ │ ├── TryCatchTest.java │ │ │ └── TryTest.java │ │ │ ├── InnerClass │ │ │ ├── Static │ │ │ │ ├── OuterClass.java │ │ │ │ └── Outter.java │ │ │ ├── anonymous │ │ │ │ ├── FinalTest.java │ │ │ │ ├── InnerClass.java │ │ │ │ ├── OuterClass.java │ │ │ │ └── OuterClassExample.java │ │ │ ├── local │ │ │ │ ├── OuterClass.java │ │ │ │ └── Outter.java │ │ │ └── member │ │ │ │ ├── OuterClass.java │ │ │ │ └── Outter.java │ │ │ ├── IterableAndIterator │ │ │ ├── IterableAndIterator.java │ │ │ └── ResizingArrayStack.java │ │ │ ├── Operator │ │ │ ├── Division.java │ │ │ ├── LogicalBitOperation.java │ │ │ ├── LogicalOperator.java │ │ │ └── ShiftOperator.java │ │ │ ├── OverloadVsOverride │ │ │ ├── OverLoadClass.java │ │ │ ├── SubClass.java │ │ │ └── SuperClass.java │ │ │ ├── SwapTwoInteger │ │ │ ├── Swap1.java │ │ │ └── Swap2.java │ │ │ ├── Thread │ │ │ ├── CycleWait.java │ │ │ ├── FutureTaskDemo.java │ │ │ ├── InterruptDemo.java │ │ │ ├── MyCallable.java │ │ │ ├── MyRunnable.java │ │ │ ├── MyThread.java │ │ │ ├── SyncBlockAndMethod.java │ │ │ ├── SynchronizeDemo.java │ │ │ ├── ThreadPoolDemo.java │ │ │ ├── ThreadTest.java │ │ │ ├── VolatileDemo.java │ │ │ ├── WaitSleepDemo.java │ │ │ ├── WaitSleepDemo1.java │ │ │ └── YieldDemo.java │ │ │ └── ValueAndaddress │ │ │ ├── Example1.java │ │ │ ├── Example2.java │ │ │ ├── Example3.java │ │ │ └── Example4.java │ │ └── resources │ │ └── project-parent.zip ├── jvm │ ├── README.md │ ├── jdk7-setting │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ └── methodarea │ │ │ └── OOMTest.java │ ├── pom.xml │ ├── src │ │ └── main │ │ │ └── java │ │ │ ├── cn │ │ │ └── lastwhisper │ │ │ │ └── jvm │ │ │ │ ├── classloader │ │ │ │ ├── ClassLifeCycle.java │ │ │ │ ├── ClassLoaderPrintTest.java │ │ │ │ ├── ClassLoaderUnique.java │ │ │ │ ├── DemoObj.java │ │ │ │ ├── READMD.md │ │ │ │ ├── hotdeploy │ │ │ │ │ ├── ClassLoaderHotDeploy.java │ │ │ │ │ └── HotCodeTest.java │ │ │ │ └── loadorder │ │ │ │ │ ├── LoadOrderTest.java │ │ │ │ │ └── MyClassLoaderTest.java │ │ │ │ ├── classloading │ │ │ │ ├── InterfaceInit.java │ │ │ │ ├── StaticCodeTest.java │ │ │ │ ├── initiative │ │ │ │ │ ├── Initialization1.java │ │ │ │ │ ├── Initialization2.java │ │ │ │ │ ├── Initialization3.java │ │ │ │ │ ├── Initialization4.java │ │ │ │ │ ├── Initialization5.java │ │ │ │ │ ├── MethodHandleClass.java │ │ │ │ │ ├── SubClass.java │ │ │ │ │ └── SuperClass.java │ │ │ │ └── passive │ │ │ │ │ ├── ConstClass.java │ │ │ │ │ ├── Interface.java │ │ │ │ │ ├── NotInitialization1.java │ │ │ │ │ ├── NotInitialization2.java │ │ │ │ │ └── NotInitialization3.java │ │ │ │ ├── gc │ │ │ │ ├── InitiativeGC.java │ │ │ │ ├── finalize │ │ │ │ │ ├── Finalization.java │ │ │ │ │ └── Finalization2.java │ │ │ │ ├── gcroots │ │ │ │ │ └── ReferenceCountingGC.java │ │ │ │ └── reference │ │ │ │ │ ├── PhantomReferenceDemo.java │ │ │ │ │ ├── ReferenceQueueDemo.java │ │ │ │ │ ├── ReferenceQueueTest.java │ │ │ │ │ ├── SoftReferenceDemo.java │ │ │ │ │ ├── StrongReferenceDemo.java │ │ │ │ │ ├── ThreadLocalMemoryLeak.java │ │ │ │ │ ├── WeakHashMapDemo.java │ │ │ │ │ └── WeakReferenceDemo.java │ │ │ │ ├── memorystruct │ │ │ │ ├── ByteCodeSample.java │ │ │ │ ├── DirectMemoryOOM.java │ │ │ │ ├── HeapOOM.java │ │ │ │ ├── HelloWorld.java │ │ │ │ ├── Increment.class │ │ │ │ ├── Increment.java │ │ │ │ ├── Intern.java │ │ │ │ ├── Intern2.java │ │ │ │ ├── InternDifference.java │ │ │ │ ├── MethodAreaOOM.java │ │ │ │ ├── PermGenOOM.java │ │ │ │ ├── StackSOF.java │ │ │ │ ├── TestStr.java │ │ │ │ ├── TestStr2.class │ │ │ │ └── TestStr2.java │ │ │ │ ├── ms │ │ │ │ ├── Math.java │ │ │ │ └── User.java │ │ │ │ └── tmp2 │ │ │ │ └── command │ │ │ │ └── jstack │ │ │ │ └── AllStackTrace.java │ │ │ └── java │ │ │ └── lang │ │ │ └── String.java │ └── words.txt ├── learn-source-jdk7 │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── learn7 │ │ └── util │ │ └── collection │ │ ├── HashMap7MultiThread.java │ │ └── HashMap7Test.java └── learn-source-jdk8 │ ├── READMD.md │ ├── pom.xml │ └── src │ └── main │ └── java │ └── cn │ └── lastwhisper │ └── learn8 │ ├── common │ └── ReflectUtils.java │ ├── lang │ ├── LongTest.java │ ├── StringTest.java │ └── thread │ │ └── ThreadTest.java │ └── util │ ├── ArraysTest.java │ ├── CollectionsTest.java │ ├── ObjectsTest.java │ ├── collection │ ├── ArrayListTest.java │ ├── HashMap8MultiThread.java │ ├── HashMap8Test.java │ ├── LinkedHashMapTest.java │ ├── LinkedListTest.java │ └── TreeMapTest.java │ └── concurrent │ ├── collection │ ├── ConcurrentHashMapTest.java │ └── CopyOnWriteArrayListTest.java │ ├── executor │ └── FutureTest.java │ └── queue │ ├── ArrayBlockingQueueDemo.java │ ├── DelayQueueTest.java │ ├── LinkedBlockingQueueTest.java │ ├── SynchronousQueueTest.java │ └── my │ ├── LinkedBlockingQueue.java │ ├── Queue.java │ └── QueueTest.java ├── lesson-code ├── design │ └── fsm │ │ ├── README.md │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── cunchang │ │ ├── ApplicationDemo.java │ │ ├── MarioStateMachine.java │ │ ├── State.java │ │ ├── state │ │ ├── v1 │ │ │ ├── ApplicationDemo.java │ │ │ ├── CapeMario.java │ │ │ ├── FireMario.java │ │ │ ├── IMario.java │ │ │ ├── MarioStateMachine.java │ │ │ ├── SmallMario.java │ │ │ ├── State.java │ │ │ └── SuperMario.java │ │ └── v2 │ │ │ ├── ApplicationDemo.java │ │ │ ├── CapeMario.java │ │ │ ├── FireMario.java │ │ │ ├── IMario.java │ │ │ ├── MarioStateMachine.java │ │ │ ├── SmallMario.java │ │ │ ├── State.java │ │ │ └── SuperMario.java │ │ ├── switchcase │ │ ├── ApplicationDemo.java │ │ ├── MarioStateMachine.java │ │ └── State.java │ │ └── table │ │ ├── ApplicationDemo.java │ │ ├── Event.java │ │ ├── MarioStateMachine.java │ │ └── State.java └── java-common-mistakes │ ├── pom.xml │ └── src │ └── main │ ├── java │ └── cn │ │ └── cunchang │ │ ├── TestSomething.java │ │ ├── repeatcode │ │ ├── Cart.java │ │ ├── Db.java │ │ ├── Item.java │ │ ├── NormalUserCart.java │ │ └── wrong │ │ │ ├── InternalUserCart.java │ │ │ ├── NormalUserCart.java │ │ │ └── VipUserCart.java │ │ └── threadpool │ │ ├── ExtremeThreadPoolExecutor.java │ │ ├── README.md │ │ ├── ThreadPoolExpansiveTest.java │ │ └── ThreadPoolOOMTest.java │ └── resources │ └── logback.xml ├── log ├── jcl │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── cunchang │ │ │ └── JCLTest.java │ │ └── resources │ │ └── log4j.properties ├── jul │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── cunchang │ │ │ ├── JULTest.java │ │ │ └── log │ │ │ └── MyJULLogFilter.java │ │ └── resources │ │ └── jul.properties ├── log4j │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── cunchang │ │ │ └── Log4jTest.java │ │ └── resources │ │ ├── log.sql │ │ ├── log4j │ │ └── log4j.properties │ │ ├── log4j_FileAppender配置.properties │ │ ├── log4j_JDBCAppender配置.properties │ │ ├── log4j_Layout配置.properties │ │ ├── log4j_组件和配置文件.properties │ │ └── log4j_自定义Logger.properties ├── log4j2 │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── cunchang │ │ │ ├── Log4j2Test.java │ │ │ └── Slf4jTest.java │ │ └── resources │ │ ├── AsyncAppender │ │ └── log4j2.xml │ │ ├── AsyncLogger全局 │ │ ├── log4j2.component.properties │ │ └── log4j2.xml │ │ ├── AsyncLogger混合 │ │ └── log4j2.xml │ │ └── log4j2.xml ├── logback │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── cunchang │ │ │ ├── LogbackTest.java │ │ │ └── logback.xml │ │ └── resources │ │ ├── logback_FileAppender配置.xml │ │ ├── logback_HtmlAppender配置.xml │ │ ├── logback_RollingFileAppender配置.xml │ │ ├── logback_异步配置.xml │ │ ├── logback_自定义logger.xml │ │ └── logback_配置文件.xml ├── slf4j │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── cunchang │ │ │ ├── Log4jTest.java │ │ │ └── Slf4jTest.java │ │ └── resources │ │ └── log4j.properties ├── springboot-log │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── cunchang │ │ │ │ └── SpringbootLogApplication.java │ │ └── resources │ │ │ ├── application.properties │ │ │ ├── logback-spring.xml │ │ │ └── logconfig │ │ │ ├── application.properties │ │ │ ├── log4j2.xml │ │ │ └── logback.xml │ │ └── test │ │ └── java │ │ └── cn │ │ └── cunchang │ │ └── SpringbootLogApplicationTests.java ├── 日志技术 (上).pdf └── 日志技术 (下).pdf ├── mvc ├── README.MD ├── pom.xml ├── servlet │ ├── .classpath │ ├── .project │ ├── .settings │ │ ├── .jsdtscope │ │ ├── org.eclipse.core.resources.prefs │ │ ├── org.eclipse.jdt.core.prefs │ │ ├── org.eclipse.wst.common.component │ │ ├── org.eclipse.wst.common.project.facet.core.xml │ │ ├── org.eclipse.wst.jsdt.ui.superType.container │ │ └── org.eclipse.wst.jsdt.ui.superType.name │ ├── WebContent │ │ ├── META-INF │ │ │ └── MANIFEST.MF │ │ ├── index.jsp │ │ └── note.txt │ ├── build │ │ └── classes │ │ │ ├── META-INF │ │ │ └── services │ │ │ │ └── javax.servlet.ServletContainerInitializer │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ ├── service │ │ │ ├── AbstractHelloService.class │ │ │ ├── HelloService.class │ │ │ ├── HelloServiceExt.class │ │ │ └── HelloServiceImpl.class │ │ │ └── servlet │ │ │ ├── HelloServlet.class │ │ │ ├── MyServletContainerInitializer.class │ │ │ ├── UserFilter.class │ │ │ ├── UserListener.class │ │ │ └── UserServlet.class │ └── src │ │ ├── META-INF │ │ └── services │ │ │ └── javax.servlet.ServletContainerInitializer │ │ └── cn │ │ └── lastwhisper │ │ ├── service │ │ ├── AbstractHelloService.java │ │ ├── HelloService.java │ │ ├── HelloServiceExt.java │ │ └── HelloServiceImpl.java │ │ └── servlet │ │ ├── HelloServlet.java │ │ ├── MyServletContainerInitializer.java │ │ ├── UserFilter.java │ │ ├── UserListener.java │ │ └── UserServlet.java ├── springmvc-annotation │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── lastwhisper │ │ │ ├── MyWebAppInitializer.java │ │ │ ├── config │ │ │ ├── AppConfig.java │ │ │ └── RootConfig.java │ │ │ ├── controller │ │ │ ├── AsyncController.java │ │ │ ├── HelloController.java │ │ │ └── MyFirstInterceptor.java │ │ │ └── service │ │ │ ├── DeferredResultQueue.java │ │ │ └── HelloService.java │ │ ├── resources │ │ ├── mvc.xml │ │ └── note.txt │ │ └── webapp │ │ ├── WEB-INF │ │ └── views │ │ │ └── success.jsp │ │ ├── index.jsp │ │ └── upload_3.jpg └── springmvc │ ├── pom.xml │ └── src │ └── main │ ├── java │ └── cn │ │ └── lastwhisper │ │ ├── bean │ │ └── User.java │ │ └── controller │ │ ├── ControllerDemo1.java │ │ ├── ControllerDemo2.java │ │ ├── ControllerDemo3.java │ │ ├── ControllerDemo4.java │ │ ├── DownLoadFileController.java │ │ ├── ParameterController1.java │ │ └── ParameterController2.java │ ├── resources │ └── springmvc.xml │ └── webapp │ ├── WEB-INF │ ├── pages │ │ ├── success.jsp │ │ ├── success2.jsp │ │ └── success3.jsp │ └── web.xml │ ├── index.jsp │ └── js │ └── jquery.min.js ├── notes ├── leetcode │ ├── LeetCode 第 39 题:“组合总和”题解配图.pptx │ ├── Leetcode.mmap │ ├── leetcode-39.vsdx │ ├── leetcode-46.vsdx │ ├── leetcode-47.vsdx │ ├── leetcode-56.vsdx │ ├── leetcode-77.vsdx │ └── leetcode-92.vsdx └── orm │ ├── jpa │ ├── SpringDataJPA第一天讲义.doc │ ├── SpringDataJPA第三天讲义.doc │ ├── SpringDataJPA第二天讲义.doc │ ├── jpa01.txt │ ├── jpa02.txt │ └── jpa03.txt │ └── mybatis │ ├── Mybatis第一天讲义.pdf │ ├── Mybatis第三天讲义.pdf │ ├── Mybatis第二天讲义.pdf │ ├── Mybatis第四天讲义.pdf │ ├── Noname1.txt │ ├── Noname2.txt │ ├── Noname3.txt │ └── Noname4.txt ├── orm ├── jdbc │ ├── README.md │ ├── pom.xml │ ├── sql │ │ └── batchtable.sql │ └── src │ │ ├── main │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── jdbc │ │ │ ├── Main1.java │ │ │ ├── Main2.java │ │ │ ├── Main3.java │ │ │ ├── Main4.java │ │ │ └── util │ │ │ ├── Callback.java │ │ │ └── JdbcUtil.java │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── jdbc │ │ └── test │ │ └── JdbcTest.java ├── jpa │ ├── jpa-basic │ │ ├── pom.xml │ │ ├── sql │ │ │ └── rt.sql │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── lastwhisper │ │ │ │ │ └── jpa │ │ │ │ │ ├── domain │ │ │ │ │ └── Customer.java │ │ │ │ │ └── utils │ │ │ │ │ ├── Callback.java │ │ │ │ │ └── JpaUtil.java │ │ │ └── resources │ │ │ │ └── META-INF │ │ │ │ └── persistence.xml │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── test │ │ │ ├── JPQLTest.java │ │ │ └── JpaTest.java │ ├── jpa-manytomany │ │ ├── .mvn │ │ │ └── wrapper │ │ │ │ ├── MavenWrapperDownloader.java │ │ │ │ ├── maven-wrapper.jar │ │ │ │ └── maven-wrapper.properties │ │ ├── pom.xml │ │ ├── readme.md │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── lastwhisper │ │ │ │ │ └── jpamanytomany │ │ │ │ │ ├── JpaManytomanyApplication.java │ │ │ │ │ ├── dao │ │ │ │ │ ├── RoleDao.java │ │ │ │ │ └── UserDao.java │ │ │ │ │ ├── domain │ │ │ │ │ ├── SysRole.java │ │ │ │ │ └── SysUser.java │ │ │ │ │ └── mtm │ │ │ │ │ ├── SysRole.java │ │ │ │ │ └── SysUser.java │ │ │ └── resources │ │ │ │ └── application.properties │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── jpamanytomany │ │ │ └── ManyToManyTest.java │ ├── jpa-onetomany │ │ ├── pom.xml │ │ ├── sql │ │ │ └── rt.sql │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── cn │ │ │ │ │ └── lastwhisper │ │ │ │ │ └── jpaonetomany │ │ │ │ │ ├── JpaOnetomanyApplication.java │ │ │ │ │ ├── dao │ │ │ │ │ ├── CustomerDao.java │ │ │ │ │ └── LinkManDao.java │ │ │ │ │ └── domain │ │ │ │ │ ├── Customer.java │ │ │ │ │ └── LinkMan.java │ │ │ └── resources │ │ │ │ └── application.properties │ │ │ └── test │ │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── jpaonetomany │ │ │ ├── OneToManyTest.java │ │ │ └── SelectTest.java │ ├── jpa.sql │ ├── pom.xml │ └── springdatajpa │ │ ├── .mvn │ │ └── wrapper │ │ │ ├── MavenWrapperDownloader.java │ │ │ ├── maven-wrapper.jar │ │ │ └── maven-wrapper.properties │ │ ├── pom.xml │ │ ├── readme.md │ │ ├── sql │ │ └── rt.sql │ │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── springdatajpa │ │ │ │ ├── SpringdatajpaApplication.java │ │ │ │ ├── dao │ │ │ │ └── CustomerDao.java │ │ │ │ └── domain │ │ │ │ └── Customer.java │ │ └── resources │ │ │ └── application.properties │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── springdatajpa │ │ ├── CamelCaseTest.java │ │ ├── JPQLTest.java │ │ ├── JpaTest.java │ │ └── SpecTest.java ├── mongodb │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── cunchang │ │ │ │ ├── Application.java │ │ │ │ ├── domain │ │ │ │ └── Comment.java │ │ │ │ ├── repository │ │ │ │ └── CommentRepository.java │ │ │ │ └── service │ │ │ │ └── CommentService.java │ │ └── resources │ │ │ └── application.yml │ │ └── test │ │ └── java │ │ └── cn │ │ └── cunchang │ │ ├── ApplicationTests.java │ │ └── service │ │ └── CommentServiceTest.java └── mybatis │ ├── README.MD │ ├── mybatis-action │ ├── dirty-read │ │ ├── README.md │ │ ├── init.sql │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── cn │ │ │ │ └── cunchang │ │ │ │ ├── Application.java │ │ │ │ ├── config │ │ │ │ ├── RdsDataSourceConfiguration.java │ │ │ │ └── SwaggerConfig.java │ │ │ │ ├── controller │ │ │ │ └── UserController.java │ │ │ │ ├── mapper │ │ │ │ └── UserMapper.java │ │ │ │ └── model │ │ │ │ └── User.java │ │ │ └── resources │ │ │ ├── application.yml │ │ │ └── mybatis │ │ │ ├── mapper │ │ │ └── UserMapper.xml │ │ │ └── mybatis-config.xml │ └── insert-fetch-id │ │ ├── pom.xml │ │ ├── sql │ │ └── rt.sql │ │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── cunchang │ │ │ │ ├── dao │ │ │ │ └── UserMapper.java │ │ │ │ └── domain │ │ │ │ └── User.java │ │ └── resources │ │ │ ├── SqlMapConfig.xml │ │ │ ├── cn │ │ │ └── cunchang │ │ │ │ └── dao │ │ │ │ └── UserMapper.xml │ │ │ └── log4j.properties │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── test │ │ ├── ExecutorTypeBatch.java │ │ └── InsertFetchIdTest.java │ ├── mybatis-annotation-crud │ ├── pom.xml │ ├── readme.md │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── mybatis │ │ │ │ └── annotation │ │ │ │ └── crud │ │ │ │ ├── dao │ │ │ │ └── UserMapper.java │ │ │ │ ├── domain │ │ │ │ └── User.java │ │ │ │ └── utils │ │ │ │ ├── Callback.java │ │ │ │ └── MybatisUtil.java │ │ └── resources │ │ │ ├── SqlMapConfig.xml │ │ │ ├── jdbcConfig.properties │ │ │ └── log4j.properties │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── test │ │ └── MybatisAnnotationTest.java │ ├── mybatis-annotation-manytable │ ├── pom.xml │ ├── readme.md │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── mybatis │ │ │ │ └── annotation │ │ │ │ └── manytable │ │ │ │ ├── dao │ │ │ │ ├── AccountMapper.java │ │ │ │ └── UserMapper.java │ │ │ │ ├── domain │ │ │ │ ├── Account.java │ │ │ │ └── User.java │ │ │ │ └── utils │ │ │ │ ├── Callback.java │ │ │ │ └── MybatisUtil.java │ │ └── resources │ │ │ ├── SqlMapConfig.xml │ │ │ ├── jdbcConfig.properties │ │ │ └── log4j.properties │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── test │ │ └── MybatisAnnotationTest.java │ ├── mybatis-basic │ ├── pom.xml │ ├── readme.md │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── mybatisbasic │ │ │ │ ├── dao │ │ │ │ └── UserMapper.java │ │ │ │ └── domain │ │ │ │ └── User.java │ │ └── resources │ │ │ ├── SqlMapConfig.xml │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── mybatisbasic │ │ │ └── dao │ │ │ └── UserMapper.xml │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── test │ │ └── MybatisTest.java │ ├── mybatis-cache │ ├── pom.xml │ ├── readme.md │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── mybatis │ │ │ │ └── cache │ │ │ │ ├── dao │ │ │ │ └── UserMapper.java │ │ │ │ └── domain │ │ │ │ └── User.java │ │ └── resources │ │ │ ├── SqlMapConfig.xml │ │ │ ├── cn │ │ │ └── lastwhisper │ │ │ │ └── mybatis │ │ │ │ └── cache │ │ │ │ └── dao │ │ │ │ └── UserMapper.xml │ │ │ └── log4j.properties │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── test │ │ └── MybatisCacheTest.java │ ├── mybatis-crud │ ├── pom.xml │ ├── sql │ │ └── rt.sql │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── mybatiscrud │ │ │ │ ├── dao │ │ │ │ └── UserMapper.java │ │ │ │ └── domain │ │ │ │ ├── QueryVo.java │ │ │ │ └── User.java │ │ └── resources │ │ │ ├── SqlMapConfig.xml │ │ │ ├── cn │ │ │ └── lastwhisper │ │ │ │ └── mybatiscrud │ │ │ │ └── dao │ │ │ │ └── UserMapper.xml │ │ │ └── log4j.properties │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── test │ │ ├── MybatisCRUDTest.java │ │ └── MybatisSelectTest.java │ ├── mybatis-dynamicsql │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── mybatis │ │ │ │ └── dynamicsql │ │ │ │ ├── dao │ │ │ │ └── UserMapper.java │ │ │ │ └── domain │ │ │ │ ├── QueryVo.java │ │ │ │ └── User.java │ │ └── resources │ │ │ ├── SqlMapConfig.xml │ │ │ ├── cn │ │ │ └── lastwhisper │ │ │ │ └── mybatis │ │ │ │ └── dynamicsql │ │ │ │ └── dao │ │ │ │ └── UserMapper.xml │ │ │ └── log4j.properties │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── test │ │ └── MybatisDynamicSqlTest.java │ ├── mybatis-interceptor │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── mybatis │ │ │ │ └── interceptor │ │ │ │ ├── CameHumpInterceptor.java │ │ │ │ ├── dao │ │ │ │ └── UserMapper.java │ │ │ │ ├── datascope │ │ │ │ ├── DataScope.java │ │ │ │ └── DataScopeInterceptor.java │ │ │ │ └── domain │ │ │ │ ├── Dept.java │ │ │ │ └── User.java │ │ └── resources │ │ │ ├── SqlMapConfig.xml │ │ │ ├── cn │ │ │ └── lastwhisper │ │ │ │ └── mybatis │ │ │ │ └── interceptor │ │ │ │ └── dao │ │ │ │ └── UserMapper.xml │ │ │ └── log4j.properties │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── test │ │ └── MybatisSelectTest.java │ ├── mybatis-lazy │ ├── pom.xml │ ├── readme.md │ ├── sql │ │ └── rt.sql │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── mybatis │ │ │ │ └── onetomany │ │ │ │ ├── dao │ │ │ │ └── UserMapper.java │ │ │ │ └── domain │ │ │ │ ├── Account.java │ │ │ │ └── User.java │ │ └── resources │ │ │ ├── SqlMapConfig.xml │ │ │ ├── cn │ │ │ └── lastwhisper │ │ │ │ └── mybatis │ │ │ │ └── onetomany │ │ │ │ └── dao │ │ │ │ └── UserMapper.xml │ │ │ └── log4j.properties │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── test │ │ └── UserTest.java │ ├── mybatis-manytomany │ ├── pom.xml │ ├── readme.md │ ├── sql │ │ └── rt.sql │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── mybatis │ │ │ │ └── manytomany │ │ │ │ ├── dao │ │ │ │ ├── RoleMapper.java │ │ │ │ └── UserMapper.java │ │ │ │ └── domain │ │ │ │ ├── Role.java │ │ │ │ └── User.java │ │ └── resources │ │ │ ├── SqlMapConfig.xml │ │ │ ├── cn │ │ │ └── lastwhisper │ │ │ │ └── mybatis │ │ │ │ └── manytomany │ │ │ │ └── dao │ │ │ │ ├── RoleMapper.xml │ │ │ │ └── UserMapper.xml │ │ │ └── log4j.properties │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── test │ │ └── UserRoleTest.java │ ├── mybatis-onetomany │ ├── pom.xml │ ├── readme.md │ ├── sql │ │ └── rt.sql │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── mybatis │ │ │ │ └── onetomany │ │ │ │ ├── dao │ │ │ │ └── UserMapper.java │ │ │ │ └── domain │ │ │ │ ├── Account.java │ │ │ │ └── User.java │ │ └── resources │ │ │ ├── SqlMapConfig.xml │ │ │ ├── cn │ │ │ └── lastwhisper │ │ │ │ └── mybatis │ │ │ │ └── onetomany │ │ │ │ └── dao │ │ │ │ └── UserMapper.xml │ │ │ └── log4j.properties │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── test │ │ └── UserTest.java │ ├── mybatis-onetoone │ ├── pom.xml │ ├── readme.md │ ├── sql │ │ └── rt.sql │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── mybatis │ │ │ │ └── onetoone │ │ │ │ ├── dao │ │ │ │ └── AccountMapper.java │ │ │ │ └── domain │ │ │ │ ├── Account.java │ │ │ │ ├── AccountUser.java │ │ │ │ └── User.java │ │ └── resources │ │ │ ├── SqlMapConfig.xml │ │ │ ├── cn │ │ │ └── lastwhisper │ │ │ │ └── mybatis │ │ │ │ └── onetoone │ │ │ │ └── dao │ │ │ │ └── AccountMapper.xml │ │ │ └── log4j.properties │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── test │ │ └── AccountTest.java │ ├── orm.sql │ └── pom.xml ├── spring-annotation ├── README.md ├── aop-@Aspect │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── aop │ │ │ ├── LogAspects.java │ │ │ ├── MathCalculator.java │ │ │ ├── TestClient.java │ │ │ └── config │ │ │ └── MainConfigOfAop.java │ │ └── resources │ │ └── Bean.xml ├── aop-interface │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── cn │ │ └── cunchang │ │ ├── Calculate.java │ │ ├── TestClient.java │ │ ├── TulingCalculate.java │ │ └── aop │ │ ├── EalyAopMainConfig.java │ │ ├── TulingLogAdvice.java │ │ └── TulingLogInterceptor.java ├── aop-schema-based │ ├── README.md │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── cunchang │ │ │ │ ├── aop │ │ │ │ ├── CarAdvisor.java │ │ │ │ ├── CarAdvisor2.java │ │ │ │ ├── DrivingBeforeAdvice.java │ │ │ │ └── DrivingInterceptor.java │ │ │ │ └── domain │ │ │ │ ├── BenzCar.java │ │ │ │ ├── BmwCar.java │ │ │ │ └── Car.java │ │ └── resources │ │ │ └── aop-low-api.xml │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── aop │ │ └── test │ │ └── AOP_LowApiTest.java ├── autowired │ ├── pom.xml │ └── src │ │ ├── main │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── autowired │ │ │ ├── bean │ │ │ ├── Boss.java │ │ │ ├── Car.java │ │ │ ├── Person.java │ │ │ └── Red.java │ │ │ ├── config │ │ │ └── MainConfigOfAutoWired.java │ │ │ ├── controller │ │ │ └── BookController.java │ │ │ ├── dao │ │ │ └── BookDao.java │ │ │ └── service │ │ │ └── BookService.java │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── autowired │ │ └── test │ │ └── IOCTest_AutoWired.java ├── componentregister │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── componentregister │ │ │ │ ├── MainTest.java │ │ │ │ ├── bean │ │ │ │ ├── Blue.java │ │ │ │ ├── Color.java │ │ │ │ ├── ColorFactoryBean.java │ │ │ │ ├── Person.java │ │ │ │ ├── RainBow.java │ │ │ │ ├── Red.java │ │ │ │ └── Yellow.java │ │ │ │ ├── condition │ │ │ │ ├── LinuxCondition.java │ │ │ │ ├── MacCondition.java │ │ │ │ └── WindowsCondition.java │ │ │ │ ├── config │ │ │ │ ├── MainConfigRegister.java │ │ │ │ └── MainConfigScan.java │ │ │ │ ├── controller │ │ │ │ └── BookController.java │ │ │ │ ├── dao │ │ │ │ └── BookDao.java │ │ │ │ ├── filter │ │ │ │ └── MyTypeFilter.java │ │ │ │ ├── register │ │ │ │ └── MyImportBeanDefinitionRegistrar.java │ │ │ │ ├── selector │ │ │ │ └── MyImportSelector.java │ │ │ │ └── service │ │ │ │ └── BookService.java │ │ └── resources │ │ │ └── Bean.xml │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── componentregister │ │ └── test │ │ └── IOCTest.java ├── event │ ├── pom.xml │ └── src │ │ ├── main │ │ └── java │ │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── spring │ │ │ └── event │ │ │ ├── BlackListEvent.java │ │ │ ├── BlackListNotifier.java │ │ │ ├── EmailService.java │ │ │ └── EventConfig.java │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── spring │ │ └── event │ │ └── IOCTest_Event.java ├── ext │ ├── README.md │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── spring │ │ │ │ └── ext │ │ │ │ ├── ExtConfig.java │ │ │ │ ├── MyApplicationListener.java │ │ │ │ ├── MyBeanDefinitionRegistryPostProcessor.java │ │ │ │ ├── MyBeanFactoryPostProcessor.java │ │ │ │ ├── UserService.java │ │ │ │ └── bean │ │ │ │ └── Blue.java │ │ └── resources │ │ │ └── note.txt │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── spring │ │ └── ext │ │ └── test │ │ └── IOCTest_EXT.java ├── liftcycle │ ├── pom.xml │ └── src │ │ ├── main │ │ └── java │ │ │ └── cn │ │ │ └── cunchang │ │ │ ├── LifeCycleBean.java │ │ │ ├── MyBeanPostProcessor.java │ │ │ └── config │ │ │ └── MainConfigOfLifeCycle.java │ │ └── test │ │ └── java │ │ └── cn │ │ └── cunchang │ │ └── IOCTest_LifeCycle2.java ├── pom.xml ├── profile │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── profile │ │ │ │ ├── bean │ │ │ │ └── Yellow.java │ │ │ │ └── config │ │ │ │ └── MainConfigofProfile.java │ │ └── resources │ │ │ └── db.properties │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── profile │ │ └── test │ │ └── IOCTest_Profile.java ├── propertyvalue │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── propertyvalue │ │ │ │ ├── bean │ │ │ │ └── Person.java │ │ │ │ └── config │ │ │ │ └── MainConfigOfPropertyValues.java │ │ └── resources │ │ │ ├── Bean.xml │ │ │ └── person.properties │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── propertyvalue │ │ └── test │ │ └── IOCTest_PropertyValue.java └── transaction │ ├── README.md │ ├── pom.xml │ └── src │ ├── main │ ├── java │ │ └── cn │ │ │ └── lastwhisper │ │ │ └── tx │ │ │ ├── TxConfig.java │ │ │ ├── UserDao.java │ │ │ └── UserService.java │ └── resources │ │ ├── Bean.xml │ │ └── test.sql │ └── test │ └── java │ └── cn │ └── lastwhisper │ └── tx │ └── test │ └── IOCTest_TX.java ├── spring-batch └── spring-batch │ ├── pom.xml │ └── src │ ├── main │ ├── java │ │ └── cn │ │ │ └── cunchang │ │ │ ├── SpringBatchApplication.java │ │ │ ├── batch │ │ │ ├── BatchConfiguration.java │ │ │ ├── BatchMessageChannel.java │ │ │ ├── job │ │ │ │ └── BatchConfiguration.java │ │ │ ├── listener │ │ │ │ ├── JobCompletionNotificationListener.java │ │ │ │ └── StepCompletionNotificationListener.java │ │ │ └── processor │ │ │ │ └── PersonItemProcessor.java │ │ │ ├── pojo │ │ │ └── Person.java │ │ │ └── schedule │ │ │ └── EntryXxljob.java │ └── resources │ │ ├── application.properties │ │ ├── sample-data.csv │ │ └── schema-all.sql │ └── test │ └── java │ └── cn │ └── cunchang │ └── SpringBatchApplicationTests.java ├── springboot-aop ├── cache │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ ├── CacheDemoApplication.java │ │ │ │ ├── config │ │ │ │ └── ApplicationContextHolder.java │ │ │ │ └── service │ │ │ │ └── MenuService.java │ │ └── resources │ │ │ └── application.properties │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── CacheDemoApplicationTests.java ├── execution │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ ├── ExecutionDemoApplication.java │ │ │ │ ├── anno │ │ │ │ ├── AdminOnly.java │ │ │ │ ├── NeedSecured.java │ │ │ │ ├── NeedSecuredClass.java │ │ │ │ └── NeedSecuredSource.java │ │ │ │ ├── bean │ │ │ │ └── Product.java │ │ │ │ ├── config │ │ │ │ ├── AdviceAspectConfig.java │ │ │ │ ├── AnnoAspectConfig.java │ │ │ │ ├── ArgsAspectConfig.java │ │ │ │ ├── ExecutionAspectConfig.java │ │ │ │ ├── ObjectAspectConfig.java │ │ │ │ └── PkgTypeAspectConfig.java │ │ │ │ ├── log │ │ │ │ ├── LogService.java │ │ │ │ └── Loggable.java │ │ │ │ └── service │ │ │ │ ├── ProductService.java │ │ │ │ └── sub │ │ │ │ └── SubService.java │ │ └── resources │ │ │ └── application.properties │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── test │ │ └── ExecutionDemoApplicationTests.java ├── log │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ └── aop │ │ │ │ ├── LogApplication.java │ │ │ │ ├── dao │ │ │ │ └── ProductDao.java │ │ │ │ ├── datalog │ │ │ │ ├── ActionDao.java │ │ │ │ ├── Datalog.java │ │ │ │ └── DatalogAspect.java │ │ │ │ ├── domain │ │ │ │ ├── Action.java │ │ │ │ ├── ActionType.java │ │ │ │ ├── ChangeItem.java │ │ │ │ └── Product.java │ │ │ │ └── util │ │ │ │ └── DiffUtil.java │ │ └── resources │ │ │ └── application.yml │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── LogApplicationTests.java ├── pom.xml ├── principle │ └── README.md ├── security │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ │ └── lastwhisper │ │ │ │ ├── SecurityDemoApplication.java │ │ │ │ ├── config │ │ │ │ ├── MyPasswordEncoder.java │ │ │ │ └── SecurityConfig.java │ │ │ │ └── controller │ │ │ │ └── DemoController.java │ │ └── resources │ │ │ └── application.properties │ │ └── test │ │ └── java │ │ └── cn │ │ └── lastwhisper │ │ └── SecurityDemoApplicationTests.java └── transaction │ ├── pom.xml │ └── src │ ├── main │ ├── java │ │ └── cn │ │ │ └── lastwhisper │ │ │ ├── TransactionDemoApplication.java │ │ │ ├── aop │ │ │ ├── dao │ │ │ │ ├── OperationLogDao.java │ │ │ │ └── UserDao.java │ │ │ └── domain │ │ │ │ ├── OperationLog.java │ │ │ │ └── User.java │ │ │ └── service │ │ │ └── DemoService.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── cn │ └── lastwhisper │ └── TransactionDemoApplicationTests.java └── tool ├── pom.xml └── src └── main ├── java └── cn │ └── cunchang │ ├── DeleteFile.java │ ├── DeleteFileToTrash.java │ └── KillServer.java └── resources └── config.properties /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js linguist-language=java 2 | *.css linguist-language=java 3 | *.html linguist-language=java 4 | *.jsp linguist-language=java -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | target/ 3 | *.iml 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ``` 2 | ├─algorithms 算法 3 | ├─database 数据库 4 | ├─distributed 分布式系统 5 | ├─framework 一些常用类库 6 | ├─java-advance 高级类库和jsr规范等 7 | ├─java-basic Java基础 8 | ├─lesson-code 一些课程代码 9 | ├─mvc mvc框架 10 | ├─orm orm框架 11 | ├─spring-annotation spring注解驱动开发 12 | ├─spring-batch 13 | ├─springboot-aop springaop使用以及aop应用 14 | │ 15 | └─ 16 | 17 | ``` 18 | 19 | -------------------------------------------------------------------------------- /algorithms/algorithm-common/src/main/java/cn/lastwhisper/leetcode/common/linkedlist/ListNode.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.leetcode.common.linkedlist; 2 | 3 | public class ListNode { 4 | public int val; 5 | public ListNode next; 6 | 7 | public ListNode(int x) { 8 | val = x; 9 | } 10 | 11 | } -------------------------------------------------------------------------------- /algorithms/algorithm-common/src/main/java/cn/lastwhisper/leetcode/common/tree/TreeNode.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.leetcode.common.tree; 2 | 3 | public class TreeNode { 4 | public int val; 5 | public TreeNode left; 6 | public TreeNode right; 7 | 8 | public TreeNode(int x) { 9 | val = x; 10 | } 11 | } -------------------------------------------------------------------------------- /algorithms/go/algorithm/leetcode/array/数组中的第K个最大元素_215_中等/Solution1.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "sort" 4 | 5 | func findKthLargest(nums []int, k int) int { 6 | sort.Ints(nums) 7 | return nums[len(nums)-k] 8 | } 9 | 10 | func main() { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /algorithms/go/algorithm/leetcode/lc69.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | func mySqrt(x int) int { 6 | 7 | 8 | return 0 9 | } 10 | 11 | func main() { 12 | fmt.Println(mySqrt(4)) 13 | fmt.Println(mySqrt(8)) 14 | } 15 | 16 | -------------------------------------------------------------------------------- /algorithms/leetcode/dynamic/src/main/java/cn/lastwhisper/leetcode/dynamic/三角形最小路径和_120_中等/README.md: -------------------------------------------------------------------------------- 1 | https://leetcode-cn.com/problems/triangle/solution/javadong-tai-gui-hua-si-lu-yi-ji-dai-ma-shi-xian-b/ -------------------------------------------------------------------------------- /algorithms/leetcode/greedy/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/algorithms/leetcode/greedy/README.md -------------------------------------------------------------------------------- /algorithms/leetcode/leetcode-common/src/main/java/cn/lastwhisper/leetcode/common/linkedlist/ListNode.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.leetcode.common.linkedlist; 2 | 3 | public class ListNode { 4 | public int val; 5 | public ListNode next; 6 | 7 | public ListNode(int x) { 8 | val = x; 9 | } 10 | 11 | } -------------------------------------------------------------------------------- /algorithms/leetcode/leetcode-common/src/main/java/cn/lastwhisper/leetcode/common/tree/TreeNode.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.leetcode.common.tree; 2 | 3 | public class TreeNode { 4 | public int val; 5 | public TreeNode left; 6 | public TreeNode right; 7 | 8 | public TreeNode(int x) { 9 | val = x; 10 | } 11 | } -------------------------------------------------------------------------------- /algorithms/leetcode/leetcode大纲.md: -------------------------------------------------------------------------------- 1 | 双指针(快慢指针) 283、27、26、80、202 2 | 滑动窗口 209、3、438、76 3 | 对撞指针 167、125、344、345、11 4 | 快速排序 75、 5 | -------------------------------------------------------------------------------- /algorithms/leetcode/linkedlist/README.MD: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/algorithms/leetcode/linkedlist/README.MD -------------------------------------------------------------------------------- /algorithms/leetcode/linkedlist/src/main/java/cn/lastwhisper/leetcode/common/linkedlist/相交链表_160_简单/参考: -------------------------------------------------------------------------------- 1 | https://leetcode.com/problems/intersection-of-two-linked-lists/solution/ -------------------------------------------------------------------------------- /algorithms/leetcode/recursion-backtracking/src/main/java/cn/lastwhisper/leetcode/recurionbacktracking/组合_77_中等/剪枝.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/algorithms/leetcode/recursion-backtracking/src/main/java/cn/lastwhisper/leetcode/recurionbacktracking/组合_77_中等/剪枝.png -------------------------------------------------------------------------------- /algorithms/leetcode/recursion-backtracking/src/main/java/cn/lastwhisper/leetcode/recurionbacktracking/组合_77_中等/组合.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/algorithms/leetcode/recursion-backtracking/src/main/java/cn/lastwhisper/leetcode/recurionbacktracking/组合_77_中等/组合.png -------------------------------------------------------------------------------- /algorithms/leetcode/stackqueue/src/main/java/cn/lastwhisper/leetcode/stackqueue/二叉树的后序遍历_145_困难/参考.txt: -------------------------------------------------------------------------------- 1 | https://leetcode-cn.com/problems/binary-tree-postorder-traversal/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by--34/ -------------------------------------------------------------------------------- /algorithms/leetcode/stackqueue/src/main/java/cn/lastwhisper/leetcode/stackqueue/扁平化嵌套列表迭代器_341_中等/参考: -------------------------------------------------------------------------------- 1 | https://leetcode-cn.com/problems/flatten-nested-list-iterator/solution/shi-yong-di-gui-he-zhan-liang-chong-jie-fa-jin-xin/ -------------------------------------------------------------------------------- /algorithms/leetcode/week/src/main/java/cn/lastwhisper/leetcode/week/one176/最多可以参加的会议数目_5342/Solution.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.leetcode.week.one176.最多可以参加的会议数目_5342; 2 | 3 | class Solution { 4 | 5 | public int maxEvents(int[][] events) { 6 | return 0; 7 | } 8 | 9 | public static void main(String[] args){ 10 | 11 | } 12 | } -------------------------------------------------------------------------------- /algorithms/leetcode/week/src/main/java/cn/lastwhisper/leetcode/week/one177/形成三的最大倍数_5172_困难/Solution.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.leetcode.week.one177.形成三的最大倍数_5172_困难; 2 | 3 | class Solution { 4 | public String largestMultipleOfThree(int[] digits) { 5 | 6 | return null; 7 | } 8 | } -------------------------------------------------------------------------------- /algorithms/leetcode/week/src/main/java/cn/lastwhisper/leetcode/week/one177/最接近的因数_5171_中等/Solution.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.leetcode.week.one177.最接近的因数_5171_中等; 2 | 3 | class Solution { 4 | public int[] closestDivisors(int num) { 5 | 6 | return null; 7 | } 8 | } -------------------------------------------------------------------------------- /algorithms/leetcode/week/src/main/java/cn/lastwhisper/leetcode/week/one177/验证二叉树_5170_中等/Solution.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.leetcode.week.one177.验证二叉树_5170_中等; 2 | 3 | class Solution { 4 | public boolean validateBinaryTreeNodes(int n, int[] leftChild, int[] rightChild) { 5 | 6 | return true; 7 | } 8 | 9 | public static void main(String[] args) { 10 | 11 | } 12 | } -------------------------------------------------------------------------------- /algorithms/leetcode2/README.md: -------------------------------------------------------------------------------- 1 | 2刷力扣 2 | 3 | ```java 4 | /** 5 | * 思考: 6 | * ------------------------------------------------------------------- 7 | * 思路: 8 | * ------------------------------------------------------------------- 9 | * 时间复杂度:O(n^2) 10 | * 空间复杂度:O(1) 11 | */ 12 | 13 | 14 | ``` 15 | 16 | - greedy 贪心 17 | - point 双指针 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /algorithms/leetcode2/leetcode2-common/src/main/java/cn/cunchang/linkedlist/ListNode.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.linkedlist; 2 | 3 | public class ListNode { 4 | public int val; 5 | public ListNode next; 6 | 7 | public ListNode(int x) { 8 | val = x; 9 | } 10 | 11 | } -------------------------------------------------------------------------------- /algorithms/leetcode2/leetcode2-common/src/main/java/cn/cunchang/tree/TreeNode.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.tree; 2 | 3 | public class TreeNode { 4 | public int val; 5 | public TreeNode left; 6 | public TreeNode right; 7 | 8 | public TreeNode(int x) { 9 | val = x; 10 | } 11 | } -------------------------------------------------------------------------------- /algorithms/leetcode2/sort/src/main/java/cn/cunchang/sort/README.md: -------------------------------------------------------------------------------- 1 | 快排 2 | QuickSort1 第一个元素做分区 3 | QuickSort2 最后一个元素做分区 4 | QuickSort3 随机一个元素做分区 5 | 堆排序 6 | Heap1 数组第一个元素空出 7 | Heap2 数组第一个元素不空出 -------------------------------------------------------------------------------- /algorithms/leetcode2/src/main/java/cn/cunchang/接雨水_42_困难/README.md: -------------------------------------------------------------------------------- 1 | 2 | Solution1;按照自己的思路写了一遍 3 | Solution2;精简代码;因为Solution1超时了,,,, 4 | Solution3;备忘录优化 5 | 6 | -------------------------------------------------------------------------------- /algorithms/offer/src/main/java/cn/lastwhisper/offer/单例/Singleton1.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.offer.单例; 2 | 3 | /** 4 | * 恶汉式之类加载时初始化 5 | * @author cn.lastwhisper 6 | */ 7 | public class Singleton1 { 8 | // 类属性,所有引用共享一个地址 9 | private static Singleton1 instance = new Singleton1(); 10 | 11 | private Singleton1() { 12 | } 13 | public static Singleton1 getInstance() { 14 | return instance; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /algorithms/offer/src/main/java/cn/lastwhisper/offer/单例/Singleton5.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.offer.单例; 2 | 3 | /** 4 | * 懒汉式之枚举 5 | */ 6 | public enum Singleton5 { 7 | INSTANCE; 8 | 9 | public Singleton5 getInstance() { 10 | return INSTANCE; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /algorithms/offer/src/main/java/cn/lastwhisper/offer/面试题05_替换空格_简单/Solution.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.offer.面试题05_替换空格_简单; 2 | 3 | class Solution { 4 | public String replaceSpace(String s) { 5 | StringBuilder sb = new StringBuilder(); 6 | for (char c : s.toCharArray()) { 7 | if (c != ' ') sb.append(c); 8 | else sb.append("%20"); 9 | } 10 | return sb.toString(); 11 | } 12 | } -------------------------------------------------------------------------------- /bigdata/flink/src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | log4j.rootLogger=warn,stdout 2 | 3 | log4j.appender.stdout = org.apache.log4j.ConsoleAppender 4 | log4j.appender.stdout.Target = System.out 5 | log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 6 | log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /bigdata/hadoop/hdfs/src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | log4j.rootLogger=info,stdout 2 | 3 | log4j.appender.stdout = org.apache.log4j.ConsoleAppender 4 | log4j.appender.stdout.Target = System.out 5 | log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 6 | log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /bigdata/hadoop/mapreduce/src/main/java/cn/cunchang/mr/README.md: -------------------------------------------------------------------------------- 1 | 2 | # mapreduce 3 | mapreduce模块下的类,都要放到hadoop上执行 4 | 5 | WordCountJob 6 | JavaSerialize、HadoopSerialize 7 | 8 | 9 | # yarn 10 | WordCountJobQueue 11 | 12 | -------------------------------------------------------------------------------- /bigdata/hadoop/mapreduce/src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | log4j.rootLogger=info,stdout 2 | 3 | log4j.appender.stdout = org.apache.log4j.ConsoleAppender 4 | log4j.appender.stdout.Target = System.out 5 | log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 6 | log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /bigdata/imooc-flink/data/access.log: -------------------------------------------------------------------------------- 1 | 202512120010,imooc.com,2000 2 | 202512120010,a.com,6000 3 | 202512120010,b.com,5000 4 | 202512120010,imooc.com,4000 5 | 202512120010,a.com,1000 -------------------------------------------------------------------------------- /bigdata/imooc-flink/data/nest/1/a.txt: -------------------------------------------------------------------------------- 1 | a 2 | a 3 | a -------------------------------------------------------------------------------- /bigdata/imooc-flink/data/nest/1/b.txt: -------------------------------------------------------------------------------- 1 | b 2 | b 3 | b -------------------------------------------------------------------------------- /bigdata/imooc-flink/data/nest/2/c.txt: -------------------------------------------------------------------------------- 1 | c 2 | c -------------------------------------------------------------------------------- /bigdata/imooc-flink/data/nest/2/d.txt: -------------------------------------------------------------------------------- 1 | d -------------------------------------------------------------------------------- /bigdata/imooc-flink/data/nest/wc.txt: -------------------------------------------------------------------------------- 1 | pk,pk,pk 2 | flink,flink -------------------------------------------------------------------------------- /bigdata/imooc-flink/data/people.csv: -------------------------------------------------------------------------------- 1 | name;age;job 2 | Jorge;30;Developer 3 | Bob;32;Developer -------------------------------------------------------------------------------- /bigdata/imooc-flink/data/wc.data: -------------------------------------------------------------------------------- 1 | pk,pk,pk,flink,flink 2 | pk,pk,pk,flink,flink -------------------------------------------------------------------------------- /bigdata/imooc-flink/data/wc.txt: -------------------------------------------------------------------------------- 1 | pk,pk,pk 2 | flink,flink -------------------------------------------------------------------------------- /bigdata/imooc-flink/imooc-flink-project/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/bigdata/imooc-flink/imooc-flink-project/README.md -------------------------------------------------------------------------------- /bigdata/imooc-flink/imooc-flink-project/src/main/java/com/imooc/flink/domain/Product.java: -------------------------------------------------------------------------------- 1 | package com.imooc.flink.domain; 2 | 3 | public class Product { 4 | 5 | public String category; 6 | public String name; 7 | 8 | @Override 9 | public String toString() { 10 | return "Product{" + 11 | "category='" + category + '\'' + 12 | ", name='" + name + '\'' + 13 | '}'; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /bigdata/imooc-flink/imooc-flink-project/src/main/java/com/imooc/flink/utils/StringUtils.java: -------------------------------------------------------------------------------- 1 | package com.imooc.flink.utils; 2 | 3 | public class StringUtils { 4 | 5 | public static final String GAODE_KEY = "6d5be617aa12cd42f6c7421cbfa8883a"; 6 | } 7 | -------------------------------------------------------------------------------- /distributed/READEME.MD: -------------------------------------------------------------------------------- 1 | hystrix 如何进行降级、限流、熔断 2 | 3 | mq 各种mq的使用 4 | 5 | registration-center 各种注册中心 6 | 7 | springcloud-netflix netflix组件使用 8 | 9 | sso 单点登录 -------------------------------------------------------------------------------- /distributed/gateway/README.md: -------------------------------------------------------------------------------- 1 | gateway单独使用 2 | https://blog.csdn.net/jiongyan6966/article/details/84633632 3 | 4 | service-product 8081 5 | http://localhost:8081/method 6 | 7 | service-order-load1 8082 8 | service-order-load2 8083 9 | http://localhost:8082/method 10 | http://localhost:8083/method 11 | 12 | zuul-gateway 9000 13 | http://localhost:9000/shop-api/product/method 14 | http://localhost:9000/shop-api/order/method -------------------------------------------------------------------------------- /distributed/gateway/service-order-load1/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8082 -------------------------------------------------------------------------------- /distributed/gateway/service-order-load1/src/test/java/cn/lastwhisper/servicea/ServiceAApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.service; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ServiceAApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/gateway/service-order-load2/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8083 -------------------------------------------------------------------------------- /distributed/gateway/service-order-load2/src/test/java/cn/lastwhisper/servicea/ServiceAApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.service; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ServiceAApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/gateway/service-product/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8081 -------------------------------------------------------------------------------- /distributed/gateway/service-product/src/test/java/cn/lastwhisper/service/ServiceAApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.service; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ServiceAApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/gateway/zuul-gateway/src/main/resources/META-INF/additional-spring-configuration-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "properties": [ 3 | { 4 | "name": "api-2.ribbon.listOfServers", 5 | "type": "java.lang.String", 6 | "description": "Description for api-2.ribbon.listOfServers." 7 | } 8 | ] } -------------------------------------------------------------------------------- /distributed/gateway/zuul-gateway/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 9000 3 | zuul: 4 | routes: 5 | product: 6 | path: /shop-api/product/** 7 | url: http://localhost:8081/ 8 | order: 9 | path: /shop-api/order/** 10 | # url: http://localhost:8083/ 11 | order: 12 | ribbon: 13 | listOfServers: http://localhost:8082,http://localhost:8083 14 | ribbon: 15 | eureka: 16 | enabled: false 17 | -------------------------------------------------------------------------------- /distributed/gateway/zuul-gateway/src/test/java/cn/lastwhisper/zuul/ZuulGatewayApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.zuul; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ZuulGatewayApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/gray/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /distributed/gray/src/main/java/cn/cunchang/v2/web/req/RequestConfig.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.v2.web.req; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * Created by qiumu on 2020/10/11. 7 | */ 8 | @Data 9 | public class RequestConfig { 10 | 11 | 12 | /** 13 | * 接口ID 14 | */ 15 | private Integer id; 16 | 17 | private Integer grayNumber; 18 | 19 | private Integer normalNumber; 20 | 21 | 22 | } 23 | -------------------------------------------------------------------------------- /distributed/gray/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | # common spring boot settings 2 | 3 | spring.redis.database= 4 | spring.redis.host=127.0.0.1 5 | spring.redis.port=6397 6 | spring.redis.password= 7 | spring.redis.ssl= 8 | spring.redis.timeout= 9 | spring.redis.cluster.nodes= 10 | spring.redis.sentinel.master= 11 | spring.redis.sentinel.nodes= 12 | 13 | -------------------------------------------------------------------------------- /distributed/hystrix/eshop-cache-ha/src/main/java/cn/lastwhisper/cache/ha/mapper/UserMapper.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.cache.ha.mapper; 2 | 3 | public interface UserMapper { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /distributed/hystrix/eshop-cache-ha/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port=8081 2 | spring.datasource.url=jdbc:mysql://localhost:3306/eshop?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8 3 | spring.datasource.username=root 4 | spring.datasource.password=root 5 | spring.datasource.driver-class-name=com.mysql.jdbc.Driver -------------------------------------------------------------------------------- /distributed/hystrix/eshop-cache-ha/src/main/resources/mybatis/UserMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /distributed/hystrix/eshop-cache-ha/src/main/resources/templates/hello.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/distributed/hystrix/eshop-cache-ha/src/main/resources/templates/hello.html -------------------------------------------------------------------------------- /distributed/hystrix/eshop-product-ha/src/main/java/cn/lastwhisper/product/ha/mapper/UserMapper.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.product.ha.mapper; 2 | 3 | /** 4 | * @author Administrator 5 | */ 6 | public interface UserMapper { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /distributed/hystrix/eshop-product-ha/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port=8082 2 | spring.datasource.url=jdbc:mysql://localhost:3306/eshop?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8 3 | spring.datasource.username=root 4 | spring.datasource.password=root 5 | spring.datasource.driver-class-name=com.mysql.jdbc.Driver 6 | logging.level.org.apache.http.impl=info -------------------------------------------------------------------------------- /distributed/hystrix/eshop-product-ha/src/main/resources/mybatis/UserMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /distributed/hystrix/eshop-product-ha/src/main/resources/templates/hello.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/distributed/hystrix/eshop-product-ha/src/main/resources/templates/hello.html -------------------------------------------------------------------------------- /distributed/hystrix/eshop-product-ha/src/test/java/cn/lastwhisper/product/ha/ProductHaApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.product.ha; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ProductHaApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/lock/flow1/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port=1111 2 | spring.redis.database=0 3 | spring.redis.host=localhost 4 | #连接池最大连接数(使用负值表示没有限制)默认8 5 | spring.redis.port=6379 6 | #连接池最大阻塞等待时间(使用负值表示没有限制)默认-1 7 | spring.redis.lettuce.pool.max-active=8 8 | #连接池中的最大空闲连接默认8 9 | spring.redis.lettuce.pool.max-wait=-1 10 | #连接池中的最小空闲连接默认0 11 | spring.redis.lettuce.pool.max-idle=8 12 | spring.redis.lettuce.pool.min-idle=0 -------------------------------------------------------------------------------- /distributed/lock/flow1/src/main/resources/lua/DelLockScript.lua: -------------------------------------------------------------------------------- 1 | if redis.call("get",KEYS[1]) == ARGV[1] 2 | then 3 | return redis.call("del",KEYS[1]) 4 | else 5 | return 0 6 | end -------------------------------------------------------------------------------- /distributed/lock/flow1/src/test/java/cn/cunchang/Application1Tests.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class Application1Tests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/lock/flow2/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port=2222 2 | spring.redis.database=0 3 | spring.redis.host=localhost 4 | #连接池最大连接数(使用负值表示没有限制)默认8 5 | spring.redis.port=6379 6 | #连接池最大阻塞等待时间(使用负值表示没有限制)默认-1 7 | spring.redis.lettuce.pool.max-active=8 8 | #连接池中的最大空闲连接默认8 9 | spring.redis.lettuce.pool.max-wait=-1 10 | #连接池中的最小空闲连接默认0 11 | spring.redis.lettuce.pool.max-idle=8 12 | spring.redis.lettuce.pool.min-idle=0 -------------------------------------------------------------------------------- /distributed/lock/flow2/src/test/java/cn/cunchang/Application2Tests.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class Application2Tests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/lock/jedis/README.md: -------------------------------------------------------------------------------- 1 | 2 | # redis学习时的代码笔记 3 | 4 | ## asynqueue 异步队列 5 | 6 | ## basic 基础数据结构操作 7 | 8 | ## cluster Java集群操作 9 | 10 | ## dlock redis分布式锁 11 | 12 | ## hyperloglog 统计 13 | 14 | ## bloomfilter 布隆过滤器 15 | 16 | ## partition hash节点迁移率 17 | 18 | ## pipeline 流水线指令 19 | 20 | ## publishersubscriber 发布订阅 21 | 22 | ## sentinel 哨兵 23 | 24 | ## transaction 事务 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /distributed/lock/jedis/src/main/java/cn/cunchang/JedisUtil.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang; 2 | 3 | import cn.cunchang.common.Const; 4 | import redis.clients.jedis.Jedis; 5 | 6 | public class JedisUtil { 7 | 8 | public static Jedis getJedis() { 9 | // 默认db0,可以设置 10 | Jedis jedis = new Jedis(Const.IP, Const.PORT); 11 | // jedis.select(1); 12 | return jedis; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /distributed/lock/jedis/src/main/java/cn/cunchang/basic/BasicOperation.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.basic; 2 | 3 | /** 4 | * Redis基础数据结构的操作 5 | * @author cunchang 6 | * @date 2019/11/23 7 | */ 8 | public class BasicOperation { 9 | 10 | 11 | 12 | } 13 | -------------------------------------------------------------------------------- /distributed/lock/jedis/src/main/java/cn/cunchang/common/Const.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.common; 2 | 3 | /** 4 | * 5 | * @author cunchang 6 | * @date 2020/4/20 7 | */ 8 | public interface Const { 9 | 10 | String IP = "127.0.0.1"; 11 | Integer PORT = 6379; 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/lock/jedis/src/main/java/cn/cunchang/lock/real/CodeBlock.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.lock.real; 2 | 3 | /** 4 | * 代码块 5 | * 6 | * @author cunchang 7 | */ 8 | public interface CodeBlock { 9 | 10 | /** 11 | * 操作共享资源 12 | */ 13 | void operatingSharedResource(); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /distributed/lock/jedis/src/main/resources/Setnx_Expire_Srcipt.lua: -------------------------------------------------------------------------------- 1 | if redis.call('setnx', KEYS[1], KEYS[2]) == 1 2 | then return redis.call('expire', KEYS[1], KEYS[3]); 3 | end 4 | return nil; -------------------------------------------------------------------------------- /distributed/mq/activemq/activemq-api/src/main/java/cn/latwhisper/activemq/Constant.java: -------------------------------------------------------------------------------- 1 | package cn.latwhisper.activemq; 2 | 3 | /** 4 | * 5 | * @author lastwhisper 6 | * @date 2020/2/10 7 | */ 8 | public interface Constant { 9 | // tcp://IP:61616 10 | String BROKER_URL = "tcp://192.168.217.101:61616"; 11 | 12 | String QUEUE_NAME="hello-queue"; 13 | 14 | String TOPIC_NAME="hello-topic"; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /distributed/mq/activemq/activemq-api/src/main/resources/jms规范接口.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/distributed/mq/activemq/activemq-api/src/main/resources/jms规范接口.jpg -------------------------------------------------------------------------------- /distributed/mq/rabbitmq/README.md: -------------------------------------------------------------------------------- 1 | rabbitmq-api 为基础api与高级特性源码 2 | rabbitmq-spring 为整合springamqp框架源码 3 | rabbitmq-springboot-producer & rabbitmq-springboot-consumer 为整合springboot框架源码 4 | rabbitmq-springboot-producer-reliable 为rabbitmq可靠消息投递方案 5 | rabbitmq-springcloudstream-producer & rabbitmq-springcloudstream-consumer 为整合spring cloud stream源码 -------------------------------------------------------------------------------- /distributed/mq/rabbitmq/rabbitmq-api/src/main/java/cn/lastwhisper/rabbitmq/common/Constant.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.rabbitmq.common; 2 | 3 | /** 4 | * 5 | * @author lastwhisper 6 | * @date 2020/2/8 7 | */ 8 | public interface Constant { 9 | 10 | String ip = "192.168.217.101"; 11 | Integer port = 5672; 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/mq/rabbitmq/rabbitmq-spring/src/main/java/cn/lastwhisper/rabbitmq/Application.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.rabbitmq; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Application { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(Application.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/mq/rabbitmq/rabbitmq-spring/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /distributed/mq/rabbitmq/rabbitmq-springboot-consumer/src/main/java/com/bfxy/springboot/Application.java: -------------------------------------------------------------------------------- 1 | package com.bfxy.springboot; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Application { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(Application.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /distributed/mq/rabbitmq/rabbitmq-springboot-consumer/src/main/java/com/bfxy/springboot/MainConfig.java: -------------------------------------------------------------------------------- 1 | package com.bfxy.springboot; 2 | 3 | import org.springframework.context.annotation.ComponentScan; 4 | import org.springframework.context.annotation.Configuration; 5 | 6 | @Configuration 7 | @ComponentScan({"com.bfxy.springboot.*"}) 8 | public class MainConfig { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /distributed/mq/rabbitmq/rabbitmq-springboot-consumer/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/distributed/mq/rabbitmq/rabbitmq-springboot-consumer/src/main/resources/application.properties -------------------------------------------------------------------------------- /distributed/mq/rabbitmq/rabbitmq-springboot-producer-reliable/src/main/java/com/bfxy/springboot/Application.java: -------------------------------------------------------------------------------- 1 | package com.bfxy.springboot; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Application { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(Application.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /distributed/mq/rabbitmq/rabbitmq-springboot-producer-reliable/src/main/java/com/bfxy/springboot/MainConfig.java: -------------------------------------------------------------------------------- 1 | package com.bfxy.springboot; 2 | 3 | import org.springframework.context.annotation.ComponentScan; 4 | import org.springframework.context.annotation.Configuration; 5 | 6 | @Configuration 7 | @ComponentScan({"com.bfxy.springboot.*"}) 8 | public class MainConfig { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /distributed/mq/rabbitmq/rabbitmq-springboot-producer-reliable/src/main/java/com/bfxy/springboot/config/database/BaseMapper.java: -------------------------------------------------------------------------------- 1 | package com.bfxy.springboot.config.database; 2 | 3 | import tk.mybatis.mapper.common.Mapper; 4 | import tk.mybatis.mapper.common.MySqlMapper; 5 | 6 | public interface BaseMapper extends Mapper, MySqlMapper { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /distributed/mq/rabbitmq/rabbitmq-springboot-producer-reliable/src/main/java/com/bfxy/springboot/constant/Constants.java: -------------------------------------------------------------------------------- 1 | package com.bfxy.springboot.constant; 2 | 3 | public final class Constants { 4 | 5 | public static final String ORDER_SENDING = "0"; 6 | 7 | public static final String ORDER_SEND_SUCCESS = "1"; 8 | 9 | public static final String ORDER_SEND_FAILURE = "2"; 10 | 11 | public static final int ORDER_TIMEOUT = 1; /*min*/ 12 | } 13 | -------------------------------------------------------------------------------- /distributed/mq/rabbitmq/rabbitmq-springboot-producer/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | .sts4-cache 12 | 13 | ### IntelliJ IDEA ### 14 | .idea 15 | *.iws 16 | *.iml 17 | *.ipr 18 | 19 | ### NetBeans ### 20 | /nbproject/private/ 21 | /build/ 22 | /nbbuild/ 23 | /dist/ 24 | /nbdist/ 25 | /.nb-gradle/ -------------------------------------------------------------------------------- /distributed/mq/rabbitmq/rabbitmq-springboot-producer/src/main/java/com/bfxy/springboot/Application.java: -------------------------------------------------------------------------------- 1 | package com.bfxy.springboot; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Application { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(Application.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /distributed/mq/rabbitmq/rabbitmq-springboot-producer/src/main/java/com/bfxy/springboot/MainConfig.java: -------------------------------------------------------------------------------- 1 | package com.bfxy.springboot; 2 | 3 | import org.springframework.context.annotation.ComponentScan; 4 | import org.springframework.context.annotation.Configuration; 5 | 6 | @Configuration 7 | @ComponentScan({"com.bfxy.springboot.*"}) 8 | public class MainConfig { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /distributed/mq/rabbitmq/rabbitmq-springboot-producer/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/distributed/mq/rabbitmq/rabbitmq-springboot-producer/src/main/resources/application.properties -------------------------------------------------------------------------------- /distributed/mq/rabbitmq/rabbitmq-springcloudstream-consumer/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | .sts4-cache 12 | 13 | ### IntelliJ IDEA ### 14 | .idea 15 | *.iws 16 | *.iml 17 | *.ipr 18 | 19 | ### NetBeans ### 20 | /nbproject/private/ 21 | /build/ 22 | /nbbuild/ 23 | /dist/ 24 | /nbdist/ 25 | /.nb-gradle/ -------------------------------------------------------------------------------- /distributed/mq/rabbitmq/rabbitmq-springcloudstream-consumer/src/main/java/com/bfxy/rabbitmq/Application.java: -------------------------------------------------------------------------------- 1 | package com.bfxy.rabbitmq; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Application { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(Application.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /distributed/mq/rabbitmq/rabbitmq-springcloudstream-producer/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | .sts4-cache 12 | 13 | ### IntelliJ IDEA ### 14 | .idea 15 | *.iws 16 | *.iml 17 | *.ipr 18 | 19 | ### NetBeans ### 20 | /nbproject/private/ 21 | /build/ 22 | /nbbuild/ 23 | /dist/ 24 | /nbdist/ 25 | /.nb-gradle/ -------------------------------------------------------------------------------- /distributed/mq/rabbitmq/rabbitmq-springcloudstream-producer/src/main/java/com/bfxy/rabbitmq/Application.java: -------------------------------------------------------------------------------- 1 | package com.bfxy.rabbitmq; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Application { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(Application.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /distributed/mq/rocketmq/rocketmq-api/src/main/java/cn/cunchang/contants/Const.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.contants; 2 | 3 | public interface Const { 4 | 5 | String NAMESRV_ADDR_SINGLE = "127.0.0.1:9876"; 6 | 7 | String NAMESRV_ADDR_MASTER_SLAVE = "127.0.0.1:9876;192.168.217.102:9876"; 8 | 9 | } 10 | -------------------------------------------------------------------------------- /distributed/mq/rocketmq/springboot-rocketmq/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | rocketmq.name-server=192.168.232.128:9876 2 | rocketmq.producer.group=springBootGroup -------------------------------------------------------------------------------- /distributed/mq/rocketmq/springcloud-alibaba-rocketmq/README.md: -------------------------------------------------------------------------------- 1 | 2 | spring-cloud-starter-stream-rocketmq 3 | 4 | 5 | -------------------------------------------------------------------------------- /distributed/session/jwt-session/src/main/java/cn/cunchang/Application.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Application { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(Application.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/session/jwt-session/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /distributed/session/jwt-session/src/test/java/cn/cunchang/ApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/session/redis-session/src/main/java/cn/cunchang/Application.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Application { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(Application.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/session/redis-session/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | redis: 3 | host: 127.0.0.1 4 | port: 6379 -------------------------------------------------------------------------------- /distributed/session/redis-session/src/test/java/cn/cunchang/ApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/session/spring-session/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | redis: 3 | host: 127.0.0.1 4 | port: 6379 5 | session: 6 | store-type: redis 7 | timeout: 3600 8 | redis: 9 | namespace: login_user #前缀 10 | -------------------------------------------------------------------------------- /distributed/session/spring-session/src/test/java/cn/cuchang/ApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.cuchang; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/session/tomcat-session/src/main/java/cn/cuchang/Application.java: -------------------------------------------------------------------------------- 1 | package cn.cuchang; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Application { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(Application.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/session/tomcat-session/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /distributed/session/tomcat-session/src/test/java/cn/cuchang/ApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.cuchang; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/sharding-sphere/ShardingSphereDemo/sql/course.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE course_1 ( 2 | cid BIGINT(20) PRIMARY KEY, 3 | cname VARCHAR(50) NOT NULL, 4 | user_id BIGINT(20) NOT NULL, 5 | cstatus varchar(10) NOT NULL 6 | ); 7 | 8 | CREATE TABLE course_2 ( 9 | cid BIGINT(20) PRIMARY KEY, 10 | cname VARCHAR(50) NOT NULL, 11 | user_id BIGINT(20) NOT NULL, 12 | cstatus varchar(10) NOT NULL 13 | ); -------------------------------------------------------------------------------- /distributed/sharding-sphere/ShardingSphereDemo/src/main/java/com/roy/shardingDemo/mapper/CourseMapper.java: -------------------------------------------------------------------------------- 1 | package com.roy.shardingDemo.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.roy.shardingDemo.entity.Course; 5 | 6 | /** 7 | * @author :楼兰 8 | * @date :Created in 2021/1/4 9 | * @description: 10 | **/ 11 | 12 | public interface CourseMapper extends BaseMapper { 13 | } 14 | -------------------------------------------------------------------------------- /distributed/sharding-sphere/ShardingSphereDemo/src/main/java/com/roy/shardingDemo/mapper/DictMapper.java: -------------------------------------------------------------------------------- 1 | package com.roy.shardingDemo.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.roy.shardingDemo.entity.Dict; 5 | 6 | /** 7 | * @author :楼兰 8 | * @date :Created in 2021/1/5 9 | * @description: 10 | **/ 11 | public interface DictMapper extends BaseMapper { 12 | } 13 | -------------------------------------------------------------------------------- /distributed/springcloud-debug/consumer/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8055 3 | 4 | spring: 5 | application: 6 | name: consumer #微服务名称 7 | 8 | #配置nacos注册中心地址 9 | cloud: 10 | nacos: 11 | discovery: 12 | server-addr: 127.0.0.1:8848 13 | 14 | 15 | 16 | management: 17 | endpoints: 18 | web: 19 | exposure: 20 | include: '*' 21 | -------------------------------------------------------------------------------- /distributed/springcloud-debug/producer/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8056 3 | 4 | spring: 5 | application: 6 | name: producer #微服务名称 7 | 8 | #配置nacos注册中心地址 9 | cloud: 10 | nacos: 11 | discovery: 12 | server-addr: 127.0.0.1:8848 13 | 14 | 15 | 16 | management: 17 | endpoints: 18 | web: 19 | exposure: 20 | include: '*' 21 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/api-gateway/src/main/java/cn/lastwhisper/apigateway/constant/CookieConstant.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.apigateway.constant; 2 | 3 | /** 4 | * Created by 廖师兄 5 | * 2018-03-04 23:28 6 | */ 7 | public interface CookieConstant { 8 | 9 | String TOKEN = "token"; 10 | 11 | String OPENID = "openid"; 12 | 13 | /** 14 | * 过期时间(单位:s) 15 | */ 16 | Integer expire = 7200; 17 | } 18 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/api-gateway/src/main/java/cn/lastwhisper/apigateway/constant/RedisConstant.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.apigateway.constant; 2 | 3 | /** 4 | * Created by 廖师兄 5 | * 2018-03-04 23:37 6 | */ 7 | public interface RedisConstant { 8 | 9 | String TOKEN_TEMPLATE = "token_%s"; 10 | 11 | } 12 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/api-gateway/src/main/java/cn/lastwhisper/apigateway/exception/RateLimitException.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.apigateway.exception; 2 | 3 | /** 4 | * Created by 廖师兄 5 | * 2018-03-11 23:56 6 | */ 7 | public class RateLimitException extends RuntimeException { 8 | } 9 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/api-gateway/src/test/java/cn/lastwhisper/apigateway/ApiGatewayApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.apigateway; 2 | 3 | import org.junit.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ApiGatewayApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/client/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | eureka: 2 | client: 3 | service-url: 4 | defaultZone: http://localhost:8761/eureka/ 5 | # instance: 6 | # hostname: clientName 7 | spring: 8 | application: 9 | name: client 10 | server: 11 | port: 8080 12 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/client/src/test/java/cn/lastwhisper/client/ClientApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.client; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ClientApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/config/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM hub.c.163.com/library/java:8-alpine 2 | 3 | MAINTAINER 15037584397@163.com 4 | 5 | ADD target/*.jar app.jar 6 | 7 | EXPOSE 8080 8 | 9 | ENTRYPOINT ["java","-jar","/app.jar"] 10 | 11 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/config/src/test/java/cn/lastwhisper/config/ConfigApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.config; 2 | 3 | import org.junit.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | public class ConfigApplicationTests { 8 | 9 | @Test 10 | public void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/eureka/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM hub.c.163.com/library/java:8-alpine 2 | 3 | MAINTAINER 15037584397@163.com 4 | 5 | ADD target/*.jar app.jar 6 | 7 | EXPOSE 8761 8 | 9 | ENTRYPOINT ["java","-jar","/app.jar"] 10 | 11 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/eureka/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8761 3 | spring: 4 | application: 5 | name: eureka 6 | eureka: 7 | client: 8 | service-url: 9 | defaultZone: http://localhost:8761/eureka/ #配置HA互相注册 10 | register-with-eureka: false 11 | #关闭eureka的自我保护功能 12 | server: 13 | enable-self-preservation: false 14 | 15 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/eureka/src/test/java/cn/lastwhisper/eureka/EurekaApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.eureka; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class EurekaApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/order-old/src/main/java/cn/lastwhisper/order/repository/OrderDetailRepository.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.order.repository; 2 | 3 | import cn.lastwhisper.order.domain.OrderDetail; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | /** 7 | * @author lastwhisper 8 | */ 9 | public interface OrderDetailRepository extends JpaRepository { 10 | } 11 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/order-old/src/main/java/cn/lastwhisper/order/repository/OrderMasterRepository.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.order.repository; 2 | 3 | import cn.lastwhisper.order.domain.OrderMaster; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | /** 7 | * 8 | * @author lastwhisper 9 | * @date 2019/10/26 10 | */ 11 | public interface OrderMasterRepository extends JpaRepository { 12 | } 13 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/order-old/src/main/java/cn/lastwhisper/order/service/OrderService.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.order.service; 2 | 3 | import cn.lastwhisper.order.dto.OrderDTO; 4 | 5 | /** 6 | * 7 | * @author lastwhisper 8 | * @date 2019/10/26 9 | */ 10 | public interface OrderService { 11 | 12 | public OrderDTO create(OrderDTO orderDTO); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/order-old/src/test/java/cn/lastwhisper/order/OrderApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.order; 2 | 3 | import org.junit.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | public class OrderApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/order/order-server/src/main/java/cn/lastwhisper/order/repository/OrderMasterRepository.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.order.repository; 2 | 3 | import cn.lastwhisper.order.domain.OrderMaster; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | /** 7 | * 8 | * @author lastwhisper 9 | * @date 2019/10/26 10 | */ 11 | public interface OrderMasterRepository extends JpaRepository { 12 | } 13 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/order/order-server/src/main/resources/META-INF/additional-spring-configuration-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "properties": [ 3 | { 4 | "name": "hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds", 5 | "type": "java.lang.String", 6 | "description": "Description for hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds." 7 | } 8 | ] } -------------------------------------------------------------------------------- /distributed/springcloud-netflix/product-old/src/main/java/cn/lastwhisper/product/service/CategoryService.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.product.service; 2 | 3 | import cn.lastwhisper.product.domain.ProductCategory; 4 | 5 | import java.util.List; 6 | 7 | public interface CategoryService { 8 | 9 | List findByCategoryTypeIn(List categoryTypeList); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/product/product-server/src/main/java/cn/lastwhisper/product/service/CategoryService.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.product.service; 2 | 3 | import cn.lastwhisper.product.domain.ProductCategory; 4 | 5 | import java.util.List; 6 | 7 | public interface CategoryService { 8 | 9 | List findByCategoryTypeIn(List categoryTypeList); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/user/user-server/src/main/java/cn/lastwhisper/user/constant/CookieConstant.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.user.constant; 2 | 3 | /** 4 | * Created by 廖师兄 5 | * 2018-03-04 23:28 6 | */ 7 | public interface CookieConstant { 8 | 9 | String TOKEN = "token"; 10 | 11 | String OPENID = "openid"; 12 | 13 | /** 14 | * 过期时间(单位:s) 15 | */ 16 | Integer expire = 7200; 17 | } 18 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/user/user-server/src/main/java/cn/lastwhisper/user/constant/RedisConstant.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.user.constant; 2 | 3 | /** 4 | * Created by 廖师兄 5 | * 2018-03-04 23:37 6 | */ 7 | public interface RedisConstant { 8 | 9 | String TOKEN_TEMPLATE = "token_%s"; 10 | 11 | } 12 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/user/user-server/src/main/java/cn/lastwhisper/user/service/UserService.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.user.service; 2 | 3 | import cn.lastwhisper.user.domain.UserInfo; 4 | 5 | /** 6 | * 7 | * @author lastwhisper 8 | * @date 2019/11/3 9 | */ 10 | public interface UserService { 11 | 12 | UserInfo findByOpenid(String openid); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /distributed/springcloud-netflix/user/user-server/src/main/resources/bootstrap.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | application: 3 | name: user 4 | cloud: 5 | config: 6 | discovery: 7 | enabled: true 8 | service-id: CONFIG 9 | profile: dev 10 | eureka: 11 | client: 12 | service-url: 13 | defaultZone: http://localhost:8761/eureka/ -------------------------------------------------------------------------------- /distributed/transaction/README.md: -------------------------------------------------------------------------------- 1 | 分布式事务 2 | 3 | - demo :产生分布式事务的案例 4 | - seata-AT-demo:AT模式解决方案 5 | 6 | -------------------------------------------------------------------------------- /distributed/transaction/demo/account-service/src/main/java/cn/itcast/account/service/AccountService.java: -------------------------------------------------------------------------------- 1 | package cn.itcast.account.service; 2 | 3 | public interface AccountService { 4 | /** 5 | * 从用户账户中借出 6 | */ 7 | void debit(String userId, int money); 8 | } -------------------------------------------------------------------------------- /distributed/transaction/demo/eureka-server/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8761 3 | spring: 4 | application: 5 | name: eureka-server 6 | ribbon: 7 | eureka: 8 | enabled: true 9 | eureka: 10 | client: 11 | registerWithEureka: false 12 | fetchRegistry: false 13 | serviceUrl: 14 | defaultZone: http://localhost:${server.port}/eureka/ -------------------------------------------------------------------------------- /distributed/transaction/demo/order-service/src/main/java/cn/itcast/order/mapper/OrderMapper.java: -------------------------------------------------------------------------------- 1 | package cn.itcast.order.mapper; 2 | 3 | import cn.itcast.order.entity.Order; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | * @author 虎哥 8 | */ 9 | public interface OrderMapper extends BaseMapper { 10 | } 11 | -------------------------------------------------------------------------------- /distributed/transaction/demo/order-service/src/main/java/cn/itcast/order/service/OrderService.java: -------------------------------------------------------------------------------- 1 | package cn.itcast.order.service; 2 | 3 | import cn.itcast.order.entity.Order; 4 | 5 | public interface OrderService { 6 | 7 | /** 8 | * 创建订单 9 | */ 10 | Long create(Order order); 11 | } -------------------------------------------------------------------------------- /distributed/transaction/demo/storage-service/src/main/java/cn/itcast/storage/service/StorageService.java: -------------------------------------------------------------------------------- 1 | package cn.itcast.storage.service; 2 | 3 | public interface StorageService{ 4 | 5 | /** 6 | * 扣除存储数量 7 | */ 8 | void deduct(String commodityCode, int count); 9 | } -------------------------------------------------------------------------------- /distributed/transaction/seata-AT-demo/account-service/src/main/java/cn/itcast/account/service/AccountService.java: -------------------------------------------------------------------------------- 1 | package cn.itcast.account.service; 2 | 3 | public interface AccountService { 4 | /** 5 | * 从用户账户中借出 6 | */ 7 | void debit(String userId, int money); 8 | } -------------------------------------------------------------------------------- /distributed/transaction/seata-AT-demo/eureka-server/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8761 3 | spring: 4 | application: 5 | name: eureka-server 6 | ribbon: 7 | eureka: 8 | enabled: true 9 | eureka: 10 | client: 11 | registerWithEureka: false 12 | fetchRegistry: false 13 | serviceUrl: 14 | defaultZone: http://localhost:${server.port}/eureka/ -------------------------------------------------------------------------------- /distributed/transaction/seata-AT-demo/order-service/src/main/java/cn/itcast/order/mapper/OrderMapper.java: -------------------------------------------------------------------------------- 1 | package cn.itcast.order.mapper; 2 | 3 | import cn.itcast.order.entity.Order; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | * @author 虎哥 8 | */ 9 | public interface OrderMapper extends BaseMapper { 10 | } 11 | -------------------------------------------------------------------------------- /distributed/transaction/seata-AT-demo/order-service/src/main/java/cn/itcast/order/service/OrderService.java: -------------------------------------------------------------------------------- 1 | package cn.itcast.order.service; 2 | 3 | import cn.itcast.order.entity.Order; 4 | 5 | public interface OrderService { 6 | 7 | /** 8 | * 创建订单 9 | */ 10 | Long create(Order order); 11 | } -------------------------------------------------------------------------------- /distributed/transaction/seata-AT-demo/storage-service/src/main/java/cn/itcast/storage/service/StorageService.java: -------------------------------------------------------------------------------- 1 | package cn.itcast.storage.service; 2 | 3 | public interface StorageService{ 4 | 5 | /** 6 | * 扣除存储数量 7 | */ 8 | void deduct(String commodityCode, int count); 9 | } -------------------------------------------------------------------------------- /distributed/transaction/分布式事务.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/distributed/transaction/分布式事务.zip -------------------------------------------------------------------------------- /framework/flyway/src/main/resources/db/migration/V1__Create_person_table.sql: -------------------------------------------------------------------------------- 1 | create table PERSON ( 2 | ID int not null, 3 | NAME varchar(100) not null 4 | ); -------------------------------------------------------------------------------- /framework/flyway/src/main/resources/db/migration/V2__Add_people.sql: -------------------------------------------------------------------------------- 1 | insert into PERSON (ID, NAME) values (1, 'Axel'); 2 | insert into PERSON (ID, NAME) values (2, 'Mr. Foo'); 3 | insert into PERSON (ID, NAME) values (3, 'Ms. Bar'); -------------------------------------------------------------------------------- /framework/hutool/src/main/java/cn/cunchang/IDUtilTest.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang; 2 | 3 | import cn.hutool.core.util.IdUtil; 4 | 5 | /** 6 | * @author cunchang 7 | * @date 2022/5/15 11:43 PM 8 | */ 9 | public class IDUtilTest { 10 | 11 | public static void main(String[] args) { 12 | System.out.println(IdUtil.getSnowflakeNextId()); 13 | // System.out.println(IdUtil.objectId()); 14 | 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /framework/tika/src/main/java/cn/lastwhisper/TikaApplication.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class TikaApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(TikaApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /framework/tika/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /framework/tika/src/test/java/cn/lastwhisper/TikaApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class TikaApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | 12 | 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /framework/tika/src/test/resources/TikaApplication.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class TikaApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(TikaApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /framework/tika/src/test/resources/application.properties: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /framework/tika/src/test/resources/mapreduce-osdi04.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/mapreduce-osdi04.pdf -------------------------------------------------------------------------------- /framework/tika/src/test/resources/office.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/office.xlsx -------------------------------------------------------------------------------- /framework/tika/src/test/resources/template.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/template.xls -------------------------------------------------------------------------------- /framework/tika/src/test/resources/timg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/timg -------------------------------------------------------------------------------- /framework/tika/src/test/resources/timg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/timg.gif -------------------------------------------------------------------------------- /framework/tika/src/test/resources/timg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/timg.jpg -------------------------------------------------------------------------------- /framework/tika/src/test/resources/timg.jpg.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/timg.jpg.zip -------------------------------------------------------------------------------- /framework/tika/src/test/resources/transportation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/transportation.png -------------------------------------------------------------------------------- /framework/tika/src/test/resources/测试.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/测试.docx -------------------------------------------------------------------------------- /framework/tika/src/test/resources/测试.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/framework/tika/src/test/resources/测试.xlsx -------------------------------------------------------------------------------- /java-advance/annotation/PluggableAnnotationProcessingAPI/mylombok-test/src/main/java/cn/cunchang/Person.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang; 2 | 3 | @MyGetter 4 | public class Person { 5 | 6 | private String name; 7 | 8 | } 9 | -------------------------------------------------------------------------------- /java-advance/annotation/PluggableAnnotationProcessingAPI/mylombok/src/main/resources/META-INF/services/javax.annotation.processing.Processor: -------------------------------------------------------------------------------- 1 | cn.cunchang.MyGetterProcessor -------------------------------------------------------------------------------- /java-advance/annotation/README.md: -------------------------------------------------------------------------------- 1 | # annotation 2 | 3 | JSR 175: A Metadata Facility for the JavaTM Programming Language 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | # Pluggable Annotation Processing API 12 | 13 | 14 | 15 | JSR 269: Pluggable Annotation Processing API 16 | 17 | 参考:https://juejin.cn/post/6844904106545381384?utm_source=ZHShareTargetIDMore&utm_medium=social&utm_oi=825791253932290048#heading-16 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /java-advance/annotation/annatation/src/main/java/cn/cunchang/corejava/runtimeAnnotations/ActionListenerFor.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.corejava.runtimeAnnotations; 2 | 3 | import java.lang.annotation.*; 4 | 5 | /** 6 | * @version 1.00 2004-08-17 7 | * @author Cay Horstmann 8 | */ 9 | 10 | @Target(ElementType.METHOD) 11 | @Retention(RetentionPolicy.RUNTIME) 12 | public @interface ActionListenerFor 13 | { 14 | String source(); 15 | } 16 | -------------------------------------------------------------------------------- /java-advance/annotation/annatation/src/main/java/cn/cunchang/dynamicvalue/StudentRsp.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.dynamicvalue; 2 | 3 | /** 4 | * @author cunchang 5 | * @date 2021/4/19 8:02 下午 6 | */ 7 | public class StudentRsp { 8 | 9 | /** 10 | * stable beisen_test_name 11 | * real beisen_pro_name 12 | */ 13 | @JsonProperty("beisen_test_name") 14 | public String name; 15 | 16 | 17 | } 18 | -------------------------------------------------------------------------------- /java-advance/annotation/annatation/src/main/java/cn/cunchang/syntax/Level.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.syntax; 2 | 3 | public enum Level {BAD, INDIFFERENT, GOOD} -------------------------------------------------------------------------------- /java-advance/annotation/annatation/src/main/java/cn/cunchang/syntax/MetaAnnotation.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.syntax; 2 | 3 | public @interface MetaAnnotation { 4 | 5 | String value() default "MetaAnnotation default value"; 6 | 7 | } -------------------------------------------------------------------------------- /java-advance/groovy/README.md: -------------------------------------------------------------------------------- 1 | groovy动态解析脚本 -------------------------------------------------------------------------------- /java-advance/proxy/com/sun/proxy/$Proxy0.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/java-advance/proxy/com/sun/proxy/$Proxy0.class -------------------------------------------------------------------------------- /java-advance/proxy/jdk-proxy/README.md: -------------------------------------------------------------------------------- 1 | 2 | v1 jdk动态代理常规用法 3 | v1.equal jdk动态代理生成的类,等价调用 4 | 5 | v2 jdk动态代理接口 6 | v3 jdk动态代理无法代理抽象类 7 | -------------------------------------------------------------------------------- /java-advance/proxy/jdk-proxy/src/main/java/cn/cunchang/v1/Subject.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.v1; 2 | 3 | public interface Subject { // 定义代理接口 4 | String sayHello(); 5 | } 6 | -------------------------------------------------------------------------------- /java-advance/proxy/jdk-proxy/src/main/java/cn/cunchang/v1/SubjectImpl.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.v1; 2 | 3 | public class SubjectImpl implements Subject { // 定义代理接口实现类 4 | @Override 5 | public String sayHello() { 6 | System.out.println(" Hello World"); 7 | return "success"; 8 | } 9 | } -------------------------------------------------------------------------------- /java-advance/proxy/jdk-proxy/src/main/java/cn/cunchang/v1/equal/Subject.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.v1.equal; 2 | 3 | public interface Subject { // 定义代理接口 4 | String sayHello(); 5 | } 6 | -------------------------------------------------------------------------------- /java-advance/proxy/jdk-proxy/src/main/java/cn/cunchang/v1/equal/SubjectImpl.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.v1.equal; 2 | 3 | public class SubjectImpl implements Subject { // 定义代理接口实现类 4 | @Override 5 | public String sayHello() { 6 | System.out.println(" Hello World"); 7 | return "success"; 8 | } 9 | } -------------------------------------------------------------------------------- /java-advance/proxy/jdk-proxy/src/main/java/cn/cunchang/v2/Subject.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.v2; 2 | 3 | public interface Subject { 4 | String sayHello(); 5 | } 6 | 7 | -------------------------------------------------------------------------------- /java-advance/proxy/jdk-proxy/src/main/java/cn/cunchang/v3/AbstractProxy.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.v3; 2 | 3 | public abstract class AbstractProxy { 4 | abstract void sayHello(); 5 | } 6 | -------------------------------------------------------------------------------- /java-advance/proxy/mybatis-mapper/src/main/java/cn/cunchang/SqlSession.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @author cunchang 7 | * @date 2021/11/25 12:46 上午 8 | */ 9 | public interface SqlSession { 10 | 11 | List selectList(String statementId); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /java-advance/proxy/mybatis-mapper/src/main/java/cn/cunchang/SysUser.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang; 2 | 3 | /** 4 | * @author cunchang 5 | * @date 2021/11/25 12:48 上午 6 | */ 7 | public class SysUser { 8 | } 9 | -------------------------------------------------------------------------------- /java-advance/proxy/mybatis-mapper/src/main/java/cn/cunchang/UserMapper.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang; 2 | 3 | import java.util.List; 4 | 5 | public interface UserMapper{ 6 | List selectAll(); 7 | } -------------------------------------------------------------------------------- /java-advance/proxy/src/main/java/cn/cunchang/Moveable.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang; 2 | 3 | /** 4 | * @author cunchang 5 | * @date 2021/5/9 9:57 上午 6 | */ 7 | public interface Moveable { 8 | void move(); 9 | // void stop(); 10 | } 11 | -------------------------------------------------------------------------------- /java-advance/proxy/src/main/java/cn/cunchang/myjdkdynamic/InvocationHandler.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.myjdkdynamic; 2 | 3 | import java.lang.reflect.Method; 4 | public interface InvocationHandler { 5 | 6 | /** 7 | * 代理执行的逻辑 8 | * @param o 代理类 9 | * @param m 要执行的方法 10 | */ 11 | public void invoke(Object o,Method m); 12 | } -------------------------------------------------------------------------------- /java-advance/proxy/src/main/java/cn/cunchang/staticproxy/inherit/TankLogTimeProxy.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.staticproxy.inherit; 2 | 3 | public class TankLogTimeProxy extends TankTimeProxy { 4 | 5 | @Override 6 | public void move() { 7 | //记录日志 8 | System.out.println("Tank start...."); 9 | super.move(); 10 | System.out.println("Tank end...."); 11 | } 12 | 13 | 14 | } -------------------------------------------------------------------------------- /java-advance/spi/spi-mysql/src/main/resources/META-INF/services/cn.jdbc.Driver: -------------------------------------------------------------------------------- 1 | cn.mysql.MysqlDriver -------------------------------------------------------------------------------- /java-advance/spi/spi-oracle/src/main/resources/META-INF/services/cn.jdbc.Driver: -------------------------------------------------------------------------------- 1 | cn.oracle.OracleDriver -------------------------------------------------------------------------------- /java-advance/spi/web-client/src/main/resources/META-INF/services/cn.jdbc.Driver: -------------------------------------------------------------------------------- 1 | #cn.mysql.MysqlDriver -------------------------------------------------------------------------------- /java-basic/README.MD: -------------------------------------------------------------------------------- 1 | java基础学习 2 | 1. jdk特性 3 | 2. jvm代码 4 | 3. 并发 5 | 4. 设计模式 -------------------------------------------------------------------------------- /java-basic/basic/src/main/java/cn/cunchang/README.md: -------------------------------------------------------------------------------- 1 | 2 | - collection 集合相关操作 3 | - cpu 控制cpu的利用率 4 | - decimal decimal相关操作 5 | - packagesacn 扫包 6 | - regex 正则表达式 7 | - sugar java语法糖 8 | - sysproperty 系统变量 9 | - trycatch trycatch相关操作 -------------------------------------------------------------------------------- /java-basic/basic/src/main/java/cn/cunchang/collection/README.md: -------------------------------------------------------------------------------- 1 | 2 | - Arrays https://blog.csdn.net/AlbenXie/article/details/103051176 3 | 4 | -------------------------------------------------------------------------------- /java-basic/basic/src/main/java/cn/cunchang/hutool/IDUtilTest.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.hutool; 2 | 3 | import cn.hutool.core.util.IdUtil; 4 | 5 | /** 6 | * @author cunchang 7 | * @date 2022/5/15 11:43 PM 8 | */ 9 | public class IDUtilTest { 10 | 11 | public static void main(String[] args) { 12 | System.out.println(IdUtil.getSnowflakeNextId()); 13 | // System.out.println(IdUtil.objectId()); 14 | 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /java-basic/basic/src/main/java/cn/cunchang/packagesacn/PackageScanner.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.packagesacn; 2 | 3 | import java.io.IOException; 4 | import java.util.List; 5 | 6 | public interface PackageScanner { 7 | 8 | List getFullyQualifiedClassNameList() throws IOException; 9 | 10 | } -------------------------------------------------------------------------------- /java-basic/basic/src/main/java/cn/cunchang/sugar/type/A.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.sugar.type; 2 | 3 | // A.jar 4 | //A.java有类A,A调了B的方法add(int i),这时传的是个原始类型, 完美匹配 5 | public class A { 6 | public static void main(String[] args) { 7 | // add(int i) ,1不会进行拆装箱 8 | // add(Integer i),1会进行拆装箱 9 | B.add(1); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/basic/src/main/java/cn/cunchang/sugar/type/B.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.sugar.type; 2 | 3 | // B.jar 4 | //B.java 5 | public class B { 6 | // public static void add(int i) { 7 | // System.out.println(i); 8 | // } 9 | 10 | public static void add(Integer i) { 11 | System.out.println(i); 12 | } 13 | } -------------------------------------------------------------------------------- /java-basic/basic/src/main/java/cn/cunchang/sugar/type/README.md: -------------------------------------------------------------------------------- 1 | 2 | 自动拆装箱的坑 3 | 4 | Java自动拆装箱为什么不起作用了 - 鸿缘的文章 - 知乎 5 | https://zhuanlan.zhihu.com/p/26650204 6 | 7 | -------------------------------------------------------------------------------- /java-basic/concurrent/README.md: -------------------------------------------------------------------------------- 1 | 1. jmm-specification 2 | 2. thread-syncronized 3 | 3. thread-current 4 | 4. -------------------------------------------------------------------------------- /java-basic/concurrent/jmm-specification/README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | AsIfSerialSample AsIfSerial语义 4 | Jmm01_HappensBefore HappensBefore 5 | Jmm05_CodeReorder 指令重排序 6 | Jmm06_MemoryBarrier 内存屏障 7 | 8 | -------------------------------------------------------------------------------- /java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/UncaughtExceptionHandler/README.md: -------------------------------------------------------------------------------- 1 | 2 | JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止 3 | https://blog.csdn.net/u013256816/article/details/50417822 4 | -------------------------------------------------------------------------------- /java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/UncaughtExceptionHandler/Task.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.concurrent.UncaughtExceptionHandler; 2 | 3 | public class Task implements Runnable { 4 | @Override 5 | public void run() { 6 | System.out.println(3 / 2); 7 | System.out.println(3 / 0); 8 | System.out.println(3 / 1); 9 | } 10 | } -------------------------------------------------------------------------------- /java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/basic/README.md: -------------------------------------------------------------------------------- 1 | # basic 2 | 1. communicate ;线程通信相关 3 | 2. createthread;线程创建相关 4 | 3. Interrupted ;线程中断相关 5 | 4. state ;线程状态相关 6 | 5. syncronized ;线程锁、锁升级相关 7 | 6. threadlocal ; 8 | 7. DeadLockDemo;死锁 demo 9 | 8. Daemon;守护线程 10 | 9. Deprecated;线程暂停、恢复和停止对应线程Thread的API就是suspend()、resume()和stop(),这些方法已经被废弃 -------------------------------------------------------------------------------- /java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/basic/SleepUtils.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.concurrent.basic; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | public class SleepUtils { 6 | public static void second(long seconds) { 7 | try { 8 | TimeUnit.SECONDS.sleep(seconds); 9 | } catch (InterruptedException e) { 10 | e.printStackTrace(); 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/basic/communicate/README.md: -------------------------------------------------------------------------------- 1 | # 线程间通信 2 | 1. WaitNotify 3 | 2. Join 4 | 3. Piped;管道输入/输出流和普通的文件输入/输出流或者网络输入/输出流不同之处在于,它主要 5 | 用于线程之间的数据传输,而传输的媒介为内存。 6 | -------------------------------------------------------------------------------- /java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/basic/synchronized1/README.md: -------------------------------------------------------------------------------- 1 | # synchronize原理 2 | 3 | 使用jol-core 4 | 5 | 1. T0_ObjectSize;无锁、可偏向锁 6 | 2. T0_BasicLock;偏向锁-》轻量级锁 7 | 3. T0_heavyWeightMonitor;自旋锁后未获得到锁,升级重量级锁, 8 | 4. Juc_PrintMarkWord;对象处在偏向锁,调用hashcode,会升级为轻量级锁,因为偏向锁无法记录hashcode。 9 | -------------------------------------------------------------------------------- /java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/basic/threadlocal/README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1. ThreadLocalDemo;的用法 4 | 2. ThreadLocalDemo2;一个线程多个local 5 | 3. InheritableThreadLocalDemo;InheritableThreadLocal解决父子线程local传递问题 6 | 4. InheritableThreadLocalDemo2;InheritableThreadLocal在线程池中的窘境 7 | 5. AlibabaThreadLocalDemo;通过修饰runnable解决InheritableThreadLocal的问题 8 | -------------------------------------------------------------------------------- /java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/example/README.md: -------------------------------------------------------------------------------- 1 | # 线程的一些案例 2 | 1. future;手写future 3 | 2. alternate;线程交替打印ABCABC 4 | 3. productconsumer;生产者消费者 5 | 6 | -------------------------------------------------------------------------------- /java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/example/future/Data.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.concurrent.example.future; 2 | 3 | //公共data数据接口 4 | public abstract class Data { 5 | //方法作用 返回线程执行结果 6 | public abstract String getRequest(); 7 | } -------------------------------------------------------------------------------- /java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/example/future/README.md: -------------------------------------------------------------------------------- 1 | 手写future 2 | -------------------------------------------------------------------------------- /java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/juc/README.md: -------------------------------------------------------------------------------- 1 | # locks 锁相关 2 | # aqs aqs相关 3 | # tools 4 | # executor 5 | # blockingqueue 6 | # lockfree 无锁 7 | 8 | 9 | locksupport waiting当前线程 10 | future 获取异步执行的结果 11 | completefuture 获取异步执行的结果 12 | 13 | 14 | -------------------------------------------------------------------------------- /java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/juc/aqs/README.md: -------------------------------------------------------------------------------- 1 | 1. ThreadNoSafe 线程不安全 2 | 2. ThreadSafe 通过互斥保证线程安全 3 | 3. mylock1 手动实现Lock,通过synchronized和wait、notify 4 | 4. mylock2 手动实现Lock,通过aqs -------------------------------------------------------------------------------- /java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/juc/completefuture/README.md: -------------------------------------------------------------------------------- 1 | 2 | 脱离线程池使用 3 | CFutureMain1 手动设置future完成状态 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/juc/executor/README.md: -------------------------------------------------------------------------------- 1 | 2 | 1. RejectedExecutionHandlerTest;线程池拒绝策略 3 | 2. ScheduledExecutorTest;调度线程池 4 | 3. ThreadPoolIdTest;验证线程池的线程复用 5 | 4. ThreadPoolExceptionTest;线程池execute执行异常,线程会不断创建 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/juc/executor/trace/DivTask.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.concurrent.juc.executor.trace; 2 | 3 | public class DivTask implements Runnable { 4 | int a,b; 5 | public DivTask(int a,int b){ 6 | this.a=a; 7 | this.b=b; 8 | } 9 | @Override 10 | public void run() { 11 | double re=a/b; 12 | System.out.println(re); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/juc/executor/trace/README.md: -------------------------------------------------------------------------------- 1 | CatchException;线程池如何处理异常 2 | TraceMain;包装线程池异常 3 | 4 | -------------------------------------------------------------------------------- /java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/juc/locksupport/README.md: -------------------------------------------------------------------------------- 1 | ## 一、线程阻塞唤醒 2 | 方式1: 使用Object中的wait()方法让线程等待, 使用Object中的notify()方法唤醒线程 3 | 方式2: 使用JUC包中Condition的await()方法让线程等待,使用signal()方法唤醒线程 4 | 方式3: LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程 5 | 6 | ## 二、优缺点 7 | 传统的synchronized和Lock实现等待唤醒通知的约束 8 | 1. 线程先要获得并持有锁,必须在锁块(synchronized或lock)中 9 | 2. 必须要先等待后唤醒,线程才能够被唤醒 10 | 11 | 12 | -------------------------------------------------------------------------------- /java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/juc/tools/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/juc/tools/README.md -------------------------------------------------------------------------------- /java-basic/concurrent/src/main/java/cn/lastwhisper/concurrent/unsafe/README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 为什么JUC中大量使用了sun.misc.Unsafe 这个类,但官方却不建议开发者使用? - 落白的回答 - 知乎 6 | https://www.zhihu.com/question/29266773/answer/2461567743 7 | 8 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/advance/decorator_vs_proxy/Boxer.java: -------------------------------------------------------------------------------- 1 | package com.desgin.advance.decorator_vs_proxy; 2 | 3 | /** 4 | * 拳击手 5 | * @author lastwhisper 6 | * @date 2020/4/12 7 | */ 8 | public interface Boxer { 9 | 10 | // 打拳 11 | void fight(); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/advance/decorator_vs_proxy/README.md: -------------------------------------------------------------------------------- 1 | decorator_proxy为装饰者模式与代理模式的对比 2 | https://www.zhihu.com/question/41988550/answer/462204684 3 | 拳击手、经纪人、移速鞋 4 | 5 | 6 | 7 | 看过钢铁侠没? 8 | 史塔克穿反浩克战甲(装饰模式) 9 | 但是史塔克没能力自己穿,只能让贾维斯帮自己从太空上叫下来(代理模式) 10 | 贾维斯只有一个(代理模式不会无限代理) 11 | mark装甲有无数个(装饰模式可以无限增强) 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/mashibing/chainofresponsibility/README.md: -------------------------------------------------------------------------------- 1 | 2 | 责任链实现 3 | v1:多个过滤器逻辑写在一起 4 | 问题:如何支持可配置化拦截器? 5 | v2:各个过滤器责任单一 6 | 问题:如何支持可配置化拦截器? 7 | v3:通过一个上下文类,支持配置化 8 | v4: 9 | v4、v5:本质上差不多,但是v5通过模板方法,固定调用了流程,降低了使用门槛 10 | 11 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/mashibing/chainofresponsibility/interfaceImpl/v2/FaceFilter.java: -------------------------------------------------------------------------------- 1 | package com.desgin.mashibing.chainofresponsibility.interfaceImpl.v2; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class FaceFilter implements Filter { 7 | // process the face tag <> 8 | @Override 9 | public String doFilter(String str) { 10 | return str.replaceAll("QAQ", "^V^"); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/mashibing/chainofresponsibility/interfaceImpl/v2/Filter.java: -------------------------------------------------------------------------------- 1 | package com.desgin.mashibing.chainofresponsibility.interfaceImpl.v2; 2 | 3 | public interface Filter { 4 | String doFilter(String str); 5 | } 6 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/mashibing/chainofresponsibility/interfaceImpl/v3/Filter.java: -------------------------------------------------------------------------------- 1 | package com.desgin.mashibing.chainofresponsibility.interfaceImpl.v3; 2 | 3 | public interface Filter { 4 | String doFilter(String str); 5 | } 6 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/mashibing/chainofresponsibility/interfaceImpl/v4/Filter.java: -------------------------------------------------------------------------------- 1 | package com.desgin.mashibing.chainofresponsibility.interfaceImpl.v4; 2 | 3 | public interface Filter { 4 | void doFilter(Request request, Response response, FilterChain chain); 5 | } 6 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/mashibing/chainofresponsibility/interfaceImpl/v5/Filter.java: -------------------------------------------------------------------------------- 1 | package com.desgin.mashibing.chainofresponsibility.interfaceImpl.v5; 2 | 3 | public interface Filter { 4 | /** 5 | * 责任链 6 | * @param request 7 | * @param response 8 | * @param chain 9 | */ 10 | void doFilter(Request request, Response response, FilterChain chain); 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/mashibing/command/Command.java: -------------------------------------------------------------------------------- 1 | package com.desgin.mashibing.command; 2 | 3 | public abstract class Command { 4 | public abstract void execute(); 5 | public abstract void unDo(); 6 | } 7 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/mashibing/command/HugCommand.java: -------------------------------------------------------------------------------- 1 | package com.desgin.mashibing.command; 2 | 3 | public class HugCommand extends Command { 4 | 5 | @Override 6 | public void execute() { 7 | System.out.println("hug"); 8 | } 9 | 10 | @Override 11 | public void unDo() { 12 | System.out.println("open your arms"); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/mashibing/command/ShoppingCommand.java: -------------------------------------------------------------------------------- 1 | package com.desgin.mashibing.command; 2 | 3 | public class ShoppingCommand extends Command { 4 | 5 | @Override 6 | public void execute() { 7 | System.out.println("zoo"); 8 | } 9 | 10 | @Override 11 | public void unDo() { 12 | System.out.println("undo zoo"); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/mashibing/iterator/Cat.java: -------------------------------------------------------------------------------- 1 | package com.desgin.mashibing.iterator; 2 | 3 | public class Cat { 4 | public Cat(int id) { 5 | super(); 6 | this.id = id; 7 | } 8 | 9 | private int id; 10 | 11 | @Override 12 | public String toString() { 13 | return "cat:" + id; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/mashibing/iterator/Collection.java: -------------------------------------------------------------------------------- 1 | package com.desgin.mashibing.iterator; 2 | 3 | public interface Collection { 4 | void add(Object o); 5 | int size(); 6 | Iterator iterator(); 7 | } 8 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/mashibing/iterator/Iterator.java: -------------------------------------------------------------------------------- 1 | package com.desgin.mashibing.iterator; 2 | 3 | public interface Iterator { 4 | Object next(); 5 | boolean hasNext(); 6 | } 7 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/mashibing/strategy/Comparable.java: -------------------------------------------------------------------------------- 1 | package com.desgin.mashibing.strategy; 2 | 3 | //使一个类本身具备比较性 4 | //优点:实现此接口的类可以自己重写自己规定比较的内容 5 | //缺点:因为只有一个方法,一个类只能有一种方式进行比较 6 | public interface Comparable { 7 | public int compareTo(T o); 8 | } 9 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/mashibing/strategy/Comparator.java: -------------------------------------------------------------------------------- 1 | package com.desgin.mashibing.strategy; 2 | 3 | public interface Comparator { 4 | int compare(Object o1, Object o2); 5 | } 6 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/chainofresponsibility/README.md: -------------------------------------------------------------------------------- 1 | 请查看 design-pattern 项目 com/desgin/mashibing/chainofresponsibility 包 -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/command/Command.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.command; 2 | 3 | /** 4 | * 抽象命令类:抽象的命令,可以根据不同类型的命令写出不同的实现 5 | */ 6 | public interface Command { 7 | void execute(); 8 | } 9 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/interpreter/DivNode.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.interpreter; 2 | 3 | public class DivNode extends SymbolNode { 4 | public DivNode(Node left, Node right) { 5 | super(left, right); 6 | } 7 | 8 | @Override 9 | public int interpret() { 10 | return super.left.interpret() / super.right.interpret(); 11 | } 12 | } -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/interpreter/ModNode.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.interpreter; 2 | 3 | public class ModNode extends SymbolNode { 4 | public ModNode(Node left, Node right) { 5 | super(left, right); 6 | } 7 | 8 | @Override 9 | public int interpret() { 10 | return super.left.interpret() % super.right.interpret(); 11 | } 12 | } -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/interpreter/MulNode.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.interpreter; 2 | 3 | public class MulNode extends SymbolNode { 4 | public MulNode(Node left, Node right) { 5 | super(left, right); 6 | } 7 | 8 | @Override 9 | public int interpret() { 10 | return left.interpret() * right.interpret(); 11 | } 12 | } -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/interpreter/Node.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.interpreter; 2 | 3 | public interface Node { 4 | public int interpret(); 5 | } -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/interpreter/SymbolNode.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.interpreter; 2 | 3 | public abstract class SymbolNode implements Node { 4 | protected Node left; 5 | protected Node right; 6 | 7 | public SymbolNode(Node left, Node right) { 8 | this.left = left; 9 | this.right = right; 10 | } 11 | } -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/interpreter/ValueNode.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.interpreter; 2 | 3 | public class ValueNode implements Node 4 | { 5 | private int value; 6 | 7 | public ValueNode(int value) 8 | { 9 | this.value=value; 10 | } 11 | 12 | @Override 13 | public int interpret() 14 | { 15 | return this.value; 16 | } 17 | } -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/iterator/Course.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.iterator; 2 | 3 | public class Course { 4 | private String name; 5 | 6 | public Course(String name) { 7 | this.name = name; 8 | } 9 | 10 | public String getName() { 11 | return name; 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/iterator/CourseAggregate.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.iterator; 2 | 3 | public interface CourseAggregate { 4 | 5 | void addCourse(Course course); 6 | void removeCourse(Course course); 7 | /**获取迭代器 */ 8 | CourseIterator getCourseIterator(); 9 | } 10 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/iterator/CourseIterator.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.iterator; 2 | 3 | public interface CourseIterator { 4 | Course nextCourse(); 5 | 6 | boolean isLastCourse(); 7 | } 8 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/mediator/StudyGroup.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.mediator; 2 | 3 | import java.util.Date; 4 | 5 | public class StudyGroup { 6 | public static void showMessage(User user, String message) { 7 | System.out.println(new Date().toString()+"["+user.getName()+"]:"+message); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/mediator/Test.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.mediator; 2 | 3 | public class Test { 4 | public static void main(String[] args) { 5 | User tom = new User("ldc"); 6 | User jack = new User("ghl"); 7 | 8 | tom.sendMessage("hey!jack"); 9 | jack.sendMessage("hey!tom"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/mediator/my/Mediator.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.mediator.my; 2 | 3 | public abstract class Mediator { 4 | //申明一个联络方法 5 | public abstract void constact(String message, Person person); 6 | } -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/mediator/my/Person.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.mediator.my; 2 | 3 | public abstract class Person { 4 | protected String name; 5 | protected Mediator mediator; 6 | 7 | Person(String name,Mediator mediator){ 8 | this.name = name; 9 | this.mediator = mediator; 10 | } 11 | 12 | } -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/memento/my/Caretaker.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.memento.my; 2 | 3 | public class Caretaker { 4 | Memento memento; 5 | 6 | public Memento getMemento() { 7 | return memento; 8 | } 9 | 10 | public void setMemento(Memento memento) { 11 | this.memento = memento; 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/observer/guavatest/GuavaEvent.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.observer.guavatest; 2 | 3 | import com.google.common.eventbus.Subscribe; 4 | 5 | /** 6 | * Create by lastwhisper on 2019/2/11 7 | */ 8 | public class GuavaEvent { 9 | @Subscribe 10 | public void subscribe(String str) { 11 | System.out.println("执行subscribe方法,传入:" + str); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/observer/my/Observer.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.observer.my; 2 | 3 | /*** 4 | * 抽象观察者 5 | * 定义了一个update()方法,当被观察者调用notifyObservers()方法时,观察者的update()方法会被回调。 6 | * @author lastwhisper 7 | * 8 | */ 9 | public interface Observer { 10 | /** 11 | * 观察者接收通知 12 | * @param message 13 | */ 14 | void update(String message); 15 | } -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/strategy/EmptyPromotionStrategy.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.strategy; 2 | 3 | public class EmptyPromotionStrategy implements PromotionStrategy { 4 | @Override 5 | public void doPromotion() { 6 | System.out.println("无促销"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/strategy/FanXianPromotionStrategy.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.strategy; 2 | 3 | public class FanXianPromotionStrategy implements PromotionStrategy { 4 | 5 | @Override 6 | public void doPromotion() { 7 | System.out.println("反现促销,返回的金额存放到网站用户的余额中"); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/strategy/LiJianPromotionStrategy.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.strategy; 2 | 3 | public class LiJianPromotionStrategy implements PromotionStrategy{ 4 | @Override 5 | public void doPromotion() { 6 | System.out.println("立减促销,课程的价格直接减去配置的价格"); 7 | } 8 | } 9 | 10 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/strategy/ManJianPromotionStrategy.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.strategy; 2 | 3 | public class ManJianPromotionStrategy implements PromotionStrategy{ 4 | 5 | @Override 6 | public void doPromotion() { 7 | System.out.println("满减促销,满200减20元"); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/strategy/PromotionStrategy.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.strategy; 2 | 3 | public interface PromotionStrategy { 4 | void doPromotion(); 5 | } 6 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/templatemethod/DesignPatternCourse.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.templatemethod; 2 | 3 | public class DesignPatternCourse extends ACourse { 4 | @Override 5 | void packageCourse() { 6 | System.out.println("提供课程Java源代码"); 7 | } 8 | 9 | @Override 10 | protected boolean needWriteArticle() { 11 | return true; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/visitor/FreeCourse.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.visitor; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/2/11 5 | */ 6 | public class FreeCourse extends Course { 7 | @Override 8 | public void accept(IVisitor visitor) { 9 | visitor.visit(this); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/behavioral/visitor/IVisitor.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.behavioral.visitor; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/2/11 5 | */ 6 | public interface IVisitor { 7 | void visit(FreeCourse freeCourse); 8 | 9 | void visit(CodingCourse codingCourse); 10 | } 11 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/abstractfactory/Article.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.abstractfactory; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/24 5 | */ 6 | public abstract class Article { 7 | public abstract void produce(); 8 | } 9 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/abstractfactory/CourseFactory.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.abstractfactory; 2 | 3 | 4 | 5 | /** 6 | * Create by lastwhisper on 2019/1/24 7 | */ 8 | public interface CourseFactory { 9 | Video getVideo(); 10 | Article getArticle(); 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/abstractfactory/JavaArticle.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.abstractfactory; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/24 5 | */ 6 | public class JavaArticle extends Article { 7 | @Override 8 | public void produce() { 9 | System.out.println("编写Java课程手记"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/abstractfactory/JavaVideo.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.abstractfactory; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/24 5 | */ 6 | public class JavaVideo extends Video { 7 | @Override 8 | public void produce() { 9 | System.out.println("录制Java课程视频"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/abstractfactory/PythonArticle.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.abstractfactory; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/24 5 | */ 6 | public class PythonArticle extends Article { 7 | @Override 8 | public void produce() { 9 | System.out.println("编写Python课程手记"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/abstractfactory/PythonVideo.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.abstractfactory; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/24 5 | */ 6 | public class PythonVideo extends Video { 7 | @Override 8 | public void produce() { 9 | System.out.println("录制python课程视频 "); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/abstractfactory/Video.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.abstractfactory; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/24 5 | */ 6 | public abstract class Video { 7 | public abstract void produce(); 8 | } 9 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/factorymethod/FEVideo.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.factorymethod; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/24 5 | */ 6 | public class FEVideo extends Video { 7 | @Override 8 | public void produce() { 9 | System.out.println("录制前端课程视频"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/factorymethod/FEVideoFactory.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.factorymethod; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/24 5 | */ 6 | public class FEVideoFactory extends VideoFactory { 7 | public Video getVideo() { 8 | return new FEVideo(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/factorymethod/JavaVideo.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.factorymethod; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/23 5 | */ 6 | public class JavaVideo extends Video { 7 | @Override 8 | public void produce() { 9 | System.out.println("录制java课程"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/factorymethod/JavaVideoFactory.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.factorymethod; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/24 5 | */ 6 | public class JavaVideoFactory extends VideoFactory { 7 | public Video getVideo() { 8 | return new JavaVideo(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/factorymethod/PythonVideo.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.factorymethod; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/23 5 | */ 6 | public class PythonVideo extends Video { 7 | @Override 8 | public void produce() { 9 | System.out.println("录制python课程"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/factorymethod/PythonVideoFactory.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.factorymethod; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/24 5 | */ 6 | public class PythonVideoFactory extends VideoFactory { 7 | public Video getVideo() { 8 | return new PythonVideo(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/factorymethod/Video.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.factorymethod; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/23 5 | */ 6 | public abstract class Video { 7 | public abstract void produce(); 8 | } 9 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/factorymethod/VideoFactory.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.factorymethod; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/23 5 | */ 6 | public abstract class VideoFactory { 7 | 8 | public abstract Video getVideo(); 9 | 10 | } 11 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/prototype/abstractprototype/A.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.prototype.abstractprototype; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/27 5 | */ 6 | public abstract class A implements Cloneable{ 7 | @Override 8 | protected Object clone() throws CloneNotSupportedException { 9 | return super.clone(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/prototype/abstractprototype/B.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.prototype.abstractprototype; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/27 5 | */ 6 | public class B extends A{ 7 | public static void main(String[] args) throws CloneNotSupportedException { 8 | B b = new B(); 9 | b.clone(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/simplefactory/JavaVideo.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.simplefactory; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/23 5 | */ 6 | public class JavaVideo extends Video{ 7 | @Override 8 | public void produce() { 9 | System.out.println("录制java课程"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/simplefactory/PythonVideo.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.simplefactory; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/23 5 | */ 6 | public class PythonVideo extends Video { 7 | @Override 8 | public void produce() { 9 | System.out.println("录制python课程"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/simplefactory/Test.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.simplefactory; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/23 5 | */ 6 | public class Test { 7 | public static void main(String[] args) { 8 | Video video = VideoFactory.getVideo(JavaVideo.class); 9 | video.produce(); 10 | 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/simplefactory/Video.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.simplefactory; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/23 5 | */ 6 | public abstract class Video { 7 | public abstract void produce(); 8 | } 9 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/singleton/CASSingletonTest.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.singleton; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class CASSingletonTest { 7 | public static void main(String[] args){ 8 | //Thread t1 = new Thread(new T()); 9 | //Thread t2 = new Thread(new T()); 10 | //t1.start(); 11 | //t2.start(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/creational/singleton/my/Singleton5.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.creational.singleton.my; 2 | 3 | /** 4 | * 懒汉式:枚举 5 | */ 6 | public enum Singleton5 { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/classadapter/Adaptee.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.adapter.classadapter; 2 | 3 | public class Adaptee { 4 | public void adapteeRequest() { 5 | System.out.println("被适配者的方法"); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/classadapter/Adapter.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.adapter.classadapter; 2 | 3 | public class Adapter extends Adaptee implements Target { 4 | @Override 5 | public void request() { 6 | super.adapteeRequest(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/classadapter/ConcreteTarget.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.adapter.classadapter; 2 | 3 | /** 4 | * 具体的实现类 5 | */ 6 | public class ConcreteTarget implements Target { 7 | @Override 8 | public void request() { 9 | System.out.println("ConcreteTarget目标方法"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/classadapter/Target.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.adapter.classadapter; 2 | 3 | public interface Target { 4 | void request(); 5 | } 6 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/exmaple/AC220.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.adapter.exmaple; 2 | 3 | public class AC220 { 4 | public int outputAC220V() { 5 | int output = 220; 6 | System.out.println("输出220V的交流电"+output+"V"); 7 | return output; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/exmaple/DC5.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.adapter.exmaple; 2 | 3 | public interface DC5 { 4 | int outputDC5V(); 5 | } 6 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/exmaple/Test.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.adapter.exmaple; 2 | 3 | public class Test { 4 | public static void main(String[]args){ 5 | DC5 dc5 = new PowerAdapter(); 6 | dc5.outputDC5V(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/objectadapter/Adaptee.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.adapter.objectadapter; 2 | 3 | public class Adaptee { 4 | public void adapteeRequest() { 5 | System.out.println("被适配者的方法"); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/objectadapter/Adapter.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.adapter.objectadapter; 2 | 3 | public class Adapter implements Target { 4 | 5 | private Adaptee adaptee = new Adaptee(); 6 | 7 | @Override 8 | public void request() { 9 | adaptee.adapteeRequest(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/objectadapter/ConcreteTarget.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.adapter.objectadapter; 2 | 3 | /** 4 | * 具体的实现类 5 | */ 6 | public class ConcreteTarget implements Target { 7 | @Override 8 | public void request() { 9 | System.out.println("ConcreteTarget目标方法"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/adapter/objectadapter/Target.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.adapter.objectadapter; 2 | 3 | public interface Target { 4 | void request(); 5 | } 6 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/bridge/Account.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.bridge; 2 | 3 | public interface Account { 4 | /** 5 | * 打开我们的账号,打开账号,就要返回账号 6 | */ 7 | Account openAccount(); 8 | 9 | /** 10 | * 打开我们的账号,查看为什么账户类型,是定期类型还是活期类型 11 | */ 12 | void showAccountType(); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/decorator/v1/Battercake.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.decorator.v1; 2 | 3 | /** 4 | * @author Administrator 5 | */ 6 | public class Battercake { 7 | protected String getDesc() { 8 | return "煎饼"; 9 | } 10 | 11 | protected int cost() { 12 | return 8; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/decorator/v1/BattercakeWithEgg.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.decorator.v1; 2 | 3 | public class BattercakeWithEgg extends Battercake { 4 | @Override 5 | public String getDesc() { 6 | return super.getDesc() + "加一个鸡蛋"; 7 | } 8 | 9 | @Override 10 | public int cost() { 11 | return super.cost() + 1; 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/decorator/v1/BattercakeWithEggSausage.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.decorator.v1; 2 | 3 | public class BattercakeWithEggSausage extends BattercakeWithEgg { 4 | @Override 5 | public String getDesc() { 6 | return super.getDesc() + "一个香肠"; 7 | } 8 | 9 | @Override 10 | public int cost() { 11 | return super.cost() + 2; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/decorator/v2/ABattercake.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.decorator.v2; 2 | 3 | public abstract class ABattercake { 4 | protected abstract String getDesc(); 5 | 6 | protected abstract int cost(); 7 | } 8 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/decorator/v2/Battercake.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.decorator.v2; 2 | 3 | public class Battercake extends ABattercake { 4 | @Override 5 | protected String getDesc() { 6 | return "煎饼"; 7 | } 8 | 9 | @Override 10 | protected int cost() { 11 | return 8; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/facade/PointsGift.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.facade; 2 | 3 | /** 4 | * 积分礼物 5 | */ 6 | public class PointsGift { 7 | private String name; 8 | 9 | public PointsGift(String name) { 10 | this.name = name; 11 | } 12 | 13 | public String getName() { 14 | return name; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/facade/PointsPaymentService.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.facade; 2 | 3 | public class PointsPaymentService { 4 | public boolean pay(PointsGift pointsGift) { 5 | /** 扣减积分 */ 6 | System.out.println("支付" + pointsGift.getName() + " 积分成功"); 7 | return true; 8 | } 9 | } -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/facade/QualifyService.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.facade; 2 | 3 | public class QualifyService { 4 | public boolean isAvailable(PointsGift pointsGift) { 5 | System.out.println("校验" + pointsGift.getName() + "积分资格通过,库存通过"); 6 | return true; 7 | } 8 | } -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/facade/ShippingService.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.facade; 2 | 3 | public class ShippingService { 4 | public String shipGift(PointsGift pointsGift) { 5 | /** 物流系统对接逻辑 */ 6 | System.out.println(pointsGift.getName() + "进入物流系统"); 7 | String shippingOrderNo = "666"; 8 | return shippingOrderNo; 9 | } 10 | } -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/facade/Test.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.facade; 2 | 3 | public class Test { 4 | public static void main(String[] args) { 5 | PointsGift pointsGift = new PointsGift("T恤"); 6 | GiftExchangeService giftExchangeService = new GiftExchangeService(); 7 | giftExchangeService.giftExchange(pointsGift); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/flyweight/Employee.java: -------------------------------------------------------------------------------- 1 | package com.desgin.pattern.structural.flyweight; 2 | 3 | public interface Employee { 4 | void report(); 5 | } 6 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/pattern/structural/proxy/README.md: -------------------------------------------------------------------------------- 1 | 移至 java-advance/proxy 目录 -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/demeter/Boss.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.demeter; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * Create by lastwhisper on 2019/1/22 8 | */ 9 | public class Boss { 10 | public void commandCheckNumber(TeamLeader teamLeader) { 11 | teamLeader.checkNumberOfCourse(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/demeter/Course.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.demeter; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/22 5 | */ 6 | public class Course { 7 | } 8 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/demeter/Test.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.demeter; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/22 5 | */ 6 | public class Test { 7 | public static void main(String[] args){ 8 | Boss boss = new Boss(); 9 | TeamLeader teamLeader = new TeamLeader(); 10 | boss.commandCheckNumber(teamLeader); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/dependencyInversion/v1/Bottom.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.dependencyInversion.v1; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class Bottom { 7 | private Tire tire; 8 | 9 | public Bottom() { 10 | this.tire = new Tire(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/dependencyInversion/v1/Car.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.dependencyInversion.v1; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class Car { 7 | private Framework framework; 8 | 9 | public Car() { 10 | this.framework = new Framework(); 11 | } 12 | 13 | public void run() { 14 | System.out.println("汽车跑起来了"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/dependencyInversion/v1/Client.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.dependencyInversion.v1; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class Client { 7 | public static void main(String[] args){ 8 | // 改动一下轮胎(Tire)类,把它的尺寸变成动态,比较麻烦 9 | // 需要修改源代码 10 | Car car = new Car(); 11 | car.run(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/dependencyInversion/v1/Framework.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.dependencyInversion.v1; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class Framework { 7 | private Bottom bottom; 8 | 9 | public Framework() { 10 | this.bottom = new Bottom(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/dependencyInversion/v1/Tire.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.dependencyInversion.v1; 2 | 3 | /** 4 | * 先设计tire 5 | * @author lastwhisper 6 | */ 7 | public class Tire { 8 | private int size; 9 | 10 | public Tire() { 11 | this.size = 30; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/dependencyInversion/v2/Bottom.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.dependencyInversion.v2; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class Bottom { 7 | private Tire tire; 8 | 9 | public Bottom(Tire tire) { 10 | this.tire = tire; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/dependencyInversion/v2/Car.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.dependencyInversion.v2; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class Car { 7 | private Framework framework; 8 | 9 | public Car(Framework framework) { 10 | this.framework = framework; 11 | } 12 | 13 | public void run() { 14 | System.out.println("汽车跑起来了"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/dependencyInversion/v2/Framework.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.dependencyInversion.v2; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class Framework { 7 | private Bottom bottom; 8 | 9 | public Framework(Bottom bottom) { 10 | this.bottom = bottom; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/dependencyInversion/v2/Tire.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.dependencyInversion.v2; 2 | 3 | /** 4 | * 先设计tire 5 | * @author lastwhisper 6 | */ 7 | public class Tire { 8 | private int size; 9 | 10 | public Tire(int size) { 11 | this.size = size; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/interfacesegregation/Dog.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.interfacesegregation; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/22 5 | */ 6 | public class Dog implements IEatAnimalAction,ISwimAnimalAction { 7 | 8 | 9 | @Override 10 | public void eat() { 11 | 12 | } 13 | 14 | @Override 15 | public void swim() { 16 | 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/interfacesegregation/IAnimalAction.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.interfacesegregation; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/22 5 | */ 6 | public interface IAnimalAction { 7 | void eat(); 8 | void fly(); 9 | void swim(); 10 | } 11 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/interfacesegregation/IEatAnimalAction.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.interfacesegregation; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/22 5 | */ 6 | public interface IEatAnimalAction { 7 | void eat(); 8 | } 9 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/interfacesegregation/IFlyAnimalAction.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.interfacesegregation; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/22 5 | */ 6 | public interface IFlyAnimalAction { 7 | void fly(); 8 | } 9 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/interfacesegregation/ISwimAnimalAction.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.interfacesegregation; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/22 5 | */ 6 | public interface ISwimAnimalAction { 7 | void swim(); 8 | } 9 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/openclose/ICourse.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.openclose; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/22 5 | */ 6 | public interface ICourse { 7 | Integer getId(); 8 | String getName(); 9 | Double getPrice(); 10 | //Double getDiscountPrice(); 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/singleresponsibility/FlyBird.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.singleresponsibility; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | /** 7 | * Create by lastwhisper on 2019/1/22 8 | */ 9 | public class FlyBird { 10 | public void mainMoveMode(String birdName) { 11 | System.out.println(birdName + "用翅膀飞"); 12 | Map map = new HashMap(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/singleresponsibility/ICourse.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.singleresponsibility; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/22 5 | */ 6 | public interface ICourse { 7 | String getCourseName(); 8 | 9 | byte[] getCourseVideo(); 10 | 11 | void studyCourse(); 12 | 13 | void refundCourse(); 14 | } 15 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/singleresponsibility/ICourseContent.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.singleresponsibility; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/22 5 | */ 6 | public interface ICourseContent { 7 | String getCourseName(); 8 | 9 | byte[] getCourseVideo(); 10 | } 11 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/singleresponsibility/ICourseManager.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.singleresponsibility; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/22 5 | */ 6 | public interface ICourseManager { 7 | void studyCourse(); 8 | 9 | void refundCourse(); 10 | } 11 | -------------------------------------------------------------------------------- /java-basic/design-pattern/src/main/java/com/desgin/principle/singleresponsibility/WalkBird.java: -------------------------------------------------------------------------------- 1 | package com.desgin.principle.singleresponsibility; 2 | 3 | /** 4 | * Create by lastwhisper on 2019/1/22 5 | */ 6 | public class WalkBird { 7 | public void mainMoveMode(String birdName) { 8 | System.out.println(birdName + "用脚走"); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /java-basic/feature-jdk5/README.md: -------------------------------------------------------------------------------- 1 | 参考“传智 张孝详 Java高新技术” 2 | 3 | # Jdk5的一些新特性学习 4 | - 自动拆装箱 AutoBox 5 | - 静态导入 StaticImport 6 | - 可变参数 VariableParameter 7 | - 枚举 enumtest 8 | - 注解 annotation 9 | - 反省与JavaBean introspection 10 | - beanutils beanutils 11 | - 反射 reflect 12 | - 泛型 generic 13 | - 类加载器;已从当前项目移除,查看该项目 github/code/java-basic/jvm/ 14 | - 动态代理;已从当前项目移除,查看该项目 github/code/java-advance/proxy 15 | - throwable 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /java-basic/feature-jdk5/src/main/java/cn/lastwhisper/AutoBox.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper; 2 | 3 | /** 4 | * jdk5新特性:自动拆箱与装箱 5 | * 语法糖,使开发的效率更高 6 | * IntegerCache缓存池,享元模式 7 | * @author lastwhisper 8 | */ 9 | public class AutoBox { 10 | 11 | public static void main(String[] args) { 12 | // 语法糖 13 | //Integer it = 555;//自动装箱 14 | //int i = it;//自动拆箱 15 | 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /java-basic/feature-jdk5/src/main/java/cn/lastwhisper/annotation/StudentRsp.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.annotation; 2 | 3 | /** 4 | * @author cunchang 5 | * @date 2021/4/19 8:02 下午 6 | */ 7 | public class StudentRsp { 8 | 9 | /** 10 | * stable beisen_test_name 11 | * real beisen_pro_name 12 | */ 13 | @JsonProperty("beisen_test_name") 14 | public String name; 15 | 16 | 17 | } 18 | -------------------------------------------------------------------------------- /java-basic/feature-jdk5/src/main/java/cn/lastwhisper/generic/Generic4/PersonDao.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.generic.Generic4; 2 | 3 | /** 4 | * extends BaseDao是为了可以使用通用的方法 5 | * @author lastwhisper 6 | */ 7 | public interface PersonDao extends BaseDao { 8 | } 9 | -------------------------------------------------------------------------------- /java-basic/feature-jdk5/src/main/java/cn/lastwhisper/generic/Generic4/PersonDaoImpl.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.generic.Generic4; 2 | 3 | /** 4 | * extends BaseDaoImpl让通用模板知道你的泛型参数是啥,并且可以使用通用的方法 5 | * implements PersonDao是为了面向接口编程、以及更好的整合Spring 6 | * @author lastwhisper 7 | */ 8 | public class PersonDaoImpl extends BaseDaoImpl implements PersonDao { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /java-basic/feature-jdk5/src/main/java/cn/lastwhisper/io/nio/README.md: -------------------------------------------------------------------------------- 1 | 参考 https://blog.csdn.net/zxm1306192988/article/details/60581173 2 | 3 | 1. 缓冲区(Buffer);TestBuffer 4 | 2. 通道(Channel);TestChannel 5 | 3. 选择器(Selector) 6 | TestBlockingNIO;不使用Selector 7 | TestNIO;使用Selector 8 | TestNIO_UDP 9 | 4. 管道 (Pipe) 10 | TestPipe 11 | 5. Path 、Paths 、Files 12 | TestNIOPathFiles 13 | 14 | 15 | -------------------------------------------------------------------------------- /java-basic/feature-jdk5/src/main/java/cn/lastwhisper/reflect/pojo/MyObject.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.reflect.pojo; 2 | 3 | public class MyObject { 4 | 5 | } -------------------------------------------------------------------------------- /java-basic/feature-jdk5/src/main/resources/ExtClassloaderJar.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/java-basic/feature-jdk5/src/main/resources/ExtClassloaderJar.jar -------------------------------------------------------------------------------- /java-basic/feature-jdk5/src/main/resources/config.properties: -------------------------------------------------------------------------------- 1 | # 2 | className=TestArrayArguments 3 | 4 | 5 | -------------------------------------------------------------------------------- /java-basic/feature-jdk8/README.md: -------------------------------------------------------------------------------- 1 | 2 | # Jdk8的一些新特性学习 3 | - annotation 注解 4 | - date 日期 5 | - interfa 接口 6 | - lambda lambda 7 | - optional optional 8 | - stream stream 9 | 10 | 参考 https://blog.csdn.net/zxm1306192988/article/details/73744378 11 | 12 | 13 | # jdk6~7特性 14 | - spi 15 | - http://www.spring4all.com/article/260 16 | - resources/META-INF/services下为spi配置文件 17 | 18 | 19 | -------------------------------------------------------------------------------- /java-basic/feature-jdk8/src/main/java/cn/cunchang/date/LocalDateTest.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.date; 2 | 3 | import java.time.LocalDate; 4 | 5 | /** 6 | * @author cunchang 7 | * @date 2021/1/10 6:18 下午 8 | */ 9 | public class LocalDateTest { 10 | 11 | public static void main(String[] args) { 12 | LocalDate localDate = LocalDate.ofEpochDay(1610273688163L); 13 | System.out.println(localDate); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /java-basic/feature-jdk8/src/main/java/cn/cunchang/lambda/MyFun.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.lambda; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | @FunctionalInterface 7 | public interface MyFun { 8 | public Integer getValue(Integer num); 9 | } 10 | -------------------------------------------------------------------------------- /java-basic/feature-jdk8/src/main/java/cn/cunchang/lambda/example/MyFun2.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.lambda.example; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | @FunctionalInterface 7 | public interface MyFun2 { 8 | 9 | public String getValue(String str); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/feature-jdk8/src/main/java/cn/cunchang/lambda/example/MyFun3.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.lambda.example; 2 | 3 | @FunctionalInterface 4 | public interface MyFun3 { 5 | 6 | public R operation(T t1, T t2); 7 | 8 | } 9 | -------------------------------------------------------------------------------- /java-basic/feature-jdk8/src/main/java/cn/cunchang/lambda/strategy/EmployeeAgeFilter.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.lambda.strategy; 2 | 3 | import cn.cunchang.lambda.Employee; 4 | 5 | /** 6 | * @author lastwhisper 7 | */ 8 | public class EmployeeAgeFilter implements Filter { 9 | @Override 10 | public boolean eqCondition(Employee employee) { 11 | return employee.getAge() >= 35; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/feature-jdk8/src/main/java/cn/cunchang/lambda/strategy/EmployeeSalaryFilter.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.lambda.strategy; 2 | 3 | import cn.cunchang.lambda.Employee; 4 | 5 | /** 6 | * @author lastwhisper 7 | */ 8 | public class EmployeeSalaryFilter implements Filter { 9 | @Override 10 | public boolean eqCondition(Employee employee) { 11 | return employee.getSalary() >= 2000; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/feature-jdk8/src/main/java/cn/cunchang/lambda/strategy/Filter.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.lambda.strategy; 2 | 3 | /** 4 | * 过滤接口 5 | */ 6 | public interface Filter { 7 | boolean eqCondition(T t); 8 | } 9 | -------------------------------------------------------------------------------- /java-basic/feature-jdk8/src/main/java/cn/cunchang/stream/Status.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.stream; 2 | 3 | public enum Status { 4 | FREE, BUSY, VOCATION; 5 | } -------------------------------------------------------------------------------- /java-basic/feature-jdk8/src/main/java/cn/cunchang/参考.txt: -------------------------------------------------------------------------------- 1 | https://blog.csdn.net/zxm1306192988/article/details/73744378 -------------------------------------------------------------------------------- /java-basic/interview/README.MD: -------------------------------------------------------------------------------- 1 | Java学习中的一些疑惑的地方 2 | uuid 测试Java uuid是否可重复 3 | cpu 控制Java程序cpu的使用率 4 | Convert 进制转换 5 | timestamp 时间戳 6 | test1 修改集合内对象是否会同步 7 | RelationFile rm -rf 8 | string 测试string相关 9 | -------------------------------------------------------------------------------- /java-basic/interview/src/main/java/cn/lastwhisper/interview/AccessModifier/A1.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.interview.AccessModifier; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class A1 { 7 | // 不使用访问修饰符 8 | int a; 9 | // 不使用访问修饰符 10 | int sum(int m, int n) { 11 | return m + n; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/interview/src/main/java/cn/lastwhisper/interview/AccessModifier/A2.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.interview.AccessModifier; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class A2 { 7 | // protected修饰的变量——》受保护的变量 8 | protected int a; 9 | // protected修饰的方法——》受保护的方法 10 | protected int sum(int m, int n) { 11 | return m + n; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/interview/src/main/java/cn/lastwhisper/interview/AccessModifier/defaulttest/A.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.interview.AccessModifier.defaulttest; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class A { 7 | // 不使用访问修饰符 8 | int a; 9 | // 不使用访问修饰符 10 | int sum(int m, int n) { 11 | return m + n; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/interview/src/main/java/cn/lastwhisper/interview/AccessModifier/protectedtest/A.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.interview.AccessModifier.protectedtest; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class A { 7 | // protected修饰的变量——》受保护的变量 8 | protected int a; 9 | // protected修饰的方法——》受保护的方法 10 | protected int sum(int m, int n) { 11 | return m + n; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/interview/src/main/java/cn/lastwhisper/interview/AccessModifier/protectedtest/B.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.interview.AccessModifier.protectedtest; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class B { 7 | public static void main(String[] args) { 8 | //A2 aObject = new A2(); 9 | A aObject = new A(); 10 | // protected访问修饰,同包可以访问,不同包不可以访问 11 | aObject.a = 10; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/interview/src/main/java/cn/lastwhisper/interview/AccessModifier/publictest/A.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.interview.AccessModifier.publictest; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class A { 7 | // public修饰的变量——》公有变量 8 | public int a; 9 | // public修饰的方法——》公有方法 10 | public int sum(int m, int n) { 11 | return m + n; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/interview/src/main/java/cn/lastwhisper/interview/AccessModifier/publictest/B.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.interview.AccessModifier.publictest; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class B { 7 | public static void main(String[] args) { 8 | A aObject = new A(); 9 | // public访问修饰,在任何类中都可以访问 10 | aObject.a = 10; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /java-basic/interview/src/main/java/cn/lastwhisper/interview/InnerClass/anonymous/InnerClass.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.interview.InnerClass.anonymous; 2 | 3 | public interface InnerClass { 4 | // 接口方法默认public 5 | void print(); 6 | } 7 | -------------------------------------------------------------------------------- /java-basic/interview/src/main/java/cn/lastwhisper/interview/Operator/LogicalBitOperation.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.interview.Operator; 2 | 3 | /** 4 | * 逻辑位运算符 5 | * @author lastwhisper 6 | */ 7 | public class LogicalBitOperation { 8 | public static void main(String[] args) { 9 | int a = 5 & -4;// 4 10 | int b = 3 | 6;// 7 11 | int c = 10 ^ 3;// 9 12 | int d = ~(-14);// 13 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java-basic/interview/src/main/java/cn/lastwhisper/interview/OverloadVsOverride/SuperClass.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.interview.OverloadVsOverride; 2 | 3 | /** 4 | * 父类 5 | * @author lastwhisper 6 | */ 7 | public class SuperClass { 8 | protected int overrideFun(int a, int b) throws ArithmeticException { 9 | int divisor = a / b; 10 | return divisor; 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /java-basic/interview/src/main/resources/project-parent.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/java-basic/interview/src/main/resources/project-parent.zip -------------------------------------------------------------------------------- /java-basic/jvm/README.md: -------------------------------------------------------------------------------- 1 | src 2 | 1. classloader 类加载相关 3 | 2. classloading 类加载时机 4 | 3. ms 内存结构 5 | -------------------------------------------------------------------------------- /java-basic/jvm/src/main/java/cn/lastwhisper/jvm/classloader/DemoObj.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.jvm.classloader; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class DemoObj { 7 | static { 8 | System.out.println("类构造器"); 9 | } 10 | 11 | { 12 | System.out.println("对象构造器"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java-basic/jvm/src/main/java/cn/lastwhisper/jvm/classloader/READMD.md: -------------------------------------------------------------------------------- 1 | 2 | 1. ClassLoaderPrintTest 打印类加载器,Bootstrap、ext、app 3 | 2. ClassLoaderUnique 同一个类在同一个类加载器唯一 4 | 3. ClassLifeCycle 类加载生命周期 5 | 4. MyClassLoaderTest 自定义类加载器,查看双亲委派机制和父子关系构建 6 | 7 | 8 | -------------------------------------------------------------------------------- /java-basic/jvm/src/main/java/cn/lastwhisper/jvm/classloader/hotdeploy/HotCodeTest.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.jvm.classloader.hotdeploy; 2 | 3 | public class HotCodeTest { 4 | public void printVersion(){ 5 | System.out.println("当前版本是2哦"); 6 | } 7 | } -------------------------------------------------------------------------------- /java-basic/jvm/src/main/java/cn/lastwhisper/jvm/classloader/loadorder/LoadOrderTest.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.jvm.classloader.loadorder; 2 | 3 | /** 4 | * @author kaisui 5 | * @description 6 | * @date 2022/12/4 7 | */ 8 | public class LoadOrderTest { 9 | 10 | public static void main(String[] args) { 11 | System.out.println("load end"); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /java-basic/jvm/src/main/java/cn/lastwhisper/jvm/classloading/InterfaceInit.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.jvm.classloading; 2 | 3 | public interface InterfaceInit { 4 | public static int i = 0; 5 | } 6 | -------------------------------------------------------------------------------- /java-basic/jvm/src/main/java/cn/lastwhisper/jvm/classloading/StaticCodeTest.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.jvm.classloading; 2 | 3 | /** 4 | * 测试静态语句块和静态变量的顺序 5 | */ 6 | public class StaticCodeTest { 7 | static { 8 | i = 0; 9 | //System.out.println(i); 10 | } 11 | static int i = 1; 12 | } -------------------------------------------------------------------------------- /java-basic/jvm/src/main/java/cn/lastwhisper/jvm/classloading/passive/ConstClass.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.jvm.classloading.passive; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class ConstClass { 7 | public static final String HELLOWORLD = "hello world"; 8 | 9 | static { 10 | System.out.println("ConstClass init!"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /java-basic/jvm/src/main/java/cn/lastwhisper/jvm/classloading/passive/Interface.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.jvm.classloading.passive; 2 | 3 | public interface Interface { 4 | //一个接口在初始化时,并不要求初始化其全部接口, 5 | // 只会初始化使用到的接口时(如引用接口中定义的常量),才会初始化. 6 | } 7 | -------------------------------------------------------------------------------- /java-basic/jvm/src/main/java/cn/lastwhisper/jvm/memorystruct/ByteCodeSample.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.jvm.memorystruct; 2 | 3 | /** 4 | * 虚拟机栈中的局部变量表和操作数栈 5 | * @author lastwhisper 6 | */ 7 | public class ByteCodeSample { 8 | public static int add(int a, int b) { 9 | int c = 0; 10 | c = a + b; 11 | return c; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /java-basic/jvm/src/main/java/cn/lastwhisper/jvm/memorystruct/Increment.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/memorystruct/Increment.class -------------------------------------------------------------------------------- /java-basic/jvm/src/main/java/cn/lastwhisper/jvm/memorystruct/Increment.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.jvm.memorystruct; 2 | 3 | /** 4 | * 栈帧中i++引发的问题 5 | * @author lastwhisper 6 | * @date 2019/10/25 7 | */ 8 | public class Increment { 9 | public int increment() { 10 | int i = 0; 11 | i = i++; 12 | return i; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /java-basic/jvm/src/main/java/cn/lastwhisper/jvm/memorystruct/TestStr2.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/memorystruct/TestStr2.class -------------------------------------------------------------------------------- /java-basic/jvm/src/main/java/cn/lastwhisper/jvm/memorystruct/TestStr2.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.jvm.memorystruct; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class TestStr2 { 7 | /** 8 | * 共产生几个String对象?5个 9 | */ 10 | public static void main(String[] args) { 11 | String s = "a"; 12 | s = s + "b" + "c"; 13 | s = s + "b" + "c" + "d"; 14 | System.out.println(s); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /java-basic/jvm/src/main/java/cn/lastwhisper/jvm/ms/User.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.jvm.ms; 2 | 3 | /** 4 | * @author kaisui 5 | * @description 6 | * @date 2023/2/22 7 | */ 8 | public class User { 9 | } 10 | -------------------------------------------------------------------------------- /java-basic/jvm/src/main/java/cn/lastwhisper/jvm/tmp2/command/jstack/AllStackTrace.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/java-basic/jvm/src/main/java/cn/lastwhisper/jvm/tmp2/command/jstack/AllStackTrace.java -------------------------------------------------------------------------------- /java-basic/jvm/src/main/java/java/lang/String.java: -------------------------------------------------------------------------------- 1 | package java.lang; 2 | 3 | /** 4 | * @author cunchang 5 | * @date 2021/9/2 12:21 上午 6 | */ 7 | //public class String { 8 | // // 9 | // static { 10 | // System.out.println("我是自定义的String类的静态代码块"); 11 | // } 12 | // 13 | // //错误: 在类 java.lang.String 中找不到 main 方法 14 | // public static void main(String[] args) { 15 | // System.out.println("hello,String"); 16 | // } 17 | //} 18 | -------------------------------------------------------------------------------- /java-basic/learn-source-jdk8/READMD.md: -------------------------------------------------------------------------------- 1 | # jdk1.8.0_241环境下 2 | 3 | 4 | -------------------------------------------------------------------------------- /java-basic/learn-source-jdk8/src/main/java/cn/lastwhisper/learn8/lang/thread/ThreadTest.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.learn8.lang.thread; 2 | 3 | /** 4 | * Thread 5 | * @author lastwhisper 6 | * @date 2020/4/18 7 | */ 8 | public class ThreadTest { 9 | 10 | 11 | } 12 | -------------------------------------------------------------------------------- /java-basic/learn-source-jdk8/src/main/java/cn/lastwhisper/learn8/util/ObjectsTest.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.learn8.util; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | 5 | /** 6 | * Objects 7 | * @author lastwhisper 8 | * @date 2020/4/12 9 | */ 10 | @Slf4j 11 | public class ObjectsTest { 12 | 13 | 14 | 15 | } 16 | -------------------------------------------------------------------------------- /lesson-code/design/fsm/README.md: -------------------------------------------------------------------------------- 1 | 有限状态机 2 | - switch-case 3 | - driver-table 4 | - state-pattern -------------------------------------------------------------------------------- /lesson-code/design/fsm/src/main/java/cn/cunchang/State.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang; 2 | 3 | public enum State { 4 | SMALL(0), 5 | SUPER(1), 6 | FIRE(2), 7 | CAPE(3); 8 | private int value; 9 | 10 | private State(int value) { 11 | this.value = value; 12 | } 13 | 14 | public int getValue() { 15 | return this.value; 16 | } 17 | } -------------------------------------------------------------------------------- /lesson-code/design/fsm/src/main/java/cn/cunchang/state/v1/IMario.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.state.v1; 2 | 3 | public interface IMario { //所有状态类的接口 4 | State getName(); 5 | 6 | //以下是定义的事件 7 | void obtainMushRoom(); 8 | 9 | void obtainCape(); 10 | 11 | void obtainFireFlower(); 12 | 13 | void meetMonster(); 14 | } -------------------------------------------------------------------------------- /lesson-code/design/fsm/src/main/java/cn/cunchang/state/v1/State.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.state.v1; 2 | 3 | public enum State { 4 | SMALL(0), 5 | SUPER(1), 6 | CAPE(2), 7 | FIRE(3), 8 | ; 9 | private int value; 10 | 11 | private State(int value) { 12 | this.value = value; 13 | } 14 | 15 | public int getValue() { 16 | return this.value; 17 | } 18 | } -------------------------------------------------------------------------------- /lesson-code/design/fsm/src/main/java/cn/cunchang/state/v2/IMario.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.state.v2; 2 | 3 | public interface IMario { //所有状态类的接口 4 | State getName(); 5 | 6 | //以下是定义的事件 7 | void obtainMushRoom(MarioStateMachine stateMachine); 8 | 9 | void obtainCape(MarioStateMachine stateMachine); 10 | 11 | void obtainFireFlower(MarioStateMachine stateMachine); 12 | 13 | void meetMonster(MarioStateMachine stateMachine); 14 | } -------------------------------------------------------------------------------- /lesson-code/design/fsm/src/main/java/cn/cunchang/state/v2/State.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.state.v2; 2 | 3 | public enum State { 4 | SMALL(0), 5 | SUPER(1), 6 | CAPE(2), 7 | FIRE(3), 8 | ; 9 | private int value; 10 | 11 | private State(int value) { 12 | this.value = value; 13 | } 14 | 15 | public int getValue() { 16 | return this.value; 17 | } 18 | } -------------------------------------------------------------------------------- /lesson-code/design/fsm/src/main/java/cn/cunchang/switchcase/State.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.switchcase; 2 | 3 | public enum State { 4 | SMALL(0), 5 | SUPER(1), 6 | CAPE(2), 7 | FIRE(3), 8 | ; 9 | private int value; 10 | 11 | private State(int value) { 12 | this.value = value; 13 | } 14 | 15 | public int getValue() { 16 | return this.value; 17 | } 18 | } -------------------------------------------------------------------------------- /lesson-code/design/fsm/src/main/java/cn/cunchang/table/Event.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.table; 2 | 3 | public enum Event { 4 | GOT_MUSHROOM(0), 5 | GOT_CAPE(1), 6 | GOT_FIRE(2), 7 | MET_MONSTER(3); 8 | private int value; 9 | 10 | private Event(int value) { 11 | this.value = value; 12 | } 13 | 14 | public int getValue() { 15 | return this.value; 16 | } 17 | } -------------------------------------------------------------------------------- /lesson-code/design/fsm/src/main/java/cn/cunchang/table/State.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.table; 2 | 3 | public enum State { 4 | SMALL(0), 5 | SUPER(1), 6 | CAPE(2), 7 | FIRE(3), 8 | 9 | ; 10 | private int value; 11 | 12 | private State(int value) { 13 | this.value = value; 14 | } 15 | 16 | public int getValue() { 17 | return this.value; 18 | } 19 | } -------------------------------------------------------------------------------- /log/jcl/src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | # 指定 RootLogger 顶级父元素默认配置信息 2 | # 指定日志级别=trace,使用的 apeender 为=console 3 | log4j.rootLogger = trace,console 4 | 5 | # 指定控制台日志输出的 appender 6 | log4j.appender.console = org.apache.log4j.ConsoleAppender 7 | # 指定消息格式 layout 8 | log4j.appender.console.layout = org.apache.log4j.PatternLayout 9 | # 指定消息格式的内容 10 | log4j.appender.console.layout.conversionPattern = [%-10p]%r %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n 11 | 12 | -------------------------------------------------------------------------------- /log/log4j/src/main/resources/log4j_组件和配置文件.properties: -------------------------------------------------------------------------------- 1 | # 指定 RootLogger 顶级父元素默认配置信息 2 | # 指定日志级别=trace,使用的 apeender 为=console 3 | log4j.rootLogger = trace,console 4 | 5 | # 指定控制台日志输出的 appender 6 | log4j.appender.console = org.apache.log4j.ConsoleAppender 7 | # 指定消息格式 layout 8 | log4j.appender.console.layout = org.apache.log4j.SimpleLayout 9 | 10 | -------------------------------------------------------------------------------- /log/log4j2/src/main/resources/AsyncLogger全局/log4j2.component.properties: -------------------------------------------------------------------------------- 1 | # 全局异步 2 | Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -------------------------------------------------------------------------------- /log/slf4j/src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | # 指定 RootLogger 顶级父元素默认配置信息 2 | # 指定日志级别=trace,使用的 apeender 为=console 3 | log4j.rootLogger = trace,console 4 | 5 | # 指定控制台日志输出的 appender 6 | log4j.appender.console = org.apache.log4j.ConsoleAppender 7 | # 指定消息格式 layout 8 | log4j.appender.console.layout = org.apache.log4j.PatternLayout 9 | # 指定消息格式的内容 10 | log4j.appender.console.layout.conversionPattern = [%-10p]%r %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n 11 | -------------------------------------------------------------------------------- /log/springboot-log/src/main/java/cn/cunchang/SpringbootLogApplication.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SpringbootLogApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SpringbootLogApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /log/日志技术 (上).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/log/日志技术 (上).pdf -------------------------------------------------------------------------------- /log/日志技术 (下).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/log/日志技术 (下).pdf -------------------------------------------------------------------------------- /mvc/README.MD: -------------------------------------------------------------------------------- 1 | mvc学习 2 | 3 | # 1.servlet 4 | servlet3.0 5 | 6 | 7 | 8 | # 2.springmvc 9 | 10 | springmvc项目依赖tomcat, 11 | 并且起始url:http://localhost:8080/springmvc/ 12 | 13 | 14 | -------------------------------------------------------------------------------- /mvc/servlet/.settings/org.eclipse.core.resources.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | encoding//WebContent/note.txt=GBK 3 | -------------------------------------------------------------------------------- /mvc/servlet/.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled 3 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 4 | org.eclipse.jdt.core.compiler.compliance=1.8 5 | org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 6 | org.eclipse.jdt.core.compiler.problem.enumIdentifier=error 7 | org.eclipse.jdt.core.compiler.source=1.8 8 | -------------------------------------------------------------------------------- /mvc/servlet/.settings/org.eclipse.wst.common.project.facet.core.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /mvc/servlet/.settings/org.eclipse.wst.jsdt.ui.superType.container: -------------------------------------------------------------------------------- 1 | org.eclipse.wst.jsdt.launching.baseBrowserLibrary -------------------------------------------------------------------------------- /mvc/servlet/.settings/org.eclipse.wst.jsdt.ui.superType.name: -------------------------------------------------------------------------------- 1 | Window -------------------------------------------------------------------------------- /mvc/servlet/WebContent/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Class-Path: 3 | 4 | -------------------------------------------------------------------------------- /mvc/servlet/WebContent/index.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=UTF-8" 2 | pageEncoding="UTF-8"%> 3 | 4 | 5 | 6 | 7 | Insert title here 8 | 9 | 10 | helloServlet 11 | 12 | -------------------------------------------------------------------------------- /mvc/servlet/WebContent/note.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/WebContent/note.txt -------------------------------------------------------------------------------- /mvc/servlet/build/classes/META-INF/services/javax.servlet.ServletContainerInitializer: -------------------------------------------------------------------------------- 1 | cn.lastwhisper.servlet.MyServletContainerInitializer -------------------------------------------------------------------------------- /mvc/servlet/build/classes/cn/lastwhisper/service/AbstractHelloService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/build/classes/cn/lastwhisper/service/AbstractHelloService.class -------------------------------------------------------------------------------- /mvc/servlet/build/classes/cn/lastwhisper/service/HelloService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/build/classes/cn/lastwhisper/service/HelloService.class -------------------------------------------------------------------------------- /mvc/servlet/build/classes/cn/lastwhisper/service/HelloServiceExt.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/build/classes/cn/lastwhisper/service/HelloServiceExt.class -------------------------------------------------------------------------------- /mvc/servlet/build/classes/cn/lastwhisper/service/HelloServiceImpl.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/build/classes/cn/lastwhisper/service/HelloServiceImpl.class -------------------------------------------------------------------------------- /mvc/servlet/build/classes/cn/lastwhisper/servlet/HelloServlet.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/build/classes/cn/lastwhisper/servlet/HelloServlet.class -------------------------------------------------------------------------------- /mvc/servlet/build/classes/cn/lastwhisper/servlet/MyServletContainerInitializer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/build/classes/cn/lastwhisper/servlet/MyServletContainerInitializer.class -------------------------------------------------------------------------------- /mvc/servlet/build/classes/cn/lastwhisper/servlet/UserFilter.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/build/classes/cn/lastwhisper/servlet/UserFilter.class -------------------------------------------------------------------------------- /mvc/servlet/build/classes/cn/lastwhisper/servlet/UserListener.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/build/classes/cn/lastwhisper/servlet/UserListener.class -------------------------------------------------------------------------------- /mvc/servlet/build/classes/cn/lastwhisper/servlet/UserServlet.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/servlet/build/classes/cn/lastwhisper/servlet/UserServlet.class -------------------------------------------------------------------------------- /mvc/servlet/src/META-INF/services/javax.servlet.ServletContainerInitializer: -------------------------------------------------------------------------------- 1 | cn.lastwhisper.servlet.MyServletContainerInitializer -------------------------------------------------------------------------------- /mvc/servlet/src/cn/lastwhisper/service/AbstractHelloService.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.service; 2 | 3 | public abstract class AbstractHelloService implements HelloService { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /mvc/servlet/src/cn/lastwhisper/service/HelloService.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.service; 2 | 3 | public interface HelloService { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /mvc/servlet/src/cn/lastwhisper/service/HelloServiceExt.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.service; 2 | 3 | public interface HelloServiceExt extends HelloService { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /mvc/servlet/src/cn/lastwhisper/service/HelloServiceImpl.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.service; 2 | 3 | public class HelloServiceImpl implements HelloService { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /mvc/springmvc-annotation/src/main/java/cn/lastwhisper/MyWebAppInitializer.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/springmvc-annotation/src/main/java/cn/lastwhisper/MyWebAppInitializer.java -------------------------------------------------------------------------------- /mvc/springmvc-annotation/src/main/java/cn/lastwhisper/config/AppConfig.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/springmvc-annotation/src/main/java/cn/lastwhisper/config/AppConfig.java -------------------------------------------------------------------------------- /mvc/springmvc-annotation/src/main/java/cn/lastwhisper/config/RootConfig.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/springmvc-annotation/src/main/java/cn/lastwhisper/config/RootConfig.java -------------------------------------------------------------------------------- /mvc/springmvc-annotation/src/main/java/cn/lastwhisper/controller/AsyncController.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/springmvc-annotation/src/main/java/cn/lastwhisper/controller/AsyncController.java -------------------------------------------------------------------------------- /mvc/springmvc-annotation/src/main/java/cn/lastwhisper/controller/MyFirstInterceptor.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/springmvc-annotation/src/main/java/cn/lastwhisper/controller/MyFirstInterceptor.java -------------------------------------------------------------------------------- /mvc/springmvc-annotation/src/main/java/cn/lastwhisper/service/HelloService.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.service; 2 | 3 | import org.springframework.stereotype.Service; 4 | 5 | @Service 6 | public class HelloService { 7 | 8 | public String sayHello(String name){ 9 | 10 | return "Hello "+name; 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /mvc/springmvc-annotation/src/main/webapp/upload_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/mvc/springmvc-annotation/src/main/webapp/upload_3.jpg -------------------------------------------------------------------------------- /mvc/springmvc/src/main/webapp/WEB-INF/pages/success.jsp: -------------------------------------------------------------------------------- 1 | <%-- 2 | Created by IntelliJ IDEA. 3 | User: Administrator 4 | Date: 2019/9/17 5 | Time: 18:12 6 | To change this template use File | Settings | File Templates. 7 | --%> 8 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> 9 | 10 | 11 | 成功页面 12 | 13 | 14 | 执行成功 15 | 16 | 17 | -------------------------------------------------------------------------------- /mvc/springmvc/src/main/webapp/WEB-INF/pages/success2.jsp: -------------------------------------------------------------------------------- 1 | <%-- 2 | Created by IntelliJ IDEA. 3 | User: Administrator 4 | Date: 2019/9/17 5 | Time: 18:12 6 | To change this template use File | Settings | File Templates. 7 | --%> 8 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> 9 | 10 | 11 | 成功页面 12 | 13 | 14 | 由Controller接口的实现类执行的结果 15 | 16 | 17 | -------------------------------------------------------------------------------- /mvc/springmvc/src/main/webapp/WEB-INF/pages/success3.jsp: -------------------------------------------------------------------------------- 1 | <%-- 2 | Created by IntelliJ IDEA. 3 | User: Administrator 4 | Date: 2019/9/17 5 | Time: 18:12 6 | To change this template use File | Settings | File Templates. 7 | --%> 8 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> 9 | 10 | 11 | 成功页面 12 | 13 | 14 | 由HttpRequestHandler接口的实现类执行的结果 15 | 16 | 17 | -------------------------------------------------------------------------------- /notes/leetcode/LeetCode 第 39 题:“组合总和”题解配图.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/leetcode/LeetCode 第 39 题:“组合总和”题解配图.pptx -------------------------------------------------------------------------------- /notes/leetcode/Leetcode.mmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/leetcode/Leetcode.mmap -------------------------------------------------------------------------------- /notes/leetcode/leetcode-39.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/leetcode/leetcode-39.vsdx -------------------------------------------------------------------------------- /notes/leetcode/leetcode-46.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/leetcode/leetcode-46.vsdx -------------------------------------------------------------------------------- /notes/leetcode/leetcode-47.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/leetcode/leetcode-47.vsdx -------------------------------------------------------------------------------- /notes/leetcode/leetcode-56.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/leetcode/leetcode-56.vsdx -------------------------------------------------------------------------------- /notes/leetcode/leetcode-77.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/leetcode/leetcode-77.vsdx -------------------------------------------------------------------------------- /notes/leetcode/leetcode-92.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/leetcode/leetcode-92.vsdx -------------------------------------------------------------------------------- /notes/orm/jpa/SpringDataJPA第一天讲义.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/jpa/SpringDataJPA第一天讲义.doc -------------------------------------------------------------------------------- /notes/orm/jpa/SpringDataJPA第三天讲义.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/jpa/SpringDataJPA第三天讲义.doc -------------------------------------------------------------------------------- /notes/orm/jpa/SpringDataJPA第二天讲义.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/jpa/SpringDataJPA第二天讲义.doc -------------------------------------------------------------------------------- /notes/orm/mybatis/Mybatis第一天讲义.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/mybatis/Mybatis第一天讲义.pdf -------------------------------------------------------------------------------- /notes/orm/mybatis/Mybatis第三天讲义.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/mybatis/Mybatis第三天讲义.pdf -------------------------------------------------------------------------------- /notes/orm/mybatis/Mybatis第二天讲义.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/mybatis/Mybatis第二天讲义.pdf -------------------------------------------------------------------------------- /notes/orm/mybatis/Mybatis第四天讲义.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/mybatis/Mybatis第四天讲义.pdf -------------------------------------------------------------------------------- /notes/orm/mybatis/Noname1.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/mybatis/Noname1.txt -------------------------------------------------------------------------------- /notes/orm/mybatis/Noname2.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/mybatis/Noname2.txt -------------------------------------------------------------------------------- /notes/orm/mybatis/Noname3.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/mybatis/Noname3.txt -------------------------------------------------------------------------------- /notes/orm/mybatis/Noname4.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/notes/orm/mybatis/Noname4.txt -------------------------------------------------------------------------------- /orm/jdbc/src/main/java/cn/lastwhisper/jdbc/util/Callback.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.jdbc.util; 2 | 3 | 4 | import java.sql.Connection; 5 | import java.sql.PreparedStatement; 6 | import java.sql.SQLException; 7 | 8 | /** 9 | * @author lastwhisper 10 | */ 11 | @FunctionalInterface 12 | public interface Callback { 13 | /** 14 | * 模板方法的回调方法 15 | */ 16 | void execute(PreparedStatement pstm) throws SQLException; 17 | } -------------------------------------------------------------------------------- /orm/jpa/jpa-basic/src/main/java/cn/lastwhisper/jpa/utils/Callback.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.jpa.utils; 2 | 3 | import javax.persistence.EntityManager; 4 | 5 | /** 6 | * @author lastwhisper 7 | */ 8 | @FunctionalInterface 9 | public interface Callback { 10 | /** 11 | * 模板方法的回调方法 12 | * @param em EntityManager操作实体类的对象 13 | * @return void 14 | */ 15 | void execute(EntityManager em); 16 | } -------------------------------------------------------------------------------- /orm/jpa/jpa-manytomany/.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/orm/jpa/jpa-manytomany/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /orm/jpa/jpa-manytomany/.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip 2 | -------------------------------------------------------------------------------- /orm/jpa/jpa-manytomany/readme.md: -------------------------------------------------------------------------------- 1 | spring-data-jpa 的多对多关联案例 -------------------------------------------------------------------------------- /orm/jpa/jpa-onetomany/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.application.name=spring-data-jpa 2 | spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 3 | spring.datasource.url=jdbc:mysql://127.0.0.1:3306/jpa?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false&serverTimezone=UTC 4 | spring.datasource.username=root 5 | spring.datasource.password=root 6 | spring.jpa.show-sql=true -------------------------------------------------------------------------------- /orm/jpa/springdatajpa/.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lastwhispers/code/65981a9562fa01dd1a317feee68b60076a0f65ba/orm/jpa/springdatajpa/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /orm/jpa/springdatajpa/.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip 2 | -------------------------------------------------------------------------------- /orm/jpa/springdatajpa/readme.md: -------------------------------------------------------------------------------- 1 | spring-data-jpa 基础 -------------------------------------------------------------------------------- /orm/jpa/springdatajpa/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.application.name = spring-data-jpa 2 | spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 3 | spring.datasource.url=jdbc:mysql://127.0.0.1:3306/jpa?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false&serverTimezone=UTC 4 | spring.datasource.username=root 5 | spring.datasource.password=root 6 | spring.jpa.show-sql=true -------------------------------------------------------------------------------- /orm/mongodb/src/main/java/cn/cunchang/Application.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Application { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(Application.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /orm/mongodb/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | #数据源配置 3 | data: 4 | mongodb: 5 | # 主机地址 6 | host: 127.0.0.1 7 | # 数据库 8 | database: articledb 9 | # 默认端口是27017 10 | port: 27017 11 | # 也可以使用uri连接 12 | # bobo:123456 账号密码 13 | # uri: mongodb://bobo:123456@180.76.159.126:27017,180.76.159.126:27018,180.76.159.126:27019/articledb?connect=replicaSet&slaveOk=true&replicaSet=myrs -------------------------------------------------------------------------------- /orm/mongodb/src/test/java/cn/cunchang/ApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /orm/mybatis/README.MD: -------------------------------------------------------------------------------- 1 | # 一、mybatis入门与基础使用 2 | - mybatis-basic 3 | - mybatis-crud 4 | - mybatis-dynamicsql 5 | # 二、mybatis多表 6 | - mybatis-datasource-tx 7 | - mybatis-onetoone 8 | - mybatis-onetomany 9 | - mybatis-manytomany 10 | # 三、mybatis缓存与注解 11 | - mybatis-lazy 12 | - mybatis-cache 13 | - mybatis-annotation-crud 14 | - mybatis-annotation-manytable 15 | # 四、mybatis拦截器 16 | -------------------------------------------------------------------------------- /orm/mybatis/mybatis-annotation-crud/readme.md: -------------------------------------------------------------------------------- 1 | mybatis注解实现crud 2 | -------------------------------------------------------------------------------- /orm/mybatis/mybatis-annotation-crud/src/main/java/cn/lastwhisper/mybatis/annotation/crud/utils/Callback.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.mybatis.annotation.crud.utils; 2 | 3 | import org.apache.ibatis.session.SqlSession; 4 | 5 | /** 6 | * @author Administrator 7 | */ 8 | @FunctionalInterface 9 | public interface Callback { 10 | /** 11 | * 执行者 12 | */ 13 | void execute(SqlSession sqlSession); 14 | } 15 | -------------------------------------------------------------------------------- /orm/mybatis/mybatis-annotation-crud/src/main/resources/jdbcConfig.properties: -------------------------------------------------------------------------------- 1 | jdbc.driver=com.mysql.jdbc.Driver 2 | jdbc.url=jdbc:mysql://localhost:3306/orm 3 | jdbc.username=root 4 | jdbc.password=root -------------------------------------------------------------------------------- /orm/mybatis/mybatis-annotation-manytable/readme.md: -------------------------------------------------------------------------------- 1 | mybatis注解实现一对一(多对一)、一对多、二级缓存 2 | -------------------------------------------------------------------------------- /orm/mybatis/mybatis-annotation-manytable/src/main/java/cn/lastwhisper/mybatis/annotation/manytable/utils/Callback.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.mybatis.annotation.manytable.utils; 2 | 3 | import org.apache.ibatis.session.SqlSession; 4 | 5 | /** 6 | * @author Administrator 7 | */ 8 | @FunctionalInterface 9 | public interface Callback { 10 | /** 11 | * 执行者 12 | */ 13 | void execute(SqlSession sqlSession); 14 | } 15 | -------------------------------------------------------------------------------- /orm/mybatis/mybatis-annotation-manytable/src/main/resources/jdbcConfig.properties: -------------------------------------------------------------------------------- 1 | jdbc.driver=com.mysql.jdbc.Driver 2 | jdbc.url=jdbc:mysql://localhost:3306/orm 3 | jdbc.username=root 4 | jdbc.password=root -------------------------------------------------------------------------------- /orm/mybatis/mybatis-basic/readme.md: -------------------------------------------------------------------------------- 1 | mybatis xml配置与注解配置基本流程 -------------------------------------------------------------------------------- /orm/mybatis/mybatis-cache/readme.md: -------------------------------------------------------------------------------- 1 | mybatis一级缓存和二级缓存 2 | - 一级缓存是SqlSession级别的 3 | - 二级缓存是Mapper级别的,多个 SqlSession 可以共用二级缓存 4 | 5 | 当我们在使用二级缓存时,所缓存的类一定要实现 java.io.Serializable 接口,这种就可以使用序列化 6 | 方式来保存对象。 7 | 8 | -------------------------------------------------------------------------------- /orm/mybatis/mybatis-lazy/readme.md: -------------------------------------------------------------------------------- 1 | mybatis延迟加载 2 | - association、collection可以使用延迟加载 3 | 4 | 将一对多案例改为延迟加载 5 | 6 | 延迟加载需要在SqlMapConfig.xml中配置 -------------------------------------------------------------------------------- /orm/mybatis/mybatis-manytomany/readme.md: -------------------------------------------------------------------------------- 1 | mybatis多对多 2 | - 多对多使用resultMap的collection 3 | 拆分为双向的一对多 4 | 5 | 6 | 需求: 7 | - 实现查询所有角色并且加载它所分配的用户信息。 8 | 9 | 分析: 10 | - 查询角色我们需要用到Role表,但角色分配的用户的信息我们并不能直接找到用户信息,而是要通过中 11 | 间表(USER_ROLE 表)才能关联到用户信息。 -------------------------------------------------------------------------------- /orm/mybatis/mybatis-manytomany/src/main/java/cn/lastwhisper/mybatis/manytomany/dao/RoleMapper.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.mybatis.manytomany.dao; 2 | 3 | 4 | import cn.lastwhisper.mybatis.manytomany.domain.Role; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * @author Administrator 10 | */ 11 | public interface RoleMapper { 12 | /** 13 | * 查询所有角色 14 | * @return 15 | */ 16 | List findAll(); 17 | } 18 | -------------------------------------------------------------------------------- /orm/mybatis/mybatis-manytomany/src/main/java/cn/lastwhisper/mybatis/manytomany/dao/UserMapper.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.mybatis.manytomany.dao; 2 | 3 | 4 | import cn.lastwhisper.mybatis.manytomany.domain.User; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * @author Administrator 10 | */ 11 | public interface UserMapper { 12 | /** 13 | * 查询所有角色 14 | * @return 15 | */ 16 | List findAll(); 17 | } 18 | -------------------------------------------------------------------------------- /orm/mybatis/mybatis-onetomany/readme.md: -------------------------------------------------------------------------------- 1 | mybatis一对多 2 | - resultMap的collection 3 | 4 | 需求: 5 | - 查询所有用户信息及用户关联的账户信息。 6 | 7 | 分析: 8 | - 用户信息和他的账户信息为一对多关系,并且查询过程中如果用户没有账户信息,此时也要将用户信息 9 | 查询出来,我们想到了左外连接查询比较合适。 -------------------------------------------------------------------------------- /orm/mybatis/mybatis-onetomany/src/main/java/cn/lastwhisper/mybatis/onetomany/dao/UserMapper.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.mybatis.onetomany.dao; 2 | 3 | 4 | import cn.lastwhisper.mybatis.onetomany.domain.User; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * @author Administrator 10 | */ 11 | public interface UserMapper { 12 | /** 13 | * 查询所有用户,同时获取出每个用户下的所有账户信息 14 | * @return 15 | */ 16 | List findAll(); 17 | } 18 | -------------------------------------------------------------------------------- /orm/mybatis/mybatis-onetoone/readme.md: -------------------------------------------------------------------------------- 1 | mybatis实现一对一(多对一) 2 | - 继承 3 | - 定义专门的 po 类作为输出类型,其中定义了 sql 查询结果集所有的字段 4 | - 关联 5 | - resultMap的association 6 | 7 | 需求: 8 | - 查询所有账户信息,关联查询下单用户信息。 9 | 10 | 注意: 11 | - 因为一个账户信息只能供某个用户使用,所以从查询账户信息出发关联查询用户信息为一对一查询。 -------------------------------------------------------------------------------- /spring-annotation/aop-@Aspect/src/main/java/cn/lastwhisper/aop/MathCalculator.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.aop; 2 | 3 | /** 4 | * 处理业务类 5 | * @author lastwhisper 6 | */ 7 | public class MathCalculator { 8 | // 做除法 9 | public int div(int i, int j) { 10 | System.out.println("MathCalculator...div..."); 11 | return i / j; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /spring-annotation/aop-interface/README.md: -------------------------------------------------------------------------------- 1 | 1111 2 | -------------------------------------------------------------------------------- /spring-annotation/aop-schema-based/README.md: -------------------------------------------------------------------------------- 1 | 参考 2 | https://www.cnblogs.com/HigginCui/p/6323131.html 3 | 4 | -------------------------------------------------------------------------------- /spring-annotation/aop-schema-based/src/main/java/cn/cunchang/domain/BenzCar.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.domain; 2 | 3 | public class BenzCar implements Car{ 4 | 5 | @Override 6 | public void driving() { 7 | System.out.println("奔驰车在行驶..."); 8 | } 9 | 10 | } -------------------------------------------------------------------------------- /spring-annotation/aop-schema-based/src/main/java/cn/cunchang/domain/BmwCar.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.domain; 2 | 3 | public class BmwCar implements Car{ 4 | 5 | @Override 6 | public void driving(){ 7 | System.out.println("五菱宏光在行驶..."); 8 | } 9 | 10 | } -------------------------------------------------------------------------------- /spring-annotation/aop-schema-based/src/main/java/cn/cunchang/domain/Car.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang.domain; 2 | 3 | /** 4 | * @author cunchang 5 | * @date 2021/8/29 11:21 上午 6 | */ 7 | public interface Car { 8 | 9 | public void driving(); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /spring-annotation/autowired/src/main/java/cn/lastwhisper/autowired/bean/Car.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.autowired.bean; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | /** 6 | * @author lastwhisper 7 | */ 8 | @Component 9 | public class Car { 10 | 11 | } 12 | -------------------------------------------------------------------------------- /spring-annotation/autowired/src/main/java/cn/lastwhisper/autowired/controller/BookController.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.autowired.controller; 2 | 3 | import cn.lastwhisper.autowired.service.BookService; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.stereotype.Controller; 6 | 7 | @Controller 8 | public class BookController { 9 | @Autowired 10 | private BookService bookService; 11 | } 12 | -------------------------------------------------------------------------------- /spring-annotation/componentregister/src/main/java/cn/lastwhisper/componentregister/bean/Blue.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.componentregister.bean; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class Blue { 7 | } 8 | 9 | -------------------------------------------------------------------------------- /spring-annotation/componentregister/src/main/java/cn/lastwhisper/componentregister/bean/Color.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.componentregister.bean; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class Color { 7 | } 8 | -------------------------------------------------------------------------------- /spring-annotation/componentregister/src/main/java/cn/lastwhisper/componentregister/bean/RainBow.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.componentregister.bean; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class RainBow { 7 | } 8 | -------------------------------------------------------------------------------- /spring-annotation/componentregister/src/main/java/cn/lastwhisper/componentregister/bean/Red.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.componentregister.bean; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class Red { 7 | } 8 | -------------------------------------------------------------------------------- /spring-annotation/componentregister/src/main/java/cn/lastwhisper/componentregister/bean/Yellow.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.componentregister.bean; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class Yellow { 7 | } 8 | -------------------------------------------------------------------------------- /spring-annotation/componentregister/src/main/java/cn/lastwhisper/componentregister/dao/BookDao.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.componentregister.dao; 2 | 3 | import org.springframework.stereotype.Repository; 4 | 5 | @Repository 6 | public class BookDao { 7 | } 8 | -------------------------------------------------------------------------------- /spring-annotation/componentregister/src/main/java/cn/lastwhisper/componentregister/service/BookService.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.componentregister.service; 2 | 3 | import org.springframework.stereotype.Service; 4 | 5 | @Service 6 | public class BookService { 7 | } 8 | -------------------------------------------------------------------------------- /spring-annotation/ext/README.md: -------------------------------------------------------------------------------- 1 | 1. event 2 | 2. BeanDefinitionRegistryPostProcessor 3 | 3. BeanFactoryPostProcessor -------------------------------------------------------------------------------- /spring-annotation/ext/src/main/java/cn/lastwhisper/spring/ext/bean/Blue.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.spring.ext.bean; 2 | 3 | public class Blue { 4 | 5 | private String name; 6 | 7 | public Blue() { 8 | System.out.println("blue...constructor"); 9 | } 10 | 11 | public String getName() { 12 | return name; 13 | } 14 | 15 | public void setName(String name) { 16 | this.name = name; 17 | } 18 | } -------------------------------------------------------------------------------- /spring-annotation/profile/src/main/java/cn/lastwhisper/profile/bean/Yellow.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.profile.bean; 2 | 3 | /** 4 | * @author lastwhisper 5 | */ 6 | public class Yellow { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /spring-annotation/profile/src/main/resources/db.properties: -------------------------------------------------------------------------------- 1 | db.user=root 2 | db.password=root 3 | db.driverClass=com.mysql.jdbc.Driver 4 | -------------------------------------------------------------------------------- /spring-annotation/propertyvalue/src/main/resources/person.properties: -------------------------------------------------------------------------------- 1 | person.nickname=nike 2 | person.moneyList=100,200,300 -------------------------------------------------------------------------------- /spring-annotation/transaction/README.md: -------------------------------------------------------------------------------- 1 | 注解事务实现原理 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /spring-batch/spring-batch/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.batch.job.enabled=false 2 | -------------------------------------------------------------------------------- /spring-batch/spring-batch/src/main/resources/sample-data.csv: -------------------------------------------------------------------------------- 1 | Jill,Doe 2 | Joe,Doe 3 | Justin,Doe 4 | Jane,Doe 5 | John,Doe 6 | Tom,Doe 7 | Cat,Doe 8 | Zhang,San 9 | Li,Si 10 | Li,Doe 11 | Zhang,Doe -------------------------------------------------------------------------------- /spring-batch/spring-batch/src/main/resources/schema-all.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE people IF EXISTS; 2 | 3 | CREATE TABLE people 4 | ( 5 | person_id BIGINT IDENTITY NOT NULL PRIMARY KEY, 6 | first_name VARCHAR(20), 7 | last_name VARCHAR(20) 8 | ); -------------------------------------------------------------------------------- /spring-batch/spring-batch/src/test/java/cn/cunchang/SpringBatchApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.cunchang; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class SpringBatchApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /springboot-aop/cache/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /springboot-aop/execution/src/main/java/cn/lastwhisper/anno/AdminOnly.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.anno; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * AnnoAspectConfig 注解匹配时使用 10 | */ 11 | @Retention(RetentionPolicy.RUNTIME) 12 | @Target(ElementType.METHOD) 13 | public @interface AdminOnly { 14 | } 15 | -------------------------------------------------------------------------------- /springboot-aop/execution/src/main/java/cn/lastwhisper/anno/NeedSecured.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.anno; 2 | 3 | import java.lang.annotation.*; 4 | 5 | /** 6 | * Created by cat on 2016-12-04. 7 | */ 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(ElementType.TYPE) 10 | @Inherited 11 | public @interface NeedSecured { 12 | } 13 | -------------------------------------------------------------------------------- /springboot-aop/execution/src/main/java/cn/lastwhisper/anno/NeedSecuredClass.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.anno; 2 | 3 | import java.lang.annotation.*; 4 | 5 | /** 6 | * Created by cat on 2016-12-04. 7 | */ 8 | @Retention(RetentionPolicy.CLASS) 9 | @Target(ElementType.TYPE) 10 | @Inherited 11 | public @interface NeedSecuredClass { 12 | } 13 | -------------------------------------------------------------------------------- /springboot-aop/execution/src/main/java/cn/lastwhisper/anno/NeedSecuredSource.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.anno; 2 | 3 | import java.lang.annotation.*; 4 | 5 | /** 6 | * Created by cat on 2017-02-19. 7 | */ 8 | @Retention(RetentionPolicy.SOURCE) 9 | @Target(ElementType.TYPE) 10 | @Inherited 11 | public @interface NeedSecuredSource { 12 | } 13 | -------------------------------------------------------------------------------- /springboot-aop/execution/src/main/java/cn/lastwhisper/bean/Product.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.bean; 2 | 3 | 4 | import cn.lastwhisper.anno.NeedSecured; 5 | 6 | /** 7 | * Created by cat on 2017-02-19. 8 | */ 9 | @NeedSecured 10 | public class Product { 11 | } 12 | -------------------------------------------------------------------------------- /springboot-aop/execution/src/main/java/cn/lastwhisper/log/Loggable.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.log; 2 | 3 | /** 4 | * Created by cat on 2017-02-19. 5 | */ 6 | public interface Loggable { 7 | public void log(); 8 | } 9 | -------------------------------------------------------------------------------- /springboot-aop/execution/src/main/java/cn/lastwhisper/service/sub/SubService.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.service.sub; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | /** 6 | * Created by cat on 2017-02-19. 7 | */ 8 | @Component 9 | public class SubService { 10 | 11 | public void demo(){ 12 | System.out.println("demo for SubService"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /springboot-aop/execution/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /springboot-aop/log/src/main/java/cn/lastwhisper/aop/LogApplication.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.aop; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class LogApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(LogApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /springboot-aop/log/src/main/java/cn/lastwhisper/aop/dao/ProductDao.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.aop.dao; 2 | 3 | import cn.lastwhisper.aop.domain.Product; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface ProductDao extends JpaRepository { 7 | //public Product findById(Long id); 8 | } 9 | -------------------------------------------------------------------------------- /springboot-aop/log/src/main/java/cn/lastwhisper/aop/datalog/ActionDao.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.aop.datalog; 2 | 3 | import cn.lastwhisper.aop.domain.Action; 4 | import org.springframework.data.mongodb.repository.MongoRepository; 5 | 6 | public interface ActionDao extends MongoRepository { 7 | } 8 | -------------------------------------------------------------------------------- /springboot-aop/principle/README.md: -------------------------------------------------------------------------------- 1 | - AOP 底层设计模式 2 | - 动态代理 3 | - 责任链 4 | 5 | 动态代理代码,迁移到proxy 6 | 责任链代码,迁移到design-pattern 7 | 8 | -------------------------------------------------------------------------------- /springboot-aop/security/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /springboot-aop/transaction/src/main/java/cn/lastwhisper/aop/dao/OperationLogDao.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.aop.dao; 2 | 3 | import cn.lastwhisper.aop.domain.OperationLog; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface OperationLogDao extends JpaRepository { 7 | } 8 | -------------------------------------------------------------------------------- /springboot-aop/transaction/src/main/java/cn/lastwhisper/aop/dao/UserDao.java: -------------------------------------------------------------------------------- 1 | package cn.lastwhisper.aop.dao; 2 | 3 | 4 | import cn.lastwhisper.aop.domain.User; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | 7 | public interface UserDao extends JpaRepository { 8 | } 9 | -------------------------------------------------------------------------------- /springboot-aop/transaction/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.datasource.driver-class-name=com.mysql.jdbc.Driver 2 | spring.datasource.url=jdbc:mysql://localhost:3306/spring_transaction?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC 3 | spring.datasource.username=root 4 | spring.datasource.password=root 5 | spring.jpa.hibernate.ddl-auto=update 6 | spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect 7 | -------------------------------------------------------------------------------- /tool/src/main/resources/config.properties: -------------------------------------------------------------------------------- 1 | targetDirs=/Users/cunchang/workspace 2 | deleteDirs=.idea;target;out 3 | deleteFiles=.iml 4 | --------------------------------------------------------------------------------