自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java 对文件进行加密

excel文件分为两种:以xlsx结尾的文件以及xls结尾的文件,针对于这两种不同类型的文件加密的方法也不太一样,使用的 poi-4.1.1.jar和commons-math3-3.6.1.jar这两个apache的工具jar。

2023-03-15 17:42:59 804

原创 ThreadPool 源码分析

一 ThreadPool的概念 线程池可以理解成关联一堆线程的工具,它是处理线程的一种方式。线程池存在的意义在于复用线程同时减少线程的创建和销毁等过程带来的开销。 线程池的优点在于 1 复用线程,减少了线程的创建和销毁等过程带来的开销 2 可以提高响应速度,请求来了,可以直接在线程池中选出一个线程来执行,减 少了创建线程的过程。 ...

2022-09-26 17:12:04 214

原创 JWT(JSON WEB TOKEN)

剖析 JWT

2022-08-22 16:37:19 2604

原创 JAVA浅析之IO模型 BIO/NIO

一 JAVA中的IO模型 java中的IO模型主要分为三大类:BIO/NIO/AIO。 BIO :阻塞IO。 NIO : 阻塞/非阻塞IO。 AIO :异步非阻塞IO。 概念这种东西这里我就不做过多的描述,接下来我们根据实际的案例来分析下BIO和NIO。二 BIO/NIO的实际案例 一 BIO BIO的案例代码如下:public class BioServer { priv...

2021-12-21 17:24:14 375

原创 ThreadPool

一 ThreadPool的概念 线程池可以理解成关联一堆线程的工具,它是处理线程的一种方式。线程池存在的意义在于复用线程同时减少线程的创建和销毁等过程带来的开销。 线程池的优点在于 1复用线程,减少了线程的创建和销毁等过程带来的开销 2可以提高响应速度,请求来了,可以直接在线程池中选出一个线程来执行,减 少了创建线程的过程。 ...

2021-11-30 10:20:18 1056

原创 HashMap源码分析

一HashMap的概念 hashMap可以看作是一个容器,里面存放的是一堆的键值对,hashMap的数据结构是一个存放Node元素的数组再加上一个链表或者红黑数(1.8以后的JDK版本)。在1.8的jdk版本之前,hashMap的结构是一个数组加上一个链表,1.8及之后的版本变成了数组加上链表及红黑数。那么hashMap的底层究竟是如何实现的呢?接下来我们将分析一下hashMap的源码。二HashMap的源码分析 首先进入到hashMap的put方法中,代码如下:...

2021-09-16 15:52:14 128

原创 设计模式之工厂模式

一工厂模式 工厂模式可以分为三种,分别是简单工厂模式,工厂方法,抽象工厂,下面我们将分别介绍一下这三种设计模式, 1简单工厂 我们先通过一个实例来说明一下什么是简单工厂模式:某一天小张同志要去加油站加油,加油站的工作人员会按照一下步骤来完成加油的动作,先打开汽车的油箱盖,然后再选择小张同志需要加的型号的汽油(92, 95, 98),然后将汽油注入到汽车的油箱中,最后盖上油箱盖子。那么按照如下的流程,我们一般的代码流程如下所示: ...

2021-09-13 15:40:33 121

原创 Eureka源码分析之启动过程

一Eureka的启动过程 在创建一个Eureka的Server项目工程中,第一步我们需要导入Eureka的Server依赖,如下图所示: 然后创建一个EurekaService的服务启动类,这里的关于eureka的yml配置文件我就不做过多说明,启动类如下图所示: 导入这个依赖之后,maven工程会下载如下所示的jar包,在截图之外的还有一些jar这里我就不做过多的截图了,今天分析Eureka的源码,那么我们只需要找出核心的jar即可,下...

2021-09-02 16:40:22 613

原创 设计模式之装饰者模式

一装饰者模式 装饰者模式:动态的将责任附加到对象身上。若要扩展,装饰者模式比继承更加有弹性。 装饰者模式秉承这一个开放,关闭原则。就是对扩展开放,对修改关闭,也就是说对该类可以做扩展,但是不可以修改该类的原始功能。二 装饰者模式的示例 这里我们列举一个奶茶店的例子。起初,这个奶茶店只卖普通茶。代码示例如下:先定义一个材料的接口:public abstract class Material { String desc; public ...

2021-08-24 18:56:20 105

原创 设计模式之观察者模式

一 观察者模式 观察者模式:针对于对象之间存在一对多的关系,当一的一方的状态发生改变的时候,通知多的那一方,一的那一方可以称作为主题,然后多的那一方便是订阅者。 举个例子:就像是一个微信公众号,每天会有消息推送的功能,有很多人去关注了,公众号就会向那些关注了的人发送消息,一旦取消订阅,这个公众号便不会再去向这个订阅者发送消息了。 由此可知,观察者模式主题一共包含两大部分,主题和订阅者。 主题:有三个主要的方法,分别是订阅,解除订阅,发布这3个功能。 ...

2021-08-24 16:10:49 94

原创 数据结构与算法之快速排序

/** 快速排序* 快速排序是基于划分的思想,就是将一个数组一分为2的目的来进行递归排序的。* 首先快速排序会选取一个基数,也就是比较的枢纽,一般选取数组的第一个或者最后一个数作为基数,这里我们以取第一个元素为例进行分析* 比如存在一个数组int a = {7,3,5,2,9,8,6,1,4,7};* 首先取出index为0的元素7,然后定义两个游标i = 1, j = a.length -1 = 9;* 先拿7和a[j](7)比较,7不大于a[j](7),那么j就往左移动一位(j...

2021-07-22 15:23:33 163

原创 数据结构与算法之希尔排序

/** 希尔排序* 希尔排序就是将一个数组按照分段因子来计算出最大分段数,将一个数组根据最大分段数进行分段,在分段元素中进行排序,然后依次减小分段数,直到分段数为1的时候,排序完便结束* 例如数组int[] a = {4,2,8,9,5,7,6,1,3,10,13}; 设置分段因子为3* 那么分段数的公式就为h = 3 * h +1. 可以得到分段数为1,4,13,40...。由于数组的最大长度是 11,最大分段数必须小于数组的长度,* 所以这里的最大分段数为4,针对于数组a,下面来分析...

2021-07-21 15:35:10 104

原创 数据结构与算法之归并排序

/** 递归之归并排序* 归并排序就是将两个有序的数组,合到一起,得到一个新的有序数组的过程* 算法分析:首先拿a的第一个元素跟b的第一个元素比较,a的大,那么把b的元素放到新的数组c上* 然后再拿a的第一个元素跟b的第二个元素比较,a的元素小,那么就把a的第一个元素放到数组c上* 依次类推:当组数a的所有元素都被放到c中时,可以直接把b中剩下的元素直接放到c中,反之同理*/public class RecursiveMerge { public static void...

2021-07-21 09:55:50 99

原创 数据结构与算法之递归之汉诺塔问题

/** 递归之汉诺塔问题* 汉诺塔问题是有三个柱子,分别是A,B,C然后有N个飞碟在柱子A上,需要将A的飞碟全部移动到C上,并且A柱子上的飞碟从高到低依次变大,* 移动的过程中,大的飞碟不能放在小的飞碟的上面。** 问题的解题思路:首先有N个飞碟,想要把A柱子中的飞碟移动到C上,那么必须先将N-1个飞碟先移动到B上,然后在把N-1个飞碟由B移动到A上* 由此可以得到数学公式f(N) = f(N-1) + 1 + f(N-1); (N>1) 第一个是f(N-1)是将飞碟由A-...

2021-07-20 17:49:04 154

原创 数据结构与算法之递归之递归二分法

/** 递归之二分查找* 二分查找就是在一个有序的数据中,先找到中间索引,取到中间索引的元素跟需要查找的元素对比,如果刚好相等,则返回该元素* 如果中间索引的元素大于需要查找的元素,然后再取出开始的节点到中间节点的元素的中间索引的元素进行对比。以次类推* 代码示例如下:*/public class RecursiveDichotomy { public static void main(String[] args) { Scanner sc = new Sca...

2021-07-20 16:08:15 368

原创 数据结构与算法之递归之变位字

/** 递归之变位字* 变位字就是一个字符串如"abcde",随意变换abcde的位置,看下一共有多少种情况。* 解题思路:根据数学里面的排列组合的算法,在字母不重复的情况下一个会有n!中排法,* n为字符串的长度,也就是字符串中的字母的个数,根据这个思路,首先定位第一个位置* 的元素,如:"abcde",第一个位置有5种情况:abcde五个字母中任意一个都可以排在* 第一位。第一位定了之后再确定第二位。以次类推,然后知道定位到最后一个字母,然后* 打印出得到的字符串即可* ...

2021-07-20 14:26:08 101

原创 数据结构与算法之递归之阶乘

/** 递归之阶乘* 阶乘就是整数n乘以n-1再乘以n-2依次乘下去,直到乘到1为止,用数据表示法就是n!* 阶乘分析:n*(n-1)*(n-2)*...*1通过表达式分析,可以设定一个表达式fun(n) = n*(n-1)*...*1 (n>2);* 那么f(n-1) = (n-1)*(n-2)*...*1;由此可以推出fun(n) = n * fun(n-1);* 所以我们只需要定义好fun函数。* 代码示例如下:*/public class RecursiveFa...

2021-07-20 14:11:13 703

原创 数据结构与算法之插入排序

/*** 插入排序* 插入排序就是将后面的元素跟前面的元素进行对比,直到找到第一个比它小的元素,然后将当前的元素插入到这个比它小的元素的后面然后,后面的元素后移一位。* 例如数组:int[] a = new int[]{3,5,1,6,4,7,10,9,6,3,2,8}* 索引为0的元素3,前面没有元素,所以默认其最小,不需要移。第二位元素5,发现前面一位3比5小。所以不需要移位,再后面的1发现前面的5比1大,然后1再跟前面1位* 3比较,发现3比1大,再往前比较,发现没有元素了,然后将...

2021-07-20 10:54:12 87

原创 数据结构与算法之选择排序

/*** 选择排序* 选择排序讲究的是每次将最小的数放到数组的最左边(第一位)* 每一次都是将前面的数与需要排序的第一位做比较,如果比第一位要小,那么就交换位置,然后接下来的数再跟第一位做比较。如果再小,做交换,否则就不变。* 例如数组:int[] a = new int[]{3,5,1,6,4,7,10,9,6,3,2,8}* 第一次先将3和5比较,3小于5,位置不变,然后再将3个1比较,3大于1,位置交换,然后再将1和6比较,1比6小位置不变,然后再将1和4比较,位置不变,* 然...

2021-07-19 13:33:11 107

原创 数据结构与算法之冒泡排序

/*** 冒泡排序* 冒泡排序讲究的是将左边的元素跟右边的元素做比较,如果左边的元素依次右边的元素要大,那么交换位置;否则位置不变,依次这样一直比较,每次比较结果都是将最大的元素放到最右边。* 例如数组int[] a = new int[]{3,5,1,6,4,7,10,9,6,3,2,8}* 首先取出元素3,然后5比较,3比5小,位置不变,然后再拿5和1比较,5比1大,然后交换位置,然后再拿5和6比较,5比6小,位置不变,然后再拿6和4比较,* 6比4大交换位置,然后再拿6和7比较,6...

2021-07-19 12:57:25 102

原创 mysql基础

一 Mysql的体系结构 mysql的体系结构从大的方向可以分为4个层次:网络连接层,服务层,存储引擎层,系统文件层。

2021-07-15 17:21:33 131

原创 JVM基础

一什么是JVM? JVM就是java虚拟机,java做为一个跨平台的语言

2021-06-08 15:40:42 359

原创 一个Java Class 对象的一生

一 JavaClass文件 java的class文件是java文件通过javac编译之后得到的jvm可执行的文件,以.class结尾的文件。二 Java Class 对象的生命周期

2021-05-21 17:54:35 109

原创 AQS

一 AQS的概念 AQS全称为AbstractQueuedSynchronizer(抽象排队同步器)。

2021-05-13 17:41:02 65

原创 Java的四大引用

java中存在四大引用:强引用,软引用,弱引用,虚引用。下面来分别介绍一下这些引用:一 强引用 在我们做java开发过程中,这种引用是最常见的,大部分的引用都是强引用。强引用是在引用没有结束时,引用对象是不会被回收的,当内存不够的时候会直接抛出内存溢出异常。我们常写的代码Object obj = new Object();这类代码所new出来的对象都属于强引用。代码示例如下://-Xms80m -Xmx80m -XX:+PrintGC//设置最小和最大堆内存大小都...

2021-05-07 17:39:16 312

原创 String深入浅出

一 String String是java中的一种引用数据类型,这种类型在实际应用开发中是最常见的数据类型之一。今天我们要讲解的是String的常量池以及String的intern()方法。话不多说,直接上代码。 在JDK1.8中的执行结果如下:package zd.stringtest;public class StringTest { public static void main(String[] args){ String a1 = "123";...

2021-04-29 15:37:40 75

原创 CAS

一CAS(Compare And Swape) CAS的意思就是比较并交换, CAS的代码示例如下 :package zd;import java.util.concurrent.atomic.AtomicInteger;public class ZDTest extends Thread{ static AtomicInteger autoInteger = new AtomicInteger(1); public static void main(St...

2021-04-21 18:06:17 173

原创 synchronized

一 synchronized的概念 synchronized是多线程中的同步锁,具有可重入性。被synchronized修饰的方法或者代码块会被加上同步锁,同步锁会消耗一定的性能。当synchrinized部分的代码执行结束,或者程序出现异常的时候锁也会被释放。二 synchronized的用法 1synchronied修饰非静态方法 synchronized修饰非静态方法的时候,该方法被称之为同步方法,作用的对象是调用该方法的对象。publ...

2021-04-07 17:58:02 205 1

原创 线程

一 :线程的概念 一个应用程序可以看作是一个进程,一个进程中可以有多个线程,线程是进程的最小执行单元,线程是为进程抢占CPU资源的。二 :创建线程的方式 1通过继承Thread的方式创建线程 通过继承Thread创建线程的方式如下:public class MyThread1 extends Thread{ /** * @param args */ public static void main(Stri...

2021-04-06 11:23:07 83

原创 设计模式之策略模式

一概念 策略模式:策略模式是将对象和行为拆分开来,然后行为可以归类到一类算法中,每一种行为实现同一个公共接口,然后在各自的行为类上去实现各自的接口。二 策略模式实战 策略模式示例如下: 策略模式的实现步骤一般是定义一个行为接口,然后让各种不同的行为去实现这个接口,然后由对象通过调用行为方法传入对应的行为,从而达到对实现该行为。 举个例子如下: 每个人都要吃饭,可能每...

2021-04-02 15:40:03 68

原创 设计模式之单例

一概念 单例模式:顾名思义就是只能实例化一个对象的设计模式。很多开发人员一听到单例模式,都会觉得很简单,对于这样的同学,我想问一下,你真的理解单例模式吗?单例模式有多少种写法?单例模式的DCL?DCL为啥需要需要用到valitile?等问题都理解么?作为一个程序员,咱话不多说,带着问题撸代码。...

2021-04-02 10:58:00 230 1

空空如也

空空如也

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

TA关注的人

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