<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[w7335123的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/w7335123</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; w7335123]]></copyright><item><title><![CDATA[java常见的一些垃圾收集器]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/113349348</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/113349348</guid><author>w7335123</author><pubDate>Thu, 28 Jan 2021 17:04:07 +0800</pubDate><description><![CDATA[垃圾收集器
概述
垃圾：
在运行程序中没有任何指针指向的对象，这个对象就是需要被回收的垃圾。
垃圾回收期：
垃圾收集器就是负责在指定的情况下去回收这些垃圾，
评估回收器的性能指标：
吞吐量：
运行用户代码的时间占运行时间的比例
垃圾收集开销：
吞吐量的补数，垃圾收集器占总运行时间的比例
暂停时间：
执行垃圾收集时，程序的工作线程被暂停的时间
收集频率：
相对应用程序的执行，收集操作发生的频率
内存占用：
java堆区所占内存的大小
现在的标准：在最大吞吐量优先的情况下，降低停顿时间
几款常见的垃圾回收器
串]]></description><category></category></item><item><title><![CDATA[虚拟机运行时数据区堆，栈，方法区（下篇）]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/112327376</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/112327376</guid><author>w7335123</author><pubDate>Thu, 07 Jan 2021 19:01:34 +0800</pubDate><description><![CDATA[虚拟机运行时数据区堆，栈，方法区（下篇）
铁汁们，可以先去看看上篇哟点击传送
概述
在上篇简单概述了虚拟机运算时数据区里的 pc寄存器，本地方法栈，虚拟机栈，以及虚拟机栈里栈帧的结构，这些都是属于线程的私有空间，每个线程都会有这些结构，但是下篇讲的堆和方法区是所有线程共享的。
内存图示

堆
在堆中内存被分为两大块，分别是年轻代（YongGen）和老年代（OldGen），他们都是用来存储java对象的，但是在jvm中java对象被分为两类：第一类是生命周期较短，朝生夕死的那类对象，这类对象的创建和消亡都非常]]></description><category></category></item><item><title><![CDATA[虚拟机运行时数据区 堆，栈，方法区（上篇）]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/111995265</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/111995265</guid><author>w7335123</author><pubDate>Wed, 30 Dec 2020 18:10:07 +0800</pubDate><description><![CDATA[运行时数据区内存分布（上篇）
堆和方法区下篇讲
概述
我们运行一个所谓的java程序，其实就是开启了一个虚拟机的进程，那这个虚拟机在程序运行时虚拟机里跟程序运行相关的内存结果有哪些呢。
图示

如图所示，相信平时大家也接触过内存图，但大部分都是堆，栈，方法区，其他的结构听说的相对性就会比较少。
每个线程都有自己独立的虚拟机栈，本地方法栈，程序计数器就是图上灰色的结构，但是方法区和堆是多线程共享的。就是说灰色部分每个线程一份，可以有多份，但是红色部分就每个虚拟机只有一份了。
图示

先讲这些共享的结构
pc寄]]></description><category></category></item><item><title><![CDATA[双亲委派机制和沙箱安全机制]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/111994193</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/111994193</guid><author>w7335123</author><pubDate>Wed, 30 Dec 2020 17:25:29 +0800</pubDate><description><![CDATA[双亲委派机制和沙箱安全机制
如果对类加载器没有了解的可以先看我另一篇文章讲得是类加载器点击传送
概述
为什么需要双亲委派机制和沙箱安全机制，举个栗子，如果说我们任何人都可以在项目里去定义一个java.lang包下的String类进行使用的话，就说明java核心的API可以被随意篡改。这样即不安全，也不规范了。
双亲委派机制
工作原理：
如果一个类加载器收到了类加载请求，它并不会自己先去加载，而是把这个请求委托给自己的父类加载器去执行，如果父类加载器存在父类则进一步向上进行委托，依次递归，最终到达顶层启动类加]]></description><category></category></item><item><title><![CDATA[简单了解java的类加载器]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/111993357</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/111993357</guid><author>w7335123</author><pubDate>Wed, 30 Dec 2020 16:39:05 +0800</pubDate><description><![CDATA[类加载器
提问
我们平时自己所写的类文件是怎么被加载的，又或者说是被哪个类加载器所加载，还有那些已经被定义好的的类呢（比如String）？
类加载器概述
虚拟机支持两种类型的类加载器，分别是引导类加载器（Bootstrap ClassLoader），和自定义类加载器（User-Defined ClassLoader）。
从概念上讲自定义加载器一般指程序开发中由开发人员自定义的一类类加载器，但java虚拟机规范里是将所有派生于抽象类ClassLoader类加载器都划分为自定义加载器。
但是无论加载器如何划分在]]></description><category></category></item><item><title><![CDATA[贪心算法_电台覆盖问题]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/111033888</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/111033888</guid><author>w7335123</author><pubDate>Fri, 11 Dec 2020 14:09:56 +0800</pubDate><description><![CDATA[贪心算法
算法简介
贪心算法又称贪婪算法，它的核心思想就是不管要做什么选择，或是得到什么结果，都要最好的最优的，跟名字的比较贪婪，但是最后得到的结果不一定是最好的。可能是最好的，或是无限接近于最好的结果。
电台问题
如果有如图这些广播台，以及广播台信号可以覆盖的地区。 如何选择最少的广播台，让所有的地区都可以接收到信号

问题分析
首先我们可以把所有需要覆盖到的所有地区都存入一个集合，然后遍历这些电台，找到可以覆盖最多的一个，然后拿出，并且从集合中去掉已经覆盖的城市。依次类推，直至存地区的集合为空，问题解决]]></description><category></category></item><item><title><![CDATA[克鲁斯卡尔算法_修路问题]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/110663544</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/110663544</guid><author>w7335123</author><pubDate>Fri, 11 Dec 2020 13:24:59 +0800</pubDate><description><![CDATA[克鲁斯卡尔算法
问题描述
修路问题：七个村庄（A，B，C，D，E，F，G）要修路，七个村庄之间路线很多，要怎样才可以在保证联通所有村庄的同时修最短的路

思路分析
我们可以把所有的边存入数组，然后按照从小到大的取出去构建最小树，但是保证取出的边不会构成回路。如图我们有十条边，先都存入数组，然后取出依次取出，先取出最短的A-&gt;G，不构成回路，继续取

...]]></description><category></category></item><item><title><![CDATA[轻而易举理解_普利姆算法_修路问题]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/110646012</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/110646012</guid><author>w7335123</author><pubDate>Fri, 04 Dec 2020 15:54:31 +0800</pubDate><description><![CDATA[普利姆算法
问题描述
修路问题：现在有A，B，C，D，E，F，G七个村庄，道路四通八达，有一天为了交通便利，几个村庄就想修路，但是经济条件有限，道路却有很多条，我们要怎么知道在修最短路程的基础上又保证所有村庄都可以联通起来。

思路分析
这就是一个求最小生成树的问题，举例我们从A村开始修，这时候A可以修往（C B G）三个村，因为是修最短路径，如图所示A-&gt;G最短，我们就修往G村。此时修到了G村，我们在G这个村庄判断G可以修往的村庄，如图所示G可以修往（A B E F ）但是此时去往A村庄的路已经通了]]></description><category></category></item><item><title><![CDATA[简单分析_动态规划_01背包]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/110633196</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/110633196</guid><author>w7335123</author><pubDate>Fri, 04 Dec 2020 14:06:23 +0800</pubDate><description><![CDATA[动态规划_01背包
问题描述
01背包问题：假设你有一个背包，可以装4㎏东西，但是你有很多东西比如；锤子（1000元，1kg），棒子（1500元，2kg），棍子（2000元，1kg）…等。你要怎么样在你的书包里放入组合起来价值最大的物品。简而言之，在有限的空间怎样搭配才可以装入最大价值的东西，并且物品不重复。
解决思路
穷举法：把所有的可能性都列举出来，然后一一对比，可以达到一个解决问题的目的，但是可选择的物品如果多一些，从时间上和效率上，并不可取。
动态规划：怎么去理解动态规划呢。就是从最优解的基础上去推]]></description><category></category></item><item><title><![CDATA[比较好懂的选择排序（java）]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/110238968</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/110238968</guid><author>w7335123</author><pubDate>Fri, 27 Nov 2020 17:58:08 +0800</pubDate><description><![CDATA[选择排序
介绍
选择排序的核心思想就是每次遍历我都确定一个值，第一次遍历我把最小值确定下来放在最第一个，然后第二次遍历我把第二小的确定下来放在第二个。每次确定一个值我们就可以少考虑一个值。这就是选择排序
图解（来自参考资料）

代码实现
 public static void main(String[] args) {

        int[] arr = {2, 1, 5, 4, 6, 3, 0};
        selectSort(arr);

    }

    public static ]]></description><category></category></item><item><title><![CDATA[简单分析二分查找]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/110237667</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/110237667</guid><author>w7335123</author><pubDate>Fri, 27 Nov 2020 17:33:01 +0800</pubDate><description><![CDATA[二分查找算法
二分查找跟快速排序很相似，有兴趣的或没了解过的，客官 这边请点击传送
介绍
二分查找也叫折半查找，听名字就知道折一半，优点就是减少了查找次数。
场景分析
有一天你朋友对你说：猜我有多少钱，提前告诉你1~100之间。你会咋猜，不会从1到100，一个一个猜吧。这个时候咱如果用二分查找的话就会快一些，先取一半50，他如果说大了，再取一半的左边的一半25，反正取右边的一半75。相信我没几回合就猜出来了
代码实现(非递归)
递归版本的话参考我的快排点击传送
public static void main]]></description><category></category></item><item><title><![CDATA[简单分析kmp算法]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/110234158</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/110234158</guid><author>w7335123</author><pubDate>Fri, 27 Nov 2020 17:05:48 +0800</pubDate><description><![CDATA[KMP算法
介绍
没有了解暴力匹配算法的可以先看看暴力匹配算法比较简单点击可以传送
kmp算法跟暴力匹配算法目的相同，都是解决类似于字符串匹配这样的问题的，但是kmp算法不同与暴力算法的是，暴力匹配算法时一次匹配不成功就回溯到上次匹配的下一个位置从新匹配，但是kmp算法可以根据需要子字符串前缀和后缀生成一个next数组，当匹配不成功时根据next数组里相对应的值，决定继续匹配的位置。
举个例子：如果子串是 AB…AB…。如果匹配失败了，就把前面的AB直接挪到后面AB的位置继续匹配。
next数组
next数]]></description><category></category></item><item><title><![CDATA[简单分析连接池的原理]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/110231838</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/110231838</guid><author>w7335123</author><pubDate>Fri, 27 Nov 2020 15:22:44 +0800</pubDate><description><![CDATA[连接池
介绍
我们为什么需要连接池？ 在jdbc操作中，需要不停的创建连接，完成需求后，又销毁连接，每次创建和销毁都是耗时操作，对效率和运行速度上来说都是不可取的。
解决思路
如果有一个容器可以装下很多的连接，需要连接时可以直接从里面取出连接，不需要时把连接归还回去，这样就在效率上就连接池就相当于这样一个容器。
自定义一个连接池
public class MyConnectionPool implements DataSource {

    private static String url;
    ]]></description><category></category></item><item><title><![CDATA[简单明了_暴力匹配算法]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/110231000</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/110231000</guid><author>w7335123</author><pubDate>Fri, 27 Nov 2020 14:52:35 +0800</pubDate><description><![CDATA[暴力匹配算法
使用场景
如果有两个字符串或数字str1(1123312333211)，str2（123），想知道str2是否跟str1里面的某一处完全匹配（完全一样）如果匹配的话。匹配的起始位置是哪里。
算法介绍
暴力匹配算法还是比较好理解，字面上就可以看出比较暴力。我们拿str1的第一个数据跟str2的第一个数据进行比较，如果一样就继续比较str1和str2的第二个数据，如果不一样，就拿str2的第一个数据跟str1的第二个数据进行比较。以此类推。简而言之如果匹配失败。就拿着str2的第一个数据和str1]]></description><category></category></item><item><title><![CDATA[通俗易懂_汉诺塔（java递归实现）]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/110228060</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/110228060</guid><author>w7335123</author><pubDate>Fri, 27 Nov 2020 14:13:40 +0800</pubDate><description><![CDATA[汉诺塔
汉诺塔介绍
汉罗塔游戏简单来说就是，有三根柱子（记作ABC），A柱子上有从小到大的若干个圆盘，我们要怎么把A柱子上的这若干个圆盘全部挪到C，并且保证顺序还是从小到大。 规则是：挪的过程中大圆盘不能放在小圆盘上面。
图解一下（来自参考资料）
可以看到如果只有一个圆盘我们可以直接挪到C。
A -&gt; B

有两个的话先把上面圆盘的挪到B，然后把最下面圆盘的挪到C，再把B的圆盘挪到C。（重点理解）
A -&gt; B
A -&gt; C
B -&gt; C

有三个的话我们也得把最下面圆盘上面所有的圆]]></description><category></category></item><item><title><![CDATA[深入了解分析_JDBC]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/109910953</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/109910953</guid><author>w7335123</author><pubDate>Sun, 22 Nov 2020 00:24:28 +0800</pubDate><description><![CDATA[JDBC和连接池
JDBC
前言
了解JDBC之前，我们想想为什么需要有JDBC这个接口。JDBC是java提供给我们去跟数据库做连接的一个接口。有些人会有疑惑了。我们直接在类里就可以导入数据库驱动，添加连接，然后对数据库进行增删改查也可以呀，所有为什么要有JDBC呢。

...]]></description><category></category></item><item><title><![CDATA[简单易懂_桶排序]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/109856313</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/109856313</guid><author>w7335123</author><pubDate>Fri, 20 Nov 2020 19:18:07 +0800</pubDate><description><![CDATA[桶排序
描述
我们可以想象一个，如果我们有十个数组编号分别是0~9，如果我们要排序的数据都是个位数的话（例如4，2，9，8，6），我们按照数据本身的值存入相对应编号的数组，例如4存入编号为4的数组，然后按照顺序去遍历十个数组取出的数据就是有序的数据。
图片分析

分析
所以桶排序对应桶排序我们要去解决的是怎么去对多位数进行排序。
代码实现
注释得很清楚
  public static void main(String[] args) {
        int [] arr = {623,3414,4231]]></description><category></category></item><item><title><![CDATA[通俗易懂_希尔排序]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/109847299</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/109847299</guid><author>w7335123</author><pubDate>Fri, 20 Nov 2020 15:11:00 +0800</pubDate><description><![CDATA[希尔排序
学希尔排序的话  应该是学完插入排序了吧 ，如果没有学习的话我也有写  点击传送 ，可以先看看插入排序。因为希尔排序是把插入排序做了一个优化升级。
应用场景
我们使用插入排序去对一组数据进行排序的话最不希望看到的状况是哪种呢，很显然是数据的量大 而且大小数据极其不规律的情况  比如说小的数据都在后面 大的数据都在前面，因为插入排序的一个机制是拿当前的数据跟前面的数据不停的作比较然后插入，直至当前数据比前面的数据大。基于这样的机制我们遍历到越后面要进行的操作就越多，不停的比较和插入，效率和速度上就会]]></description><category></category></item><item><title><![CDATA[举例分析_快速排序]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/109758224</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/109758224</guid><author>w7335123</author><pubDate>Wed, 18 Nov 2020 00:21:46 +0800</pubDate><description><![CDATA[快速排序
描述
快速排序的核心思想就是定义一个中间值  然后让这个数组中比它小的值都去到它的左边 比它大的值都去到它的右边  。完毕后再重新定义中间值 直至排序完毕。
举个栗子（场景描述 ）
军训排队站队列  教官拉出一个人（中间值） 说比他矮的站他左边  比他高的站他右边  ，这次完毕后   这个人左边的同学都会比他矮，右边的同学都会比他高。这里没问题的话 后面就是递归的问题了（按规律不停的定义中间值）。（先对左边数据进行排序）教官去左边的中间再拉出一个人   比他矮的人站他左边 ，比他高的人站他右边 但]]></description><category></category></item><item><title><![CDATA[简单易懂_插入排序]]></title><link>https://blog.youkuaiyun.com/w7335123/article/details/109730463</link><guid>https://blog.youkuaiyun.com/w7335123/article/details/109730463</guid><author>w7335123</author><pubDate>Mon, 16 Nov 2020 21:49:08 +0800</pubDate><description><![CDATA[插入排序
描述
插入排序就是给每一个数据找到相对应的位置并插进去  说的些许抽象， 记住这个“插入”圈起来要考。举个栗子  当数组遍历到第二个数据（数据2）时 首先会让数据2和在他前面的数据1 进行比较 如果数据1比较大 就会把数据2“插入”到数据1 前面。反之则一动不动。 遍历到数据3 时 首先会让数据3和在它前面的数据2 作比较 如果数据3 比数据2 大 则一动不动 反之 插入到数据2前面继续跟数据1比较 依次类推 当我们遍历完最后一个数据时 我们就可以得到一个有序数组（集合）了
图片加深理解（来源参考]]></description><category></category></item></channel></rss>