<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[宋常华的博客]]></title><description><![CDATA[少年辛苦终身事， 莫向光阴惰寸功。]]></description><link>https://blog.youkuaiyun.com/sch20095100</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; sch20095100]]></copyright><item><title><![CDATA[静态工厂方法强化Singleton属性]]></title><link>https://blog.youkuaiyun.com/sch20095100/article/details/52143526</link><guid>https://blog.youkuaiyun.com/sch20095100/article/details/52143526</guid><author>sch20095100</author><pubDate>Sun, 07 Aug 2016 20:59:20 +0800</pubDate><description><![CDATA[JDK1.5发行版本之前，实现Singleton有两种方法。这两种方法都要把构造器私有，并导出公有的静态成员，以便允许客户端能够访问该类的唯一实例，在第一种方法中，公有静态成员是个final域：// Singleton with public final field
public class Elvis {
    public static final Elvis INSTANCE = new E]]></description><category></category></item><item><title><![CDATA[责任链模式模拟servlet过滤器]]></title><link>https://blog.youkuaiyun.com/sch20095100/article/details/48849883</link><guid>https://blog.youkuaiyun.com/sch20095100/article/details/48849883</guid><author>sch20095100</author><pubDate>Thu, 01 Oct 2015 22:24:57 +0800</pubDate><description><![CDATA[模拟场景：对一个request请求所带的信息进行三次过滤，并再返回response中加上过滤标记，第一次过滤html的特殊标记，并追加标记；第二次过滤敏感词，并追加标记；第三次替换表情，并追加标记。要求先一次过滤，在逆序的追加标签。这三个具体的过滤器类组成了一条责任链。 
模拟request和response中的消息正文：public class Request {
    String reqSt]]></description><category></category></item><item><title><![CDATA[模拟JDK动态代理类的实现]]></title><link>https://blog.youkuaiyun.com/sch20095100/article/details/47985177</link><guid>https://blog.youkuaiyun.com/sch20095100/article/details/47985177</guid><author>sch20095100</author><pubDate>Wed, 26 Aug 2015 00:17:22 +0800</pubDate><description><![CDATA[问题： 
