自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring Framework事件机制

Spring Boot自身并不直接提供一个内置的发布/订阅(Pub/Sub)消息模型实现,但是它通过集成Spring Framework的核心功能以及与外部消息中间件(如RabbitMQ、Kafka)的整合,间接支持了发布/订阅模式。Spring Framework中的事件机制提供了一种简单的发布/订阅模型,适用于应用内部的事件传播,而Spring Cloud Stream或Spring Integration等项目则扩展了这一能力,使其能够与外部消息中间件协同工作,实现更广泛的分布式发布/订阅场景。

2024-04-30 15:32:20 269 1

原创 函数式接口 Consumer、Function、Supplier、Predicate

在Java中,Consumer, Function, Supplier, 和 Predicate 是四个重要的函数式接口,它们都位于java.util.function包中,是Java 8引入以支持函数式编程风格的一部分。这些接口在Java 8引入的Stream API中发挥了重要作用,通过Lambda表达式,它们使得集合的处理变得更为简洁和强大。

2024-04-28 10:15:15 193 2

原创 函数式接口的应用场景

函数式接口正好提供了这样的类型,其唯一的抽象方法定义了Lambda表达式的参数类型、返回类型以及方法名称(尽管在使用时通常不需要关心方法名)。总结来说,函数式接口在Java编程中主要用于为Lambda表达式提供类型化上下文、支持集合流操作、事件处理、并行计算、测试等场景,极大地提升了代码的简洁性和可读性,促进了函数式编程风格在Java中的应用。在这段代码中,filter 方法接受一个 Predicate 函数式接口实例,通过Lambda表达式定义了一个长度大于5的单词筛选条件。

2024-04-26 18:06:26 349 2

原创 JDBC原理及示例

关闭数据库连接和资源:在使用完JDBC后,需要显式地关闭数据库连接和与数据库相关的资源。可以调用Connection对象的close()方法关闭连接,调用Statement对象和ResultSet对象的close()方法关闭资源。创建Statement对象:使用Connection对象的createStatement()方法或prepareStatement()方法创建Statement对象。加载JDBC驱动程序:在使用JDBC之前,需要使用Class.forName()方法加载数据库驱动程序。

2024-03-06 10:27:45 302

原创 死锁以及解决方案

每个进程都需要一组资源来执行其任务,这些资源可能是系统资源(如CPU、内存等)或其他进程所拥有的资源。当一个进程请求资源时,如果该资源已被另一个进程占用,那么当前进程将被阻塞,直到该资源被释放。如果两个线程同时开始执行,线程1先获取资源1,线程2先获取资源2,然后两个线程都等待对方释放资源,导致死锁。具体来说,死锁是指两个或多个进程无法继续执行,因为每个进程都在等待另一个进程释放资源,造成了循环等待的情况。认为死锁发生的概率极低,忽略死锁的发生,但一旦发生死锁,系统就会崩溃或重启。

2024-02-29 10:59:49 169 1

原创 单元测试之Power Mock

一、简介EasyMock、Mockito、jMock(单元测试模拟框架)在有这些模拟框架之前,程序员为了编写某一个函数的单元测试,必须进行十分繁琐的初始化工作,以确保调用的接口或编写的代码得到预期的结果。单元测试模拟框架极大的简化了单元测试的编写过程,在被测试代码需要调用某些接口的时候,直接模拟一个假的接口,并任意指定该接口的行为。这样就可以大大的提高单元测试的效率以及单元测试代码的可读性。**缺点:**都不可以实现对静态函数、构造函数、私有函数、Final函数以及系统函数的模拟,但是这些方法往往是

2022-03-20 21:47:26 3417 1

原创 Docker容器(一)

一、

2021-11-17 17:53:32 978

原创 为什么要使用Docker

一、环境配置的难题软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来?用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。如果某些老旧的模块与当前环境不兼容,那就麻烦了。开发者常常会说:“它在我的机器可以跑了”(It works on my machine),言下之意就是,其他机器很可能跑不了。环境

2021-11-17 10:30:59 397

原创 TCP协议

一、简介定义:传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议目的:互联网络与单个网络有很大的不同,因为互联网络的不同部分可能有截然不同的拓扑结构、带宽、延迟、数据包大小和其他参数。TCP的设计目标是能够动态地适应互联网络的这些特性,而且具备面对各种故障时的健壮性。二、主要功能当应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,TCP则把数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受该

