自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 设计模式——享元模式

享元模式(Flyweight Pattern) 也叫 蝇量模式:运用共享技术有效地支持大量细粒度的对象常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中有我们需要的则直接拿来用,避免重新创建,如果没有我们需要的,则创建一个享元模式能够解决重复对象的内存浪费的问题,当系统中有大量相似对象,需要缓冲池时。不需总是创建新对象,可以从缓冲池里拿。

2024-08-21 17:45:02 686

原创 设计模式——外观模式

外观模式(Facade),也叫“过程模式:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性外观模式对客户端与子系统的耦合关系-解耦,让子系统内部的模块更易维护和扩展通过合理的使用外观模式,可以帮我们更好的划分访问的层次。

2024-08-13 16:07:04 535

原创 设计模式——组合模式

对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可以对叶子节点进行相关的操作。可以将这颗树理解成一个大的容器,容器里面包含很多的成员对象,这些成员对象即可是容器对象也可以是叶子对象。但是由于容器对象和叶子对象在功能上面的区别,使得我们在使用的过程中必须要区分容器对象和叶子对象,但是这样就会给客户带来不必要的麻烦,作为客户而已,它始终希望能够一致的对待容器对象和叶子对象。

2024-08-01 15:28:55 565

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

装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)这里提到的动态的将新功能附加到对象和 ocp 原则。

2024-07-16 16:26:30 753

原创 设计模式——桥接模式

现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系:我们可以发现有很多的类,假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类。试想,在一个有多种可能会变化的维度的系统中,用继承方式会造成类爆炸,扩展起来不灵活。每次在一个维度上新增一个具体实现都要增加多个子类。为了更加灵活的设计系统,我们此时可以考虑使用桥接模式。定义:将抽象与实现分离,使它们可以独立变化。

2024-07-16 14:31:18 776

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

适配器模式(Adapter Pattem)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)适配器模式属于结构型模式主要分为三类:类适配器模式、对象适配器模式、接口适配器模式基本介绍:Adapter类,通过继承 src 类,实现dst 类接口,完成src->dst 的适配。

2024-07-11 15:27:36 901

原创 设计模式——建造者模式

建造者模式(Builder Pattern)又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。建造者模式 是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们.用户不需要知道内部的具体构建细节。

2024-07-10 16:03:30 1082

原创 设计模式——原型模式

原型模式(Prototype 模式)是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,无需知道如何创建的细节工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建,即 对象.clone()形象的理解:孙大圣拔出猴毛,变出其它孙大圣用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。

2024-07-09 17:10:02 1008

原创 设计模式——工厂模式

优点是比较好理解,简单易操作。缺点是违反了设计模式的 ocp 原则,即对扩展开放,对修改关闭。即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码比如我们这时要新增加一个新的实现类,需要修改源代码现有3个类,分别是Coffee、AmericanCoffee、LatteCoffeeCoffee类System.out.println("Coffee加糖");System.out.println("Coffee加奶");@Override。

2024-07-08 17:35:39 858 1

原创 设计模式——单例设计模式

单例模式保证了 系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用 new单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session 工厂等)

2024-07-05 17:38:05 729

原创 Java系统操作日志之数据修改变化记录

如果你想优雅的设计操作日志模块,请参考美团设计的操作日志模块真的,阅读后感觉,优雅、实在是优雅至极。其实把前后两个对象转为map或者json都是可以的,大家都可以试试公司这个记录操作日志功能是没有用到切面的。

2023-11-07 10:58:27 874

原创 Java查询ElasticSearch8.2.0文档

所谓的地理坐标查询,其实就是根据经纬度查询,官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-queries.html。附近查询,也叫做距离查询(geo_distance):查询到指定中心点小于某个距离值的所有文档。比如做价格范围过滤。两个点的坐标,然后画出一个矩形,落在该矩形内的都是符合条件的点。因为精确查询的字段搜是不分词的字段,因此查询的条件也必须是。这种并不符合“附近的人”这样的需求,所以我们就不做了。

2023-05-31 22:56:12 1794

原创 Java操作ElasticSearch8.2.0文档(二)

不知道怎么建索引的请跳转上一篇文章。

2023-05-28 20:31:25 522

原创 Java操作ElasticSearch8.2.0索引库(一)

因为ElasticSearch8开始就有了登录校验,所以在Java操作时需要登录用户名和密码才能进行操作!

2023-05-28 20:28:09 1154

原创 Spring Security(新版本)实现权限认证与授权

Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 Spring 家族中的成员。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。正如你可能知道的关于安全方面的两个核心功能是认证和授权,一般来说,Web 应用的安全性包括**用户认证(Authentication)和用户授权(Authorization)**两个部分,这两点也是 SpringSecurity 重要核心功能。

2023-02-02 09:57:56 39224 47

