自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 收藏
  • 关注

原创 java常见的一些垃圾收集器

垃圾收集器概述垃圾:在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。垃圾回收期:垃圾收集器就是负责在指定的情况下去回收这些垃圾,评估回收器的性能指标:吞吐量:运行用户代码的时间占运行时间的比例垃圾收集开销:吞吐量的补数,垃圾收集器占总运行时间的比例暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间收集频率:相对应用程序的执行,收集操作发生的频率内存占用:java堆区所占内存的大小现在的标准:在最大吞吐量优先的情况下,降低停顿时间几款常见的垃圾回收器串

2021-01-28 17:04:07 693

原创 虚拟机运行时数据区堆,栈,方法区(下篇)

虚拟机运行时数据区堆,栈,方法区(下篇)铁汁们,可以先去看看上篇哟点击传送概述在上篇简单概述了虚拟机运算时数据区里的 pc寄存器,本地方法栈,虚拟机栈,以及虚拟机栈里栈帧的结构,这些都是属于线程的私有空间,每个线程都会有这些结构,但是下篇讲的堆和方法区是所有线程共享的。内存图示堆在堆中内存被分为两大块,分别是年轻代(YongGen)和老年代(OldGen),他们都是用来存储java对象的,但是在jvm中java对象被分为两类:第一类是生命周期较短,朝生夕死的那类对象,这类对象的创建和消亡都非常

2021-01-07 19:01:34 139 1

原创 虚拟机运行时数据区 堆,栈,方法区(上篇)

运行时数据区内存分布(上篇)堆和方法区下篇讲概述我们运行一个所谓的java程序,其实就是开启了一个虚拟机的进程,那这个虚拟机在程序运行时虚拟机里跟程序运行相关的内存结果有哪些呢。图示如图所示,相信平时大家也接触过内存图,但大部分都是堆,栈,方法区,其他的结构听说的相对性就会比较少。每个线程都有自己独立的虚拟机栈,本地方法栈,程序计数器就是图上灰色的结构,但是方法区和堆是多线程共享的。就是说灰色部分每个线程一份,可以有多份,但是红色部分就每个虚拟机只有一份了。图示先讲这些共享的结构pc寄

2020-12-30 18:10:07 163

原创 双亲委派机制和沙箱安全机制

双亲委派机制和沙箱安全机制如果对类加载器没有了解的可以先看我另一篇文章讲得是类加载器点击传送概述为什么需要双亲委派机制和沙箱安全机制,举个栗子,如果说我们任何人都可以在项目里去定义一个java.lang包下的String类进行使用的话,就说明java核心的API可以被随意篡改。这样即不安全,也不规范了。双亲委派机制工作原理:如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给自己的父类加载器去执行,如果父类加载器存在父类则进一步向上进行委托,依次递归,最终到达顶层启动类加

2020-12-30 17:25:29 1245 9

原创 简单了解java的类加载器

类加载器提问我们平时自己所写的类文件是怎么被加载的,又或者说是被哪个类加载器所加载,还有那些已经被定义好的的类呢(比如String)?类加载器概述虚拟机支持两种类型的类加载器,分别是引导类加载器(Bootstrap ClassLoader),和自定义类加载器(User-Defined ClassLoader)。从概念上讲自定义加载器一般指程序开发中由开发人员自定义的一类类加载器,但java虚拟机规范里是将所有派生于抽象类ClassLoader类加载器都划分为自定义加载器。但是无论加载器如何划分在

2020-12-30 16:39:05 104

原创 贪心算法_电台覆盖问题

贪心算法算法简介贪心算法又称贪婪算法,它的核心思想就是不管要做什么选择,或是得到什么结果,都要最好的最优的,跟名字的比较贪婪,但是最后得到的结果不一定是最好的。可能是最好的,或是无限接近于最好的结果。电台问题如果有如图这些广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号问题分析首先我们可以把所有需要覆盖到的所有地区都存入一个集合,然后遍历这些电台,找到可以覆盖最多的一个,然后拿出,并且从集合中去掉已经覆盖的城市。依次类推,直至存地区的集合为空,问题解决

2020-12-11 14:09:56 266

原创 克鲁斯卡尔算法_修路问题

克鲁斯卡尔算法问题描述修路问题:七个村庄(A,B,C,D,E,F,G)要修路,七个村庄之间路线很多,要怎样才可以在保证联通所有村庄的同时修最短的路思路分析我们可以把所有的边存入数组,然后按照从小到大的取出去构建最小树,但是保证取出的边不会构成回路。如图我们有十条边,先都存入数组,然后取出依次取出,先取出最短的A->G,不构成回路,继续取...

2020-12-11 13:24:59 463

原创 轻而易举理解_普利姆算法_修路问题