要理解动态代理及其优点，我们先从这样一个问题入手，比如现在我们有UserDao这样一个接口，里面有addUser()方法，同时有一个UserDaoImpl类实现了该接口，具体实现了addUser()方法，现在我要实现在该方法前后记录日志的功能，有什么解决办法呢？
在源代码上直接修改。第一反应肯定是直接在源码上添加该功能，但是如果我的需求变成在所有的DaoImpl包里的类的所有的方法都添加记]]></description><category></category></item><item><title><![CDATA[一道多线程笔试题目的联想]]></title><link>https://blog.youkuaiyun.com/sch20095100/article/details/47396693</link><guid>https://blog.youkuaiyun.com/sch20095100/article/details/47396693</guid><author>sch20095100</author><pubDate>Mon, 10 Aug 2015 11:52:45 +0800</pubDate><description><![CDATA[题目描述 
一个文件中有10000个数，用Java实现一个多线程程序将这个10000个数输出到5个不用文件中（不要求输出到每个文件中的数量相同）。要求启动10个线程，两两一组，分为5组。每组两个线程分别将文件中的奇数和偶数输出到该组对应的一个文件中，需要偶数线程每打印10个偶数以后，就将奇数线程打印10个奇数，如此交替进行。同时需要记录输出进度，每完成1000个数就在控制台中打印当前完成数量，并在所]]></description><category></category></item><item><title><![CDATA[选择排序的几种算法]]></title><link>https://blog.youkuaiyun.com/sch20095100/article/details/46989085</link><guid>https://blog.youkuaiyun.com/sch20095100/article/details/46989085</guid><author>sch20095100</author><pubDate>Tue, 21 Jul 2015 17:18:17 +0800</pubDate><description><![CDATA[选择排序的基本思想是：每趟从n-i+1（i=1,2,…,n-1）个记录中选取关键字最小的记录作为有序序列中第i个元素。 
简单选择排序void  SelectSort(Elem R[],int n){
    //对R[1]~R[n]做简单选择排序
    int i;
    for(i=1;i<n;i++){
        j=SelectMinKey(R,i);    //在R[i...n]]]></description><category></category></item><item><title><![CDATA[交换排序的几种排序算法]]></title><link>https://blog.youkuaiyun.com/sch20095100/article/details/46889621</link><guid>https://blog.youkuaiyun.com/sch20095100/article/details/46889621</guid><author>sch20095100</author><pubDate>Wed, 15 Jul 2015 10:32:44 +0800</pubDate><description><![CDATA[起泡排序void bubbleSort(Elem R[]){
    int i,j;
    i=n;
    while(i>1){
        int lastChangeIndex=n;
        for(j=1;j<i;j++){
            if(R[j]>R[j+1]){
                swap(R[j],R[j+1]);]]></description><category></category></item><item><title><![CDATA[插入排序的几种算法]]></title><link>https://blog.youkuaiyun.com/sch20095100/article/details/46833071</link><guid>https://blog.youkuaiyun.com/sch20095100/article/details/46833071</guid><author>sch20095100</author><pubDate>Fri, 10 Jul 2015 17:12:57 +0800</pubDate><description><![CDATA[1.直接插入排序 
直接插入排序是一种最简单的排序方法，它的基本操作是将一个记录插入到已排好序的有序表中，从而得到一个新的、记录数增1的有序表。 
一般情况下，第i趟直接插入排序的操作为：在含有i-1个记录的有序子序列r[1…i-1]中插入一个记录r[i]后，变成含有i个记录的有序子序列r[1…i]；并且，和顺序查找类似，为了在查找插入位置的过程中避免数组下标出界，在r[0]处设置监视哨。在自i-1]]></description><category></category></item><item><title><![CDATA[内存分配与回收策略]]></title><link>https://blog.youkuaiyun.com/sch20095100/article/details/46701121</link><guid>https://blog.youkuaiyun.com/sch20095100/article/details/46701121</guid><author>sch20095100</author><pubDate>Tue, 30 Jun 2015 22:01:54 +0800</pubDate><description><![CDATA[Java技术体系所提倡的自动内存管理最终可以归结为自动化地解决了两个问题：给对象分配内存以及回收分配给对象的内存，关于回收内存，前几篇博客已经介绍了虚拟机的垃圾收集器体系以及运行原理，现在我们讨论一下对象分配内存。 
对象分配内存，往大方向讲，就是在堆上分配，对象主要分配在新生代的Eden区上，如果启动了本地线程分配缓冲，将按线程优先在TLAB上分配，少数情况下也可能会直接在老年代分配，总之分配的规]]></description><category></category></item><item><title><![CDATA[HotSpot虚拟机垃圾收集器]]></title><link>https://blog.youkuaiyun.com/sch20095100/article/details/46640119</link><guid>https://blog.youkuaiyun.com/sch20095100/article/details/46640119</guid><author>sch20095100</author><pubDate>Thu, 25 Jun 2015 19:38:31 +0800</pubDate><description><![CDATA[垃圾收集器这了讨论的收集器基于JDK1.7 Update 14之后的HotSpot虚拟机，这个虚拟机包含的所有收集器如图所示。 
                  HotSpot虚拟机的垃圾收集器图中展示了7种作用于不同分代的收集器，如果两个收集器之间存在连线，就说明他们可以搭配使用。收集器所处的区域，则表示它是属于新生代收集器还是老年代收集器。1.Serial收集器 