2021-11-16 18:10:52 1147

原创 TCP/IP五层模型

一、OSI七层模型与TCP/IP五层模型1、OSI七层模型OSI的来源OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。 ISO为了更好的使网络应用更为普及,推出了OSI参考模型。其含义就是推荐所有公司使用这个规范来控制网络。这样所有公司都有相同的规范,就能互联了。OSI七层模型的划分OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即I

2021-11-16 11:47:34 126

原创 JVM(java虚拟机)

一、了解JVM1、什么是JVMJVM是Java Virtual Machine(Java虚拟机)的缩写,是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟计算机功能来实现的,JVM屏蔽了与具体操作系统平台相关的信息,Java程序只需生成在Java虚拟机上运行的字节码,就可以在多种平台上不加修改的运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。2、JRE/JDK/JVM是什么关系JRE(Java Runtime Environment):是Java运行环境,所有

2021-11-13 12:13:09 21046 3

原创 Executor框架(线程池的实现)

一、概念二、相关参数概念三、线程池类型

2021-11-11 18:34:56 1479 1

原创 线程创建方式

一、继承Thread类,重写run方法

2021-11-10 00:15:14 76

原创 进程、线程、多线程

进程:进程就是一个运行中的程序。线程:线程是进程中的一个执行单元。什么是多线程?多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。多线程的好处:可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。多线程的不利方面:线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;多线程需要协调和管理,所以需要CPU时间跟

2021-11-09 01:26:10 310

原创 拦截器、过滤器、监听器

一、过滤器Servlet中的过滤器Filter,它是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可以进行逻辑判断,如用户是否已经登录、有没有权限访问该页面等等工作,它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关的请求,只有当你的web应用停止

2021-11-01 11:10:43 490

原创 二分查找,二叉树,平衡二叉树,B树,B+树,B*树

一、二分查找(Binary search)用数组(数组必须是有序的)实现二分查找比如要查找551)找到数组下标0~9的中间下标4的值30,用30和55进行比较2)找到数组下标5~9的中间下标7的值48,用48和55进行比较3)找到数组下标8~9的中间下表8的值55,用55和55进行比较下标为8的值就是我们要找的值,总共进行了三次就找到了我们要查找的值,如果使用遍历的方式的话,我们需要进行九次才能找到55。时间复杂度遍历的时间复杂度为O(n)二分查找的时间复杂度为O(log2n)代码实现

2021-11-01 00:39:14 624

原创 springMVC

1、什么是Spring MVC?简单介绍下你对Spring MVC的理解?Spring MVC是一个实现了MVC设计模式的轻量级Web框架,通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。2、MVC是什么?MVC设计模式的好处有哪些mvc是一种设计模式(设计模式是开发中好的方法和经验的总结)。模型(model)-视图(view)-控制器(controller),三层架构的设计模式。用于实现前端页面的展现与后端

2021-10-29 09:54:13 209

原创 java中的四种代码块

普通代码块:类中方法的方法体构造代码块:构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行。静态代码块:用static{}包裹起来的代码片段,只会执行一次。静态代码块优先于构造块执行。同步代码块(同步代码块在这里不做讲解,详见同步代码块和同步方法的区别):使用synchronized(){}包裹起来的代码块,在多线程环境下,对共享数据的读写操作是需要互斥进行的,否则会导致数据的不一致性。同步代码块需要写在方法中。普通代码块、构造代码块、静态代码块示例及..

2021-10-19 21:00:33 106

原创 同步代码块、静态同步方法、非静态同步方法的区别

