<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Xiaowo]]></title><description><![CDATA[I Lay My Love On You~]]></description><link>https://blog.youkuaiyun.com/puppylpg</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; puppylpg]]></copyright><item><title><![CDATA[爬取网易buff CSGO饰品数据 - 优化篇]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/103434455</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/103434455</guid><author>puppylpg</author><pubDate>Sat, 07 Dec 2019 12:58:01 +0800</pubDate><description><![CDATA[文章目录思路回顾配置优化RawConfigParser处理配置列表价格取舍价格过滤饰品类别限定内部实现优化：结合价格筛选和饰品类别筛选其他限定？命名The End
继上周末搞了csgo饰品的爬虫之后，最近一周一直在根据社区小伙伴的意见建议进行优化。不得不说，玩家才是最好的产品经理，很多提出来的建议都让人为之一振，这也直接优化了最终的程序效率、实现方式等，同时也增加了一些新的功能。在这里就以优化篇记...]]></description><category></category></item><item><title><![CDATA[linux小记：找到最占磁盘的文件（夹）]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/81256298</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/81256298</guid><author>puppylpg</author><pubDate>Sat, 28 Jul 2018 00:27:02 +0800</pubDate><description><![CDATA[

查看占用情况
最大文件夹top10
结论


最大独立文件夹top10
结论
最大文件top10
结论


附：find命令
格式
按照文件名查找
按照正则表达式匹配文件路径
按照文件类型查找
按照目录深度查找
按照文件时间戳进行搜索
按照文件大小进行搜索
查找条件或与非
参数传递
其他






最近突然发现我的家目录已经用了70%+了，所以想知道到底是什么东西占了我这么多地方。

主要用...]]></description><category></category></item><item><title><![CDATA[google protobuf 生成的Java对象结构]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/80837143</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/80837143</guid><author>puppylpg</author><pubDate>Thu, 28 Jun 2018 01:56:44 +0800</pubDate><description><![CDATA[

介绍
.proto
Java对象中的方法
methods in interface
methods in object
methods in Builder


示例





介绍

介绍日后再补，总之想要了解protobuf的工作原理，需要首先知道编程中的“Builder模式”——由于类属性过多而出现的一种较好的解决方式。没有共有构造函数，设置属性仅能通过Builder的set类方法等等。...]]></description><category></category></item><item><title><![CDATA[Java处理InterruptedException]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/80686956</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/80686956</guid><author>puppylpg</author><pubDate>Thu, 14 Jun 2018 00:04:19 +0800</pubDate><description><![CDATA[机制

在Java中，一个线程是不能终止另一个线程的，除非那个线程自己想退出，或者JVM退出了。

比如：



Thread loop = new Thread(
  new Runnable() {
    @Override
    public void run() {
      while (true) {
      }
    }
  }
);
loop.start();

这个线...]]></description><category></category></item><item><title><![CDATA[Java并发编程：并发任务执行及结果获取]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/80683101</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/80683101</guid><author>puppylpg</author><pubDate>Wed, 13 Jun 2018 17:54:25 +0800</pubDate><description><![CDATA[Executor：任务执行
Executor
ExecutorService
任务生命周期管理
对任务提交方法的拓展




Future：未来对任务结果的获取
CompletionService：及时获取已完成任务的结果





Executor：任务执行

关系：Executor &amp;amp;amp;amp;lt;- ExecutorService =&amp;amp;amp;amp;gt; AbstractExecutorService =&amp;]]></description><category></category></item><item><title><![CDATA[ThreadLocal原理及内存泄露预防]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/80433271</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/80433271</guid><author>puppylpg</author><pubDate>Thu, 24 May 2018 13:38:21 +0800</pubDate><description><![CDATA[前言
原理
为什么key使用弱引用


内存泄露
线程池





参阅：http://www.importnew.com/22039.html



前言

ThreadLocal提供了线程独有的局部变量，可以在整个线程存活的过程中随时取用，极大地方便了一些逻辑的实现。常见的ThreadLocal用法有： 
 - 存储单个线程上下文信息。比如存储id等； 
 - 使变量线程安全。变量既然成为...]]></description><category></category></item><item><title><![CDATA[“树”据结构三：B树]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/80317326</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/80317326</guid><author>puppylpg</author><pubDate>Tue, 15 May 2018 01:35:39 +0800</pubDate><description><![CDATA[

前言
起源
问题
时间消耗
索引加速
B树 vs. 多级索引


定义
数据结构
参考







前言

之所以写“树”据结构这一系列的文章，就是因为有一天突然看到了一句话：心里要有B树……是的，做人心里要有B数，做程序员心里一定要有B树。

之前无论是在学校里学B树，还是自己看B树，总是感觉理解的不够好，事实证明也的确理解的不够到位，否则也不至于达到“看概念懵逼，过一段时间基本等于没看过...]]></description><category></category></item><item><title><![CDATA[“树”据结构二：AVL树]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/80315767</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/80315767</guid><author>puppylpg</author><pubDate>Mon, 14 May 2018 23:01:25 +0800</pubDate><description><![CDATA[

前言
定义
节点高度
平衡因子


算法
数据结构
二叉树的旋转
左旋转
右旋转


失衡类型及其调整
L-L
L-R
R-L
R-R




Rebalance
增
rebalance after add
rotate left
rotate right


删
rebalance after delete




参阅







前言

和二叉搜索树比起来，AVL树（平衡二叉搜索树）才...]]></description><category></category></item><item><title><![CDATA[“树”据结构一：二叉搜索树（Binary Search Tree, BST）]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/80304542</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/80304542</guid><author>puppylpg</author><pubDate>Mon, 14 May 2018 00:27:40 +0800</pubDate><description><![CDATA[

前言
定义
来源
算法
数据结构
查
遍历
增
删
总结









前言

想写两篇关于AVL树和B树的较为详细的介绍，发现需要先介绍二叉搜索树作为先导。

定义

二叉搜索树(Binary Search Thee, BST)，也被称为二叉排序树(Binary Sort Tree, BST)，无论哪种定义，都能表明其特点：有序，能够用于快速搜索。个人更倾向于称其为二叉搜索树。

二叉搜...]]></description><category></category></item><item><title><![CDATA[Java IO的实现]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/80018586</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/80018586</guid><author>puppylpg</author><pubDate>Fri, 20 Apr 2018 14:44:01 +0800</pubDate><description><![CDATA[从一个方法看javaIO：



    public byte[] compress(IWritable value) {
        if (value == null) return null;
        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            Da...]]></description><category></category></item><item><title><![CDATA[DelayQueue实现的Comparable接口]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/78650936</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/78650936</guid><author>puppylpg</author><pubDate>Tue, 28 Nov 2017 02:31:34 +0800</pubDate><description><![CDATA[DelayQueue
Comparable接口和Delayed接口
外话-线程池
外话-静态内部类DelayQueueDelayQueue是JDK对BlockingQueue接口的一种实现类。对于DelayQueue的介绍，可以参考一篇很不错的文章。Comparable接口和Delayed接口DelayQueue队列保存的元素必须实现Delayed接口，而Delayed接口又实现了Comparabl]]></description><category></category></item><item><title><![CDATA[对Java8中distinct()的思考]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/78556730</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/78556730</guid><author>puppylpg</author><pubDate>Thu, 16 Nov 2017 23:59:34 +0800</pubDate><description><![CDATA[list的转map的另一种猜想
使用distinct给list去重
直接使用distinct失败
原因distinct依赖于equals
重写equals的注意事项
引申
结论
list的转map的另一种猜想Java8使用lambda表达式进行函数式编程可以对集合进行非常方便的操作。一个比较常见的操作是将list转换成map，一般使用Collectors的toMap()方法进行转换。一个比较常见的问]]></description><category></category></item><item><title><![CDATA[mock]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/78347849</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/78347849</guid><author>puppylpg</author><pubDate>Wed, 25 Oct 2017 22:45:02 +0800</pubDate><description><![CDATA[mock的由来一开始，没有mock的时候，人们测试的时候只能自己mock。比如需要一个PersonDao类的对象，其中有连接数据库查询数据库当前存储人数的方法getPersonNum()。但是可能因为数据库不存在等问题，其中的操作并不能正确执行，这时候一般：public PerSonDaoMock extends PersonDao{
    @Override
    public int get]]></description><category></category></item><item><title><![CDATA[Spring xml配置文件头解析]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/78291176</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/78291176</guid><author>puppylpg</author><pubDate>Fri, 20 Oct 2017 03:17:42 +0800</pubDate><description><![CDATA[最简洁xml文件头
详解
命名空间
头解析
模式内容Spring的xml配置虽然比较繁琐，不如推荐使用的注解方式简介，但是能读懂xml配置文件还是很重要的，尤其是对于一些老系统的维护，几乎不可避免要面对xml配置文件的问题。现在我们就从默认的xml文件头说起。最简洁xml文件头以下可谓是最简洁的spring文件头的内容，然而看起来依旧一大坨，令人眼花缭乱。其实细细分析，就会觉得东西其实并不多。<?x]]></description><category></category></item><item><title><![CDATA[Java Map初始化的一个错误：new HashMap().put("a", "b");]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/78005796</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/78005796</guid><author>puppylpg</author><pubDate>Sat, 16 Sep 2017 19:34:53 +0800</pubDate><description><![CDATA[今天在使用PowerMock进行代码测试用例编写的时候，需要新建一个map，当时脑一抽，写成了：Map<String, Object> testMap = new HashMap().put("a", "b");然后收到了IDE的友善提醒：Incompatible types.
 Required: java.util.Map<java.lang.String, java.lang.Object>]]></description><category></category></item><item><title><![CDATA[Archlinux安装UEFI Grub]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/77618180</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/77618180</guid><author>puppylpg</author><pubDate>Sun, 27 Aug 2017 03:45:07 +0800</pubDate><description><![CDATA[最近换了电脑，以前的老电脑使用的是旧BIOS架构启动，新电脑都变成了新的BIOS架构即UEFI启动（UEFI是新BIOS架构，自从UEFI出来之后，老的BIOS架构便被称为legacy），在安装grub时比之前稍微麻烦了一点。准备参考教程：https://wiki.archlinux.org/index.php/GRUB 
虽然Arch的wiki有简体中文的翻译，但是一定要看英文的！！！中文的翻译不]]></description><category></category></item><item><title><![CDATA[使用枚举实现单例模式]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/77044813</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/77044813</guid><author>puppylpg</author><pubDate>Thu, 10 Aug 2017 11:32:20 +0800</pubDate><description><![CDATA[前言

单例模式的实现方式有多种，从最基础的非LazyLoad的懒汉式，到LazyLoad但需要双重检查的饿汉式，再到比较简单实现LazyLoad的静态内部类方式，均可实现单例模式。（忘了的可以查查资料:D  友情链接：http://blog.51cto.com/devbean/203501）不过使用枚举实现单例模式，可称之为实现单例模式最简单的方法。

实现



public enum MyS...]]></description><category></category></item><item><title><![CDATA[Future/FutureTask & Callable/Runnable & Executor/ExecutorService/Executors]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/76242257</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/76242257</guid><author>puppylpg</author><pubDate>Mon, 31 Jul 2017 17:03:01 +0800</pubDate><description><![CDATA[用途：笔记。 
各类具体方法参阅JDK API。Callable/Runnable接口
Runnable用于实现线程。大多数情况下，如果只想重写 run() 方法，而不重写其他 Thread 方法，那么应使用 Runnable 接口。这很重要，因为除非程序员打算修改或增强类的基本行为，否则不应为该类创建子类。
Callable 接口类似于 Runnable，两者都是为那些其实例可能被另一个线程执行的]]></description><category></category></item><item><title><![CDATA[Java异常处理]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/76243194</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/76243194</guid><author>puppylpg</author><pubDate>Fri, 28 Jul 2017 14:02:35 +0800</pubDate><description><![CDATA[Java的异常处理有两种方式： 
- 默默解决。使用try...catch。 
- 甩锅。使用throw和throws。通常，我们喜欢用try/catch捕获异常，然后对异常进行处理。但是有时候，我们也会不予理会，直接将异常扔出去，让调用者自己去处理异常。当然对调用者来说，它也有两种同样的选择：自己处理掉，或者再往外扔，交给自己的调用者，由新的调用者继续背锅。以下是几种正常与不正常的异常处理方式示例]]></description><category></category></item><item><title><![CDATA[快速排序及优化（三路划分等）]]></title><link>https://blog.youkuaiyun.com/puppylpg/article/details/70233728</link><guid>https://blog.youkuaiyun.com/puppylpg/article/details/70233728</guid><author>puppylpg</author><pubDate>Wed, 19 Apr 2017 00:36:02 +0800</pubDate><description><![CDATA[快速排序， 是最经典的排序算法之一。快速排序拥有良好的时间复杂度，平均为O(nlog2n)O(nlog_{2}n)，最差为O(n2)O(n^2)。在这里，我们不妨略略深入讨论一下快速排序：时间复杂度分析首先说平均时间复杂度。以比较常用的从两头进行扫描的算法为例，算法主要分两步： 
1. 是快排的核心：“分趟”。就是“每一趟”下来，找到某一个元素应该待的位置，这个元素一般被称为pivot； 
2.再分]]></description><category></category></item></channel></rss>