原创 JWT低阶入门

JWT是JSON Web Token的缩写,即JSON Web令牌,是一种自包含令牌。是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录上。JWT最重要的作用就是对 token信息的防伪作用。JWT头、有效载荷、签名哈希最后由这三者组合进行base64url编码得到JWT典型的,一个JWT看起来如下图:该对象为一个很长的字符串,字符之间通过"."分隔符分为三个子串。

2022-12-15 10:55:59 786 2

原创 Java单表实现评论回复功能

评论功能有多种实现方式:单层型:套娃型:两层型:这个地方有个answer_id 很容易让人迷糊:是回复哪个用户的id4.实体类5.实现思路因为有评论区有两层,所以肯定有一个parent_id,这样你才能知道你是哪个评论下面的回复内容,如果继续评论,那么那条评论的parent_id还是之前那条评论的parent_id,而不是那条子评论的id。回复内容也同样是一个评论实体类,只不过是一个集合,所以用List 存储,泛型使用实体类我的功能实现也用到了父评论的用户名和头像,这样可以更好看出这是

2022-12-02 16:31:33 5927 208

原创 Redis消息队列

使用队列的好处在于解耦:所谓解耦,举一个生活中的例子就是:快递员(生产者)把快递放到快递柜里边(Message Queue)去,我们(消费者)从快递柜里边去拿东西,这就是一个异步,如果耦合,那么这个快递员相当于直接把快递交给你,这事固然好,但是万一你不在家,那么快递员就会一直等你,这就浪费了快递员的时间,所以这种思想在我们日常开发中,是非常有必要的。不过要注意的是,当队列中没有消息时RPOP或LPOP操作会返回null,并不像JVM的阻塞队列那样会阻塞并等待消息。

2022-11-19 13:50:09 696

原创 Java中JavaBean对象和Map的互相转换

这篇博客是通过反射进行实现转换的在学习redis中,发现了一个知识点,就是Java对象转map,视频中的内容是通过hutool工具转换的,但是我们学习者肯定不能只通过工具来进行转换,更多的是通过这个知识点学习到他的底层是如何进行转换的。就是通过自定义注解来判断是否需要递归转换嵌套的话,应该还有其他方法可以研究一下在实际项目中相信大多数人都使用过工具类,比如说commons下的和hutool工具类,但是我们只是知道如何调用这个API,而不知道他方法的底层是通过什么样的思路进行实现的。

2022-11-09 20:02:04 2489

原创 如何在Vue+ElementUI项目中使用iconfont图标库

iconfont官网iconfont中有许多样式的图标可以给我们使用。什么是SVG格式?SVG是一种图形文件格式,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形。它是基于XML(Extensible Markup Language),由World Wide Web Consortium(W3C)联盟进行开发的。严格来说应该是一种开放标准的矢量图形语言,可让你设计激动人心的、高分辨率的Web图形页面。

2022-10-24 12:57:11 5934 2

原创 SpringBoot+Vue+ElementUI实现头像上传

文件上传不难,关键点在前端接收文件,然后将文件传给后端,后端将文件通过流的方式下载到指定的位置。稍微难一点的地方就是图片回显,只需要将本地的路径返回给前端就行通过file:/文件路径,的方式进行一个图片的回显。

2022-10-12 19:07:39 3037 6

原创 SpringBoot+Vue+ElementUI实现导入和导出

,所以我们可以使用@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”)把他的格式转换一下。在进行文件通过浏览器下载的时候,后端传给前端一个文件名,文件名是中文的,会出现乱码,是如何解决的呢?// 构造一个blob对象来处理数据,并设置文件类型。难点在于excel中数据的格式,在转换中可能会报错。//创建新的URL表示指定的blob对象。因为前端代码太多了,只整些核心关键代码。"上传的文件格式不对吧,亲!"上传的文件不能大于10M!浏览器下载最主要的一部分代码。

2022-09-28 11:42:51 2541

原创 Java实现哈希表(散列)

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

2022-09-24 13:32:44 652

原创 SpringBoot整合验证码easy-captcha(含有gif验证码)

Java图形验证码,支持gif、中文、算术等类型,可用于Java Web、JavaSE等项目。4.代码实现4.1 gif验证码实现(动态验证码实现)4.1.1 在SpringBoot项目的Controller中进行编写这里的R是返回实体类4.1.2 前端编写核心代码因为前端使用的是vue索引只是截取部分代码。4.1.3 结果显示因为他是gif所以会动5.验证码格式设置5.1 验证码六种组成类型类型描述TYPE_DEFAULT数字和字母混合TYPE_ON

2022-09-23 15:22:46 851

原创 Git简单常用操作

本地初始化的git仓库才需要添加远程仓库,因为本地初始化的仓库没有关联远程仓库。