静态同步方法:静态同步方法的锁是当前类的字节码文件(类名.class);非静态同步方法:非静态同步方法的锁是this;同步代码块:同步代码块可以使用自定义的Object对象,也可以使用this或者当前类的字节码文件(类名.class);通过修改下面代码进行验证public class ClassLock { public static void main(String[] args) { ClassLock classLock1 = new ClassLock();

2021-10-19 20:59:36 468

原创 GIT(分布式版本控制系统)

一.Git简介git是分布式版本控制系统git命名:$ git config --global user.name “Your Name”$ git config --global user.email “[email protected]”初始化版本库:初始化:git init (在创建好的文件夹下执行)代码提交:git add ,注意,可反复多次使用,添加多个文件;git commit -m ,完成。查看项目分支和代码状态:$ git status6.查看

2021-10-19 00:37:10 95

原创 mysql数据库总结

1、数据引擎不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能(SHOW ENGINES查看mysql数据库所有引擎)。常用引擎有(InnoDB,Myisam,Memory)InnoDB跟Myisam的默认索引是B+tree,Memory的默认索引是hash区别:1.InnoDB支持事务,支持外键,支持行锁,写入数据时操作快,MySQL5.6版本以上才支持全文索引2.Myisam不支持事务。不支持外键,支持表锁,支持全文索引,读取数据快3

2021-10-18 23:06:01 173

原创 BigDecimal 总结

       Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用BigDecimal。       BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进

2021-10-13 19:31:13 1146 1

转载 JDK1.8中LocalDate和LocalDateTime常用方法总结

一、 LocalDateLocalDate now = LocalDate.now(); //当前时间int day = now.getDayOfYear(); //当前时间在所在年份的第几天DayOfWeek week = now.getDayOfWeek(); //当前时间是星期几(英文显示)int getDayOfMonth = now.getDayOfMonth(); //当前日期是当月的第几天Month getMonth = now.getMonth(); //当前月份(月份显示英文)

2021-10-13 11:24:10 4897

原创 jdk1.8中HashMap(数组+链表+红黑树)

1、构造方法:// 构造一个空的HashMap,具有默认的初始容量public HashMap() { // 负载系数,默认值是0.75f this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted}// 使用指定的初始值构造一个空的HashMappublic HashMap(int initialCapacity) { // 初始容量和负载系数 this(initialCap

2021-09-23 19:28:17 1326

原创 hashMap 中的 tableSizeFor()

tableSizeFor:(不考虑大于最大容量的情况)是返回大于输入参数且最近的2的整数次幂的数。比如10,则返回16。该算法源码如下:static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >&g

2021-09-23 16:38:34 334

原创 与运算(&)、或运算(|)、异或运算(^)

一、与运算符(&)运算规则:0&0=0;0&1=0;1&0=0;1&1=1; (两个同时为1,结果为1,否则为0)例如:3&5结果:0000 0011 & 0000 0101 = 0000 0001,因此:3&5 = 1二、或运算(|)运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1; (有一个为1,结果为1,否则为0)例如:3|5结果:00000011 | 0000 0101 = 00000

2021-09-16 18:44:03 6793

原创 23种设计模式

23种设计模式分为创建型模式(5种)、结构型模式(7种)、行为型模式(11种)创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。工厂方法(Factory Method)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。抽象工厂(Abstract

2021-09-07 19:14:58 192

原创 解释器模式(Interpreter Pattern)

解释器模式(Interpreter Pattern)优点:1、可扩展性比较好,灵活。2、增加了新的解释表达式的方式。3、易于实现简单方法。缺点:1、可利用场景比较少。2、对于复杂的文法比较难维护。3、解释器模式会引起类膨胀。4、解释器模式采用递归调用方法。例子:...

2021-09-07 19:14:10 165 1

原创 备忘录模式(Memento Pattern)

备忘录模式(保存一个对象的某个状态,以便在适当的时候恢复对象)优点1、提供了一种可以恢复状态的机制。可以使用户能够比较方便地回到某个历史的状态。2、实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。3、发起人不需要管理状态信息,所有状态信息都保存在备忘录中,并由管理者进行管理。缺点1、资源消耗大。如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。备忘录模式主要角色发起人:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其

2021-09-02 11:39:31 188

原创 访问者模式(Visitor Pattern)

访问者模式(Visitor Pattern)访问者(Visitor)模式是一种对象行为型模式,其主要优点如下。扩展性好。能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。复用性好。可以通过访问者来定义整个对象结构通用的功能,从而提高系统的复用程度。灵活性好。访问者模式将数据结构与作用于结构上的操作解耦,使得操作集合可相对自由地演化而不影响系统的数据结构。符合单一职责原则。访问者模式把相关的行为封装在一起,构成一个访问者,使每一个访问者的功能都比较单一。访问者(Visitor)

2021-08-31 19:12:34 440 1

原创 mysql安装配置

已有mysql安装包(安装包地址)第一步:新建my.ini文件在安装包的bin下新建my.ini文件(例如我的安装目录D:\tool\mysql-8.0.16-winx64\bin)[mysql]# 设置mysql客户端默认字符集default-character-set=utf8 [mysqld]#设置3306端口port = 3306 # 设置mysql的安装目录basedir=D:\tool\mysql-8.0.16-winx64 # 设置mysql数据库的数

2021-08-30 22:24:07 262

原创 list和set 中 contains()方法的效率

list.contains(o) :遍历集合所有元素,用每个元素和传入的元素进行 equals 比较,如果集合元素有 n 个,则会比较 n 次,所以时间复杂度为 O(n) 。方法源码如下:// ArrayList 中的方法public boolean contains(Object o) { return indexOf(o) >= 0;} public int indexOf(Object o) { if (o == null) { for .

2021-08-30 18:55:04 2121 1

原创 中介者模式(Mediator Pattern)

中介者模式(用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互)优点:1、降低了类的复杂度,将一对多转化成了一对一。2、各个类之间的解耦。3、符合迪米特原则。缺点:-中介者会庞大,变得复杂难以维护。...

2021-08-26 18:50:28 264

原创 责任链模式(Chain of Responsibility Pattern)

责任链模式(避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止)优点:1、将请求发送者和接收者解耦,发送者和接收者也无须拥有对方的明确信息。2、当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,动态地新增或者删除责任,增强了系统的可扩展性。3、避免了使用众多的 if 或者 if···else 语句。4、符合类的单一职责原则。缺点:1、请求没有明确的接收者,所

2021-08-24 15:22:40 797

原创 组合模式(Composite Pattern)

组合模式(Composite Pattern)组合模式分为透明组合模式和安全组合模式透明组合模式:抽象构件声明了所有子类中的全部方法,客户端无须区别树叶对象和树枝对象,对客户端来说是透明的。安全组合模式:将管理子构件的方法移到树枝构件中,抽象构件和树叶构件没有对子对象的管理方法,这样就避免了上一种方式的安全性问题。优点1、高层模块调用简单。2、节点自由增加。缺点1、设计较复杂,客户端需要花更多时间理清类之间的层次关系;2、不容易限制容器中的构件;3、不容易用继承的方法来增加构件的新功能

2021-08-23 17:00:05 377

原创 享元模式(Flyweight Pattern)

享元模式(运用共享技术有效的支持大量细粒度的对象)优点:大大减少对象的创建,降低系统的内存,使效率提高。缺点:提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。享元模式的定义提出了两个要求,细粒度和共享对象。因为要求细粒度,所以不可避免地会使对象数量多且性质相近,此时我们就将这些对象的信息分为两个部分:内部状态和外部状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同,是可以共享的。外蕴状态是不可以共享的,它

2021-08-21 02:04:31 403

原创 外观模式(Facade Pattern)

外观模式(为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式)优点1、子系统的变化不会影响调用它的客户类,降低了耦合度2、对客户屏蔽了子系统组件,客户调用起来更加容易,提高了灵活性和安全性。缺点1、增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。外观模式包含以下主要角色子系统角色:实现系统的部分功能,客户可以通过外观角色访问它。外观角色:为多个子系统对外提供一个共同的接口。客户角色:通过一个外观角色访问各个子系统的功能。外观模式的应用场景1

2021-08-20 01:35:40 241

原创 装饰器模式(Decorator Pattern)

装饰器模式(在不改变现有对象结构的情况下,动态扩展该对象的功能)优点:1、装饰类和被装饰类可以独立发展,不会相互耦合,2、装饰器是继承的有力补充,比继承更加灵活。3、装饰模式可以动态扩展一个实现类的功能。缺点:1、过度使用会增加许多子类,使程序比较复杂。装饰器模式主要包含以下角色抽象构件角色:定义一个抽象接口以规范准备接收附加责任的对象。具体构件角色:实现抽象构件,通过装饰角色为其添加一些职责。抽象装饰角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。具体装

2021-08-19 23:51:08 514

原创 桥接模式(Bridge Pattern)

桥接模式(将抽象与实现分离,使它们可以独立变化)桥接模式用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。优点:1、抽象与实现分离,扩展能力强。2、实现细节对客户透明。缺点:1、由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。桥接模式包含以下主要角色抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。扩展抽象化(Refined Abstraction)角

2021-08-18 11:41:24 137

原创 适配器模式(Adapter Pattern)

适配器模式(将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作)适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。优点1、可以让任何两个没有关联的类一起运行。2、复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。3、客户端通过适配器可以透明地调用目标接口缺点1、过多使用适配器会使系统代码变得凌乱,增加代码阅读难度,降低代码可读性。适配器

2021-08-17 16:35:41 270

空空如也

空空如也

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

TA关注的人

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