Serial收集器是最基本]]></description><category></category></item><item><title><![CDATA[HotSpot的算法实现]]></title><link>https://blog.youkuaiyun.com/sch20095100/article/details/46591757</link><guid>https://blog.youkuaiyun.com/sch20095100/article/details/46591757</guid><author>sch20095100</author><pubDate>Mon, 22 Jun 2015 10:18:05 +0800</pubDate><description><![CDATA[HotSpot的算法实现1.枚举根节点 
从可达性分析中从GC Roots节点找引用为例，可作为GC Roots的节点主要是全局性的引用与执行上下文中，如果要逐个检查引用，必然消耗时间。 
另外可达性分析对执行时间的敏感还体现在GC停顿上，因为这项分析工作必须在一个能确保一致性的快照中进行——这里的“一致性”的意思是指整个分析期间整个系统执行系统看起来就行被冻结在某个时间点，不可以出现分析过程中对象]]></description><category></category></item><item><title><![CDATA[垃圾收集器和内存分配策略]]></title><link>https://blog.youkuaiyun.com/sch20095100/article/details/46575477</link><guid>https://blog.youkuaiyun.com/sch20095100/article/details/46575477</guid><author>sch20095100</author><pubDate>Sat, 20 Jun 2015 20:39:41 +0800</pubDate><description><![CDATA[刚刚在前面介绍了内存的运行时数据区域，其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生，随线程而灭。栈中的栈帧随着方法的进入和退出而有条不紊的执行着入栈和出栈的操作，每一个栈帧中分配多少内存是在类结构确定下来时就已知的，因此这几个区域的内存分配和回收具备确定性，当方法结束或者线程结束时，内存自然就随着回收。而Java堆和方法区不一样，我们只有在程序出于运行期间才知道会创建哪些对象，这部分内存区]]></description><category></category></item><item><title><![CDATA[Java内存区域和内存溢出异常]]></title><link>https://blog.youkuaiyun.com/sch20095100/article/details/46524211</link><guid>https://blog.youkuaiyun.com/sch20095100/article/details/46524211</guid><author>sch20095100</author><pubDate>Tue, 16 Jun 2015 22:07:35 +0800</pubDate><description><![CDATA[运行时存储区域Java虚拟机管理的的内存会包括以下几个运行时内存区域：
程序计数器 
   程序计数器是一块较小的内存空间，可以看成当前线程所执行的字节码行号指示器。由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的，在一个确定的时刻，一个处理器都会执行一条线程当中的指令。因此，为了线程切换后能后恢复到正确执行的位置，每个线程都需要一个独立的线程计数器，各条线程之间的计数器]]></description><category></category></item><item><title><![CDATA[Java虚拟机ClassLoader知识详解（2）]]></title><link>https://blog.youkuaiyun.com/sch20095100/article/details/46432249</link><guid>https://blog.youkuaiyun.com/sch20095100/article/details/46432249</guid><author>sch20095100</author><pubDate>Tue, 09 Jun 2015 21:52:19 +0800</pubDate><description><![CDATA[Java虚拟机加载器Java虚拟机加载器类型–Java虚拟机自带的加载器 
    •根类加载器（Bootstrap） 
    •扩展类加载器（Extension） 
    •系统类加载器（System） 
–用户自定义的类加载器 
    •java.lang.ClassLoader的子类 
    •用户可以定制类的加载方式类加载器并不需要等到某个类被“首次主动使用”时再加载它。JVM规范允]]></description><category></category></item><item><title><![CDATA[Java虚拟机ClassLoader知识详解（1）]]></title><link>https://blog.youkuaiyun.com/sch20095100/article/details/46419135</link><guid>https://blog.youkuaiyun.com/sch20095100/article/details/46419135</guid><author>sch20095100</author><pubDate>Mon, 08 Jun 2015 22:39:19 +0800</pubDate><description><![CDATA[Java虚拟机ClassLoader知识详解（1）最近在学习Java虚拟机，所以把知识点放出来，对自己是梳理巩固，也希望能帮到别人。 
   首先看一个据说Java新手程序员都会犯的错误，上代码：package com.classLoader;
public class Test {
    static class Singleton{
        private static Singlet]]></description><category></category></item></channel></rss>