2022-09-23 13:23:08 616

原创 Java实现二分查找、插值查找(遍历查找,递归查找)

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。插值查找,有序表的一种查找方式。插值查找是根据查找关键字与查找表中最大最小记录关键字比较后的查找方法。插值查找基于二分查找,将查找点的选择改进为自适应选择,提高查找效率。插值查找在二分查找进行优化,记住公式就行。

2022-09-23 10:46:09 667

原创 Java POI操作excel

操作Excel目前比较流行的就是Apache POI和阿里巴巴的easyExcel!开发中经常会设计到excel的处理,如导出Excel,导入Excel到数据库中!2、将Excel表中的信息录入到网站数据库(习题上传…使用的对象不一样,但是因为多态的,代码可以不用变化太大。1、将用户信息导出为excel表格(导出数据…

2022-09-14 11:26:30 2208

原创 函数式接口

​ 函数式接口:有且仅有一个抽象方法的接口​ Java中的函数式编程体现就是Lambda表达式,所以函数式接口就是适用于Lambda使用的接口​ 只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利进行推导​ JDK的函数式接口上都有@FunctionalInterface注解标识。

2022-09-13 22:53:08 537

原创 Optional

​ Optional是Java8的新特性Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。Optional 类的引入很好的解决空指针异常。

2022-09-13 22:51:24 495

原创 Stream流

Stream是Java8API的新成员,它允许以声明性方式处理数据集合。代码简洁函数式编程写出的代码简洁且意图明确,使用stream接口让你从此告别for循环。多核友好:Java函数式编程使得编写并行程序从未如此简单,你需要的全部就是调用一下方法。

2022-09-13 22:50:20 756

原创 JDK8函数式编程

​ 因为Java的发展在进步,就比如说可以简化代码,一些for循环里面你还有套娃,写出来的代码就显得非常厚重,其次就是ES(ElasticSearch)、reactive(响应式)等等,都用到了函数式编程,所以有什么理由不学呢?百度百科:Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包。

2022-09-13 22:46:55 210

原创 Java实现常用的排序算法(快速排序、归并排序、基数排序)

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。快速排序又是一种分而治之思想在排序算法上的典型应用。

2022-09-13 12:53:35 894

原创 Java实现常用的排序算法(冒泡排序、选择排序、插入排序、希尔排序)

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。选择排序(Selection sort)是一种简单直观的排序算法。

2022-09-09 23:09:47 482

原创 SpringBoot配置Swagger3,解决报错信息

swagger3配置SpringBoot高版本会出现错误,只需要在yml配置中加入配置swagger3默认的访问地址是 http://localhost:8080/sky/swagger-ui/ 改了他的样式后,访问的地址是 http://localhost:8080/sky/doc.html。

2022-09-07 13:51:15 2770

原创 SpringBoot中AOP

AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。白话(自我理解):就是对符合切入点表示的方法进行功能扩展。

2022-09-06 13:58:50 2980

原创 SpringBoot 自定义注解 + SpringBoot Aop 实现切面日志处理

思考为什么需要自定义注解和AOP简介自定义注解SpringAOP简介自定义注解定义规则实战1.先导入springboot aop的包2.编写自定义注解3.编写切面处理类4.将自定义注解写在连接点总结​ 项目中常常要打印日志,尤其是在做接口开发中,因为要面临着对前台数据的检查。​ 这里我们使用的是自定义注解+AOP的方式实现日志注解是一种能被添加到java代码中的元数据(python中的函数装饰器),类、方法、参数、变量和包都可以用注解来修饰。用来定义一个类、属性或者一些方法,以便程序能被捕译处理。

2022-09-05 16:57:33 1229

原创 Java递归实现迷宫问题和八皇后

问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。当一个方法执行完毕,或者遇到 return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。简单来说:递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。

2022-09-01 21:35:01 530

原创 Java实现中缀表达式转后缀表达式

逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后)在实现中缀转后缀之前我们先了解后缀表达式的实现,学习过编译原理这门的课程的同学,应该对逆波兰式非常的熟悉哈,没错他就是后缀表达式。...

2022-08-30 15:38:13 1323

原创 Java环形链表实现约瑟夫环问题

约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。

2022-08-28 16:51:21 401

原创 Java用栈实现表达式求值

当减号之前和会进行一个比对,当入栈的符号栈小于栈顶的优先级时,符号栈栈顶的运算符会和数字栈顶的两个元素进行运算,将运算结果放入数字栈顶。数字入栈发现入栈的是12字符串,因为12是一个数字,我们不能把他分开所以就必须将连续的数字拼接一起。大家学过数学的都知道*(乘法的优先级大于加法)所以应该先算3*3。...

2022-08-16 09:34:42 761 5

空空如也

空空如也

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

TA关注的人

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