普利姆算法问题描述修路问题:现在有A,B,C,D,E,F,G七个村庄,道路四通八达,有一天为了交通便利,几个村庄就想修路,但是经济条件有限,道路却有很多条,我们要怎么知道在修最短路程的基础上又保证所有村庄都可以联通起来。思路分析这就是一个求最小生成树的问题,举例我们从A村开始修,这时候A可以修往(C B G)三个村,因为是修最短路径,如图所示A->G最短,我们就修往G村。此时修到了G村,我们在G这个村庄判断G可以修往的村庄,如图所示G可以修往(A B E F )但是此时去往A村庄的路已经通了

2020-12-04 15:54:31 329

原创 简单分析_动态规划_01背包

动态规划_01背包问题描述01背包问题:假设你有一个背包,可以装4㎏东西,但是你有很多东西比如;锤子(1000元,1kg),棒子(1500元,2kg),棍子(2000元,1kg)…等。你要怎么样在你的书包里放入组合起来价值最大的物品。简而言之,在有限的空间怎样搭配才可以装入最大价值的东西,并且物品不重复。解决思路穷举法:把所有的可能性都列举出来,然后一一对比,可以达到一个解决问题的目的,但是可选择的物品如果多一些,从时间上和效率上,并不可取。动态规划:怎么去理解动态规划呢。就是从最优解的基础上去推

2020-12-04 14:06:23 101 1

原创 比较好懂的选择排序(java)

选择排序介绍选择排序的核心思想就是每次遍历我都确定一个值,第一次遍历我把最小值确定下来放在最第一个,然后第二次遍历我把第二小的确定下来放在第二个。每次确定一个值我们就可以少考虑一个值。这就是选择排序图解(来自参考资料)代码实现 public static void main(String[] args) { int[] arr = {2, 1, 5, 4, 6, 3, 0}; selectSort(arr); } public static

2020-11-27 17:58:08 77 2

原创 简单分析二分查找

二分查找算法二分查找跟快速排序很相似,有兴趣的或没了解过的,客官 这边请点击传送介绍二分查找也叫折半查找,听名字就知道折一半,优点就是减少了查找次数。场景分析有一天你朋友对你说:猜我有多少钱,提前告诉你1~100之间。你会咋猜,不会从1到100,一个一个猜吧。这个时候咱如果用二分查找的话就会快一些,先取一半50,他如果说大了,再取一半的左边的一半25,反正取右边的一半75。相信我没几回合就猜出来了代码实现(非递归)递归版本的话参考我的快排点击传送public static void main

2020-11-27 17:33:01 63

原创 简单分析kmp算法

KMP算法介绍没有了解暴力匹配算法的可以先看看暴力匹配算法比较简单点击可以传送kmp算法跟暴力匹配算法目的相同,都是解决类似于字符串匹配这样的问题的,但是kmp算法不同与暴力算法的是,暴力匹配算法时一次匹配不成功就回溯到上次匹配的下一个位置从新匹配,但是kmp算法可以根据需要子字符串前缀和后缀生成一个next数组,当匹配不成功时根据next数组里相对应的值,决定继续匹配的位置。举个例子:如果子串是 AB…AB…。如果匹配失败了,就把前面的AB直接挪到后面AB的位置继续匹配。next数组next数

2020-11-27 17:05:48 92

原创 简单分析连接池的原理

