自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

装饰器模式与继承关系的目的都是要扩展对象的功能,但是装饰器模式可以提供比继承更多的灵活性。通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。装饰器模式允许用户通过动态地给一个对象添加一些额外的职责来增加功能,就增加功能来说,装饰器模式相比生成子类更为灵活。装饰器模式(Decorator Pattern)是一种用于动态地给一个对象添加一些额外的职责的设计模式。装饰(Decorator)角色:持有一个指向构件对象的引用,并定义一个与抽象构件接口一致的接口。

2024-03-27 16:24:36 545

原创 设计模式之适配器模式

将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器。根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;经典案例:手机电源适配器,市电不能直接给手机充电,需要电源适配器转化后才能使用,适配器模式其实就是再套一层。目标抽象类:Target,该角色把其他类转换为我们期望的接口,可以是一个抽象类或接口,也可以是具体类。被适配者: Adaptee ,原有的接口,也是希望被适配的接口。

2024-03-26 16:08:00 558

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

观察者模式[1-5]:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。具体主题(Concrete Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。

2024-03-25 13:40:31 531

原创 设计模式之状态模式

不难看出,状态流转的过程使用了大量的if-else做判断,条件复杂或者状态太多时,条件判断语句会过于臃肿,可读性差,且不具备扩展性,维护难度也大。状态模式:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。环境类(Context)角色:也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换。抽象状态(State)角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为,可以有一个或多个行为。

2024-03-19 19:19:46 666

原创 设计模式之策略模式

抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。二是不符合迪米特法则,逻辑和各个支付接口高度耦合,这导致接口的改变将直接影响到代码的组织,使得代码的可维护性降低。策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换。具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。环境(Context)类:持有一个策略类的引用,最终给客户端调用。

2024-03-18 17:29:12 570

原创 java数据结构之二叉排序树

二叉排序树,查询效率比链表结构要高,特点是:若左子树不空,则左子树上所有结点的值均小于等于根节点的值,若右子树不空,则右子树上所有结点的值均大于等于根节点的值。

2024-01-21 15:24:27 336

原创 java基础算法之赫夫曼压缩算法

赫夫曼压缩算法属于可变字长编码(VLC)的一种,该算法的基本原理是将字符按权重生成赫夫曼树,特点是WPL(加权路径长度)最小,且保证权重大(出现次数多)的字符离根节点近。解压过程则是将压缩编码通过匹配赫夫曼编码表,得到原始数据。

2024-01-21 13:08:59 383

原创 java数据结构之赫夫曼树

其中,路径是从树中一个结点到另一个结点之间的分支构成,路径长度是路径上的分支数目,树的路径长度是从树根到每个结点的路径长度之和。结点的带权路径长度是从根结点到该结点之间的路径长度与该结点的权的乘积,而树的带权路径长度是树中所有叶子结点的带权路径长度之和。构造赫夫曼树的方法是采用赫夫曼算法,即根据给定的权值集合构造出对应的二叉树集合,然后从中选取两棵权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树根结点的权值之和,最后重复这一步骤,直到只剩下一棵树为止,这棵树便是赫夫曼树。

2024-01-20 17:51:35 395

原创 java基础算法之堆排序算法

堆排序是一种将顺序存储二叉树转化为大顶堆或者小顶堆的排序算法。顺序存储二叉树是一种特殊的二叉树存储方式,它将二叉树的节点按照一定的逻辑顺序存储在一个数组中,以便快速访问节点。大顶堆:父节点的值大于或等于其子节点的值的树,小顶堆:父节点的值小于或等于其子节点的值的树。

2024-01-19 00:43:33 327

原创 java数据结构之线索化二叉树

线索化二叉树,利用叶子结点的空指针,进行某种逻辑意义上的重排列,使其可以线性访问每一个节点,目的是为了不使用递归,达到快速访问二叉树节点的目的。

2024-01-18 14:15:48 308

原创 java数据结构之顺序存储二叉树

顺序 存储二叉树是指将二叉树的节点按照某种顺序存储在数组中,以便通过数组下标快速访问节点。

2024-01-18 00:08:40 310

原创 java数据结构之二叉树

二叉树是一种树形结构,是对链表的优化升级版本,有链表增删快的优点,同时也优化了查询的效率,二叉树每个节点最多有两个子节点,通常称为左子节点和右子节点。

2024-01-17 17:39:29 296

原创 java数据结构之哈希表

哈希表是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

2024-01-17 00:32:08 340

原创 java基础算法之斐波那契查找算法

斐波那契查找算法是一种利用黄金分割率改进的二分查找算法,利用斐波那契数组确定中间点和构造新的数组长度满足f[k],例如原组长为6,根据斐波那契数组则新组长为8,多余组长位补充最大值,满足 f[k] = f[k-1] + f[k-2] (n>=2),中间点下标为mid = low + f[k-1] -1。

2024-01-16 17:23:40 339

原创 java基础算法之插值查找算法

插值查找算法,是二分查找的优化版本,同样要求数组有序,可以减少递归次数,其核心思想是根据目标值和中间元素的差值来决定在数组的哪一半中继续查找。

2024-01-13 00:04:16 374

原创 java基础算法之二分查找算法

二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是目标值,则搜索过程结束;如果目标值大于或小于中间元素,则在数组大于或小于中间元素的那一半中查找,并且同样从中间元素开始比较。

2024-01-12 17:42:35 347

原创 java基础算法之基数排序算法

基数排序(桶排序)适用于非负整数,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较,典型的以空间换时间的 一种算法。

2024-01-12 15:10:57 397

原创 java基础算法之归并排序算法

归并排序的主要思想是先分再合,将待排序的序列分割成若干个子序列,对每个子序列进行排序,然后将有序的子序列合并成一个完全有序的序列。

2024-01-12 14:13:43 338

原创 java基础算法之快速排序算法

快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。

2024-01-12 01:18:14 352

原创 java基础算法之希尔排序算法

希尔排序的基本思想是:先将待排序的数组分组成多个待排子序列,然后对各个子序列分别进行排序,待到整个待排序的序列基本有序的时候,最后在对所有的元素进行一次排序。

2024-01-12 00:03:03 314 1

原创 java基础算法之插入排序算法

插入排序是一种简单直观的排序算法,其工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

2024-01-08 20:52:14 289 1

原创 java基础算法之选择排序算法

选择排序的基本思想是:在未排序的序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

2024-01-08 17:07:45 367 1

原创 java基础算法之冒泡排序算法

冒泡排序的基本思想是:对相邻的元素进行两两比较,顺序相反则进行交换,这样每一轮循环,最大(或最小)的元素会被交换到最后的位置。

2024-01-08 15:37:09 309 1

原创 java基础算法之递归算法

递归算法解决八皇后问题。

2024-01-07 18:44:36 374 1

原创 java数据结构之栈

【代码】java数据结构之栈。

2024-01-04 16:29:38 319 1

原创 jvm之类加载

类由类加载器加载,类的实例总是引用着代表这个类的Class对象,在Object中定义了getClass()方法返回代表类的Class对象引用,此外,所有的Java类都有一个静态属性class,引用代表这个类的Class对象。如果一个类加载器在接收到加载请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父类去完成,依次递归,知道父类加载器无法完成这个加载任务时,才会自己去加载,这样规定了类加载的顺序。加载是指将编译后的字节码文件加载到内存中,并构建出对应的Class实例。

2023-11-17 02:07:57 17

原创 java数据结构之链表

链表是一种链式存储的有序列表,以节点的方式来存储数据,每个节点包含数据域和指针域,在内存中不一定是连续存储的。链表插入数据有头插法和尾插法。

2023-11-07 16:57:48 22

原创 java数据结构之队列

队列是一个有序列表,可以用数组或者链表实现,遵循先进先出原则,先存入数据先取出,后存入后取出。

2023-11-07 16:50:41 26

原创 java数据结构之稀疏数组

【代码】java数据结构之稀疏数组。

2023-11-06 21:56:01 31

原创 SpringBoot的启动原理

7. 根据webApplicationType创建应用上下文,返回 AnnotationConfigServletWebServerApplicationContext。可以看出,SpringBoot的启动过程分为两步,第一步是创建 SpringApplication,第二部是执行 run 方法。1. 创建引导上下文,执行引导初始化器的initialize方法。4.调用监听器的starting 方法发布事件。14. 应用启动失败,发布应用失败事件。11. 发布应用启动事件。5. 保存命令行参数。

2023-11-04 16:19:21 98 3

原创 SpringBoot内置Tomcat启动过程与原理分析

当SpringBoot启动时会去加载 META-INF/spring/%s.imports 的 SPI 文件,将ServletWebServerFactoryAutoConfiguration,加入到容器中。当我们在SpringBoot中引入spring-boot-starter-web时,最终会引入spring-boot-autoconfigure。

2023-11-04 14:18:12 69 1

原创 为什么SpringBoot的jar可以直接运行?

Main-Class: org.springframework.boot.loader.JarLauncher 是jar包启动类,Start-Class: com.example.WebApplication 是本地项目的启动类。执行main方法,进入launch方法,传入launch方法;加入maven插件后,才会打包成一个可执行文件。

2023-11-04 13:12:00 29 1

原创 ReentrantReadWriteLock 源码解析

可以看到ReentrantReadWriteLock在读多写少的场景下的性能提升不是一点半点。ReentrantLock的增强版本,内部维护了一对读写锁,适用于读多写少的场景。可以进行锁降级,由写锁过渡到读锁,可以 增强数据的可见性,减少读锁阻塞的情况。带有锁饥饿的问题,一旦读操作比较多的时候,想要获取写锁就变得比较困难。

2023-11-01 18:46:19 20

原创 ReentrantLock 源码解析

可以看出,FairSync 和 NonfairSync 继承自 Sync 而又基于 AbstractQueuedSynchronizer实现逻辑。构造器支持公平锁和非公平锁的创建,默认为非公平锁,非公平锁可以减少线程切换浪费的资源,有助于提高执行效率。ReentrantLock实现了Lock接口 拥有了两个重要方法 lock() 和 unlock();ReentrantLock是一种支持公平锁和非公平锁的可重入锁,底层基于AQS实现。用于解决线程安全问题,使用比Synchronized更灵活。

2023-11-01 11:25:17 39

原创 Redis

Redis 是一个开源的 key-value 存储系统。存储的 value 类型包括 string (字符串)、list (链表)、set (集合)、zset (sorted set –有序集合) 和 hash(哈希类型)。这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。数据都是缓存在内存中。Redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。

2023-10-25 14:18:43 24 1

原创 JUC并发编程

Future异步接口(FutureTask实现类)定义了操作异步任务执行一些方法,如获取异步任务的执行结果、取消异步任务的执行、判断任务是否被取消、判断任务执行是否完毕等。FutureTask实现了Future 和 Runnable 接口,可以创建线程和操作线程,但是没有返回值。同时重写run方法去执行Callable 的call方法,FutureTask 将 Callable 构造注入。重写Future 接口的get方法获取返回值。

2023-10-24 22:56:29 29

原创 java基础之多线程

不能,调用run方法只是单纯的执行run方法体,而start方法会创建一个新的线程去执行run方法体。synchronized解决了线程的安全问题,但是synchronized是串行化执行的,相对无锁结构效率比较低。非静态同步方法的锁是this,静态同步方法的锁是当前类.class,考虑方法是否非静态来保证多个线程使用同一把锁。不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃 自己需要的同步资源,就形成了线程的死锁。结果:可以看出3和c并没有打印,死锁出现,处在一个僵持的状态。

2023-10-24 16:00:36 36

原创 java基础之网络编程

Internet 上的计算机(通信实体)的唯一的标识。

2023-10-22 14:03:15 32 1

原创 java基础之java 新特性(8-17)

有且仅有一个抽象方法的接口。实例化——>中间操作——>终止操作。

2023-10-20 20:46:52 128

空空如也

空空如也

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

TA关注的人

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