连接池介绍我们为什么需要连接池? 在jdbc操作中,需要不停的创建连接,完成需求后,又销毁连接,每次创建和销毁都是耗时操作,对效率和运行速度上来说都是不可取的。解决思路如果有一个容器可以装下很多的连接,需要连接时可以直接从里面取出连接,不需要时把连接归还回去,这样就在效率上就连接池就相当于这样一个容器。自定义一个连接池public class MyConnectionPool implements DataSource { private static String url;

2020-11-27 15:22:44 80

原创 简单明了_暴力匹配算法

暴力匹配算法使用场景如果有两个字符串或数字str1(1123312333211),str2(123),想知道str2是否跟str1里面的某一处完全匹配(完全一样)如果匹配的话。匹配的起始位置是哪里。算法介绍暴力匹配算法还是比较好理解,字面上就可以看出比较暴力。我们拿str1的第一个数据跟str2的第一个数据进行比较,如果一样就继续比较str1和str2的第二个数据,如果不一样,就拿str2的第一个数据跟str1的第二个数据进行比较。以此类推。简而言之如果匹配失败。就拿着str2的第一个数据和str1

2020-11-27 14:52:35 624 2

原创 通俗易懂_汉诺塔(java递归实现)

汉诺塔汉诺塔介绍汉罗塔游戏简单来说就是,有三根柱子(记作ABC),A柱子上有从小到大的若干个圆盘,我们要怎么把A柱子上的这若干个圆盘全部挪到C,并且保证顺序还是从小到大。 规则是:挪的过程中大圆盘不能放在小圆盘上面。图解一下(来自参考资料)可以看到如果只有一个圆盘我们可以直接挪到C。A -> B有两个的话先把上面圆盘的挪到B,然后把最下面圆盘的挪到C,再把B的圆盘挪到C。(重点理解)A -> BA -> CB -> C有三个的话我们也得把最下面圆盘上面所有的圆

2020-11-27 14:13:40 588

原创 深入了解分析_JDBC

JDBC和连接池JDBC前言了解JDBC之前,我们想想为什么需要有JDBC这个接口。JDBC是java提供给我们去跟数据库做连接的一个接口。有些人会有疑惑了。我们直接在类里就可以导入数据库驱动,添加连接,然后对数据库进行增删改查也可以呀,所有为什么要有JDBC呢。...

2020-11-22 00:24:28 93

原创 简单易懂_桶排序

桶排序描述我们可以想象一个,如果我们有十个数组编号分别是0~9,如果我们要排序的数据都是个位数的话(例如4,2,9,8,6),我们按照数据本身的值存入相对应编号的数组,例如4存入编号为4的数组,然后按照顺序去遍历十个数组取出的数据就是有序的数据。图片分析分析所以桶排序对应桶排序我们要去解决的是怎么去对多位数进行排序。代码实现注释得很清楚 public static void main(String[] args) { int [] arr = {623,3414,4231

2020-11-20 19:18:07 110

原创 通俗易懂_希尔排序

希尔排序学希尔排序的话 应该是学完插入排序了吧 ,如果没有学习的话我也有写 点击传送 ,可以先看看插入排序。因为希尔排序是把插入排序做了一个优化升级。应用场景我们使用插入排序去对一组数据进行排序的话最不希望看到的状况是哪种呢,很显然是数据的量大 而且大小数据极其不规律的情况 比如说小的数据都在后面 大的数据都在前面,因为插入排序的一个机制是拿当前的数据跟前面的数据不停的作比较然后插入,直至当前数据比前面的数据大。基于这样的机制我们遍历到越后面要进行的操作就越多,不停的比较和插入,效率和速度上就会

2020-11-20 15:11:00 4956 3

原创 举例分析_快速排序

快速排序描述快速排序的核心思想就是定义一个中间值 然后让这个数组中比它小的值都去到它的左边 比它大的值都去到它的右边 。完毕后再重新定义中间值 直至排序完毕。举个栗子(场景描述 )军训排队站队列 教官拉出一个人(中间值) 说比他矮的站他左边 比他高的站他右边 ,这次完毕后 这个人左边的同学都会比他矮,右边的同学都会比他高。这里没问题的话 后面就是递归的问题了(按规律不停的定义中间值)。(先对左边数据进行排序)教官去左边的中间再拉出一个人 比他矮的人站他左边 ,比他高的人站他右边 但

2020-11-18 00:21:46 286

原创 简单易懂_插入排序

插入排序描述插入排序就是给每一个数据找到相对应的位置并插进去 说的些许抽象, 记住这个“插入”圈起来要考。举个栗子 当数组遍历到第二个数据(数据2)时 首先会让数据2和在他前面的数据1 进行比较 如果数据1比较大 就会把数据2“插入”到数据1 前面。反之则一动不动。 遍历到数据3 时 首先会让数据3和在它前面的数据2 作比较 如果数据3 比数据2 大 则一动不动 反之 插入到数据2前面继续跟数据1比较 依次类推 当我们遍历完最后一个数据时 我们就可以得到一个有序数组(集合)了图片加深理解(来源参考

2020-11-16 21:49:08 508 4

原创 通俗易懂_冒泡排序

冒泡排序描述冒泡排序的核心思想 你可以想想军训站队排队列 , 首先得把第一个人拉出来跟第二个人进行比较 ,如果第二个比他高 两人交换位置 然后他就站在第二个 ,然后继续让第二个跟第三个进行比较 以此类推 直到比较到最后一个。第一轮比较完毕后就会确定出最高的人并且站到最后 ,这个时候就确定了最大值 。然后继续拉出队列中第一个人进行比较 确定第二大的值 以此类推 循环比较n-1次 (n是需要进行比较的数据总数)。来张图加深理解(来源参考资料)代码奉上import java.util.Arrays

2020-11-16 21:10:27 145

原创 动态静态代理设计模式

动态静态代理设计模式静态代理和装饰者模式静态代理就是在不继承(或实现)一个类的基础上去“增强”这个类中的某个方法 听起来跟装饰者模式很像 装饰者模式是运行时增强(在调用时传入被增强类)而静态代理的话是编译时增强(编译时增强类就要被确定)可以看到静态代理在编译时就确定增强那个类 而装饰者模式的话在调用时才传入参数 才可以确定增强那个类 大家有没有发现不管是装饰者模式还是静态代理都需要一个类去继承被增强类的接口 美中多少有些许不足 。动态代理撤销:Ctrl/Command + Z重做

2020-11-15 23:45:30 69

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除