- 博客(60)
- 收藏
- 关注
原创 HashMap解读
HashMap ,是一种散列表,用于存储 key-value 键值对的数据结构,一般翻译为“哈希表”,提供平均时间复杂度为 O(1) 的、基于 key 级别的 get/put 等操作。哈希表结构为数组,链表和红黑树。如图哈希表渴望实现O1的查找时间复杂度,因此采用数组作为基础结构,通过哈希函数,计算key的哈希值,哈希表指示存储数组的下标,但是会出现不同key对应同一个哈希值,则称作哈希碰撞,采取拉链法解决,将同一下标的所有节点链接为链表。但是当链表长度过长,hash表便也失去了平均o1的特性。因此在一定条
2023-01-01 14:09:47 1728 2
原创 二叉树之红黑树
3节点:包含两个元素,三个子节点引用,左边节点小于第一个父节点,中间节点大于第一个小于第二个父节点,右边节点大于第二个父亲节点。检查2,3节点是否正确的一个有效方法是,节点全部投影到x轴此时为有序序列,如4,5,6和3,5,7,9,10。左旋:以某个节点作为旋转节点,其右子节点变为旋转节点的父亲节点,右子节点的左节点变为旋转节点的右子节点。右旋:以某个节点作为旋转节点,其左子节点变为旋转节点的父亲节点,左子节点的右节点变为旋转节点的左子节点。子3节点分解得到的父节点,融入到父3节点,父3节点再次分解。
2022-12-30 22:50:13 1237
原创 mysql之索引
B+树是平衡搜索树。一般高三层。节点分为内部节点和叶子节点两种,所有内部节点都是叶节点的副本。B树区别于B+树,B树所有节点都存储记录值。B+树聚集索引为主键索引,以主键的值作为键,在第三层存储着所有记录非聚集索引以建立索引的所有值为键,在第三层存储着主键值,查询非聚集索引获取记录需要进行回表查询主键的B+树获取记录。如果只是查询并且条件中只包括非聚集索引,那么则称之为覆盖索引,不需要进行回表。
2022-12-29 22:47:38 240
原创 mysql行列转换
tips:虽然笔者明白使用group操作除了分组使用的字段其他字段都需要使用聚合函数,但是却误以为此时聚合函数不生效,其实是生效的,只不过没有同一id,store的情况下,有多个price的值。此时我再添加在此环境下一个实际上不可能的记录,完成验证。因此,在列传行情况下可以使用不同的聚合函数,sum,min,max都可以,结合需求的需要使用。操作,使用group分组并且匹配属性与属性值。操作:分别查询每行不同列的值取别名后求并集。
2022-12-24 23:31:03 166
原创 从优先队列到实现堆排序
优先队列即为堆,使用二叉树的结构维护节点与子节点的关系,从而维护根与后续除了根的其他节点的关系,根为最值节点。可以表达为 根 “大于” 直接子代, 直接子代 “大于” 直接子代的子代 ,相当于第一层节点大于第二层节点,第二层大于第三层…从而第一层大于所有层。节点是以完全二叉树的形式存储。我们使用数组模拟二叉树的结构,因此父亲节点与子代节点存在关系为“父节点下标*2* + 1= 左节点下标 父节点下标*2* + 2= 右节点下标 ”
2022-11-07 21:45:16 349
原创 简单的权限验证
如果采用spring家族进行后端开发,想要实现多用户多权限很容易联想到spring security,shiro两大常见框架,但是两者都有一定的学习成本,并且由于兼容了很多设计模式的思想,源码很复杂,短时间不容易上手。那么,我们能不能通过一些java基础知识实现呢?因此本文使用。
2022-11-01 22:09:06 914
原创 使用easyexcel进行excel的导入和导出(web)
使用easyexcel进行excel的导入和导出(web)前言:使用springboot,mybatis,excel3.x.x,通用mapper。本文主要演示怎么使用easyexcel,因此先展示效果图,方便读者判断本文是否是自己需要的。源码demo在文末,需要者自取。导出excel导入excel现在正式演示怎么使用easyexcel进行excel的导入导出。1.准备工作导入依赖<dependency> <groupId>com.alib
2022-04-29 23:47:08 5747
原创 无框架开发登录接口
无框架开发登录接口前言:最近在社团里面引导新生怎么去开发后端接口,所以我自己手敲了一个简单的登录接口,通过一个接口例子来演示怎么规范开发一个接口。不使用spring,mabatis等框架,以几乎原始的方式开发,引入几个必须的依赖。代码只给出核心代码,源代码给出网盘链接需要者自取。首先是创建maven项目,在pom.xml中导入servlet,jdbc,junit,json四个依赖。 <dependencies> <!--测试--> <dependency
2022-04-25 20:52:57 2721 2
原创 享元模式.
享元模式定义:运用共享技术有效的支持大量细粒度的对象举一个常见运用享元模式的例子,在博客平台上每个人都可以注册拥有一个自己的博客,那么博客平台是否为我们每个人都生成不同的博客文章表呢,我们的用户信息是否是存放在一起的呢?答案是是的。我们个人博客上有很多相似之处,博客都发文章,博客界面也是类似,不同的是文章里面的内容。在享元模式中,共享代码称作享元对象,享元对象内部并且不会随着环境的改变而改变的状态称作内在状态,而我们每个人的博客账号又是不同的,登录不同的账号获取的昵称是不同的,这部分账号信息则不是共享的
2022-04-22 21:40:59 315
原创 中介者模式
中介者模式定义:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以改变他们之间的交互。比方说,甲和乙沟通交流,甲乙之间是直接交流,但是交流对象并不局限于两者之间,可以扩展为一人与多人对话,如此交互对象类之间则形成强耦合,改善方法则是,新建一个中介者,把交互行为转移到中介者类UML类图使用示例Mediator 抽象中介者DemoMediator 具体中介者User 抽象交互者DemoUser DemoUser1 具体交互者中介
2022-04-22 20:12:44 352
原创 职责链模式
职责链模式定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止怎么实现呢?处理者拥有同样的处理行为即可,严格意义上说是方法名相同,而方法处理不相同,另外可以设置后继处理者。后继处理者不在声明时设置,有利于更好的扩展。区别于工厂模式,此模式是依次传递,而非跳跃传递/** * @author 州牧 * @description * @since 2022-04-07 21:17 */public ab
2022-04-07 21:36:47 382
原创 JUL日志框架的基本使用和运行流程
JUL日志框架的基本使用和运行流程JUL全称Java util Logging是java原生的日志框架,使用时不需要另外引用第三方类库,相对其他日志框架使用方便,学习简单,能够在小型应用中灵活使用。在JUL中有以下组件:Loggers:被称为记录器,应用程序通过获取Logger对象,调用其API来发布日志信息。Logger 通常时应用程序访问日志系统的入口程序。Appenders:也被称为Handlers,每个Logger都会关联一组Handlers,Logger会将日志交给关联 Handlers
2022-04-07 13:12:43 625
原创 命令模式(java)
命令模式定义:将请求封装为对象,从而可以不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。作用1.设计一个命令队列2.记录日志3.允许接收请求的一方否决请求4.容易地实现对请求的撤销和重做5.方便增加具体命令类,具体操作类命令模式的实现需要三部分:命令部分,通知部分,执行部分。命令部分对应不同的请求,执行部分对应不同的命令,通知部分对命令进行收集,排队,撤销,通知执行。命令模式是为了解决请求与执行部分的紧耦合,这不方便对请求做记录,排队,操作。实现命令部分
2022-04-05 16:27:47 966
原创 桥接模式(java)
桥接模式定义:将抽象部分与它的实现部分分离,是它们可以独立变化。怎么理解呢?举个例子,不同的手机品牌商可能会有不同的软件的实现,比如安卓手机和果子手机的软件就有不同。那么我们可以有两种角度划分架构但是我们如果想要增加一个品牌和一个软件需要增加大量类去实现。实现系统有多角度的,每种角度的分类的都可能变化,那么我们可以把这些角度分离出来,让它们独立变化,减少它们之间的耦合。上面的例子可以演化成如此,增加一个品牌或者增加一个软件都只需要增加一个类。由此,介绍设计模式的一个原则,合成/聚合复用原则——
2022-03-27 21:30:51 944
原创 动手实现一个简单的CS模型(仿照tomcat)
动手实现一个简单的BS模型(仿照tomcat)Tomcat 服务器是Web 应用服务器,浏览器则可看作web应用客户端。客户端与服务端是通过点对点的socket通信,在http协议规范下进行的。http协议分为请求部分和响应部分请求部分格式请求行 : 请求方法 请求路径 http协议及版本请求头 : 键值对请求空行 请求体 : get方法无,post方法有例子:GET / HTTP/1.1Host: www.baidu.com...响应部分格式响应行 http协议及版
2022-03-26 22:56:46 630
原创 单例模式(设计模式)
单例模式定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点主要有两种单例模式的写法懒汉式懒汉式定义:第一次被引用的时候才会将自己实例化懒汉式写法又分为线程安全的和线程不安全的写法。线程不安全写法/** * @author 州牧 * @description 线程不安全 * @since 2022-03-26 16:03 */public class Singleton1 { private static Singleton1 singleton; priva
2022-03-26 16:44:16 669
原创 迭代器模式
迭代器模式定义:提供一种方法顺序访问一个聚合对象种各个元素,而又不暴露该对象的内部表示。使用场景:需要访问一个聚集对象,不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式或者是需要用多种方式遍历时。优点:分离了集合对象的遍历行为,抽象出一个迭代器类来负责,不暴露集合的内部结构而让外部代码透明的访问集合内部的数据。怎么使用迭代部分:抽象迭代器类定义迭代方法,不同具体迭代器类有不同实现方法聚集部分:抽象聚集类定义创建迭代器方法,不同具体聚集类有不同的管理聚集对象的方法抽象聚集类/**
2022-03-25 19:21:14 2807
原创 组合模式(设计模式)
组合模式什么是组合模式?将对象组合成树形结构以表示部分-整体 的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性使用场景需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合对象时抽象实现三部分:一部分制定公共行为与管理子代接口,一部分是单体实现接口,一部分是组合体实现接口/** * @author 州牧 * @description 对象声明接口,定义对象的默认行为,声明一个接口用于访问和管理Component * * 为了可
2022-03-24 23:32:20 587
原创 备忘录模式
备忘录模式适用场景:适用于需要维护或记录属性历史的类,或者需要保存的属性只是众多属性的一部分。怎么使用备忘录模式?一共需要三种类:一部分类是信息类,一部分类是备份信息类,一部分是管理信息类。下面通过一个例子来使用备忘录模式首先是信息类,信息类中内置备份信息类,为了起示范作用,这里展示一个类的情况。备份信息类备份信息是自定义,可备份信息类的全部属性,也可备份部分属性。/** * @author 州牧 * @description 内置一个Memento对象备份此时的状态 * @since 2
2022-03-23 20:56:48 220
原创 mysql事务隔离级别及读问题的介绍
事务的四大隔离级别序列化(SERIALIZABLE):如果隔离级别为序列化,则用户之间通过一个接一个顺序地执行当前的事务,这种隔离级别提供了事务之间最大限度的隔离可重复读(REPEATABLE READ):在可重复读在这一隔离级别上,事务不会被看成是一个序列。不过,当前正在执行事务的变化仍然不能被外部看到,也就是说,如果用户在另外一个事务中执行同条 SELECT 语句数次,结果总是相同的。(因为正在执行的事务所产生的数据变化不能被外部看到)。mysql默认事务隔离级别提交读(READ COMMITTE
2022-03-20 21:55:10 801
原创 几个简单使用nginx的例子---一代
几个简单使用nginx的例子—一代前言:本人主攻后端,简单了解运维,如有错误,请您指正云服务器安装nginx安装nginx所需依赖yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel解压nginx 在/usr/src目录会解压到/usr/local中tar –xvf pcre-8.37.tar.gz编译./configuremake && make install...常用命令
2022-02-06 21:39:39 1659
原创 docker入门
docker入门安装docker# 1、yum 包更新到最新 yum update# 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 yum install -y yum-utils device-mapper-persistent-data lvm2# 3、 设置yum源yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/lin
2022-01-30 19:16:02 1749
原创 适配器模式
适配器模式为什么需要适配器模式?适配器模式是一种“亡羊补牢”的模式,它在程序设计初期不应该被使用。适配器模式使用于有两种不兼容的接口,添加一个适配器类,使得一种接口可以被另一种接口所适用。广泛用于软件维护和适配第三方接口。什么是适配器模式?将一个类的接口转换成客户希望的另一种接口,适配器模式使得由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式的抽象实现uml图逻辑说明我们想要通过Target类来使用到Adaptee类中的特殊请求方法,我们无法修改target和adaptee代码
2022-01-26 21:45:27 164
原创 设计模式之状态模式
状态模式为什么需要状态模式?一个类中有过于复杂的判断逻辑,判断的分支过多意味着这个类“职责”过多,要进行修改局部逻辑代码是在整个类上进行修改,显然这不是我们所期望的什么是状态模式?将条件判断表达式枚举出作为状态类,将状态的判断逻辑转移到表示不同状态的一系列类中,如此,便做到将与特定状态相关的行为局部化,并且将不同状态的行为分隔开,要修改逻辑时,此时便做到是局部的修改,而非全局的修改,也减少了逻辑相互间的依赖状态模式的抽象实现逻辑说明:具体的不同状态类代表着不同的状态(条件表达式),为了可插装所以
2022-01-24 21:25:55 79
原创 抽象工厂模式
抽象工厂模式为什么需要工厂模式?用于实现业务层与数据层进行解耦,比如,一个项目此时使用的是oracle,现在要修改成mysql,如果运用此模式则只需要修改一次程序代码(即初始化工厂代码)。什么是抽象工厂模式?提供一个创建一系列相关的或相互依赖抽象的接口,而无需指定它们具体的类。抽象工厂模式的抽象实现uml图逻辑说明抽象工厂接口(AbstractFactory)中定义了创建两种产品的方法,两个不同的具体工厂类(代表不同的数据库管理系统)实现抽象工厂中的接口,不同的工厂类重写该方法对应于不同的
2022-01-22 23:29:39 802
原创 观察者模式
观察者模式为什么需要观察者模式?一个对象的改变需要同时改变其他对象的模式(不知道需要具体改变多少对象)。一个系统被分割成一系列相互协助的类,我们需要维护对象的一致性,也就是改变某个对象的时候需要改变其他对象,我们不希望为了维护一致性而使各类紧密耦合。什么是观察者模式?观察者模式可以抽象成,自变量对象即通知者,因变量对象即观察者,两者之间不依赖于具体的对象,而是依赖于抽象,依赖于接口。自变量与因变量是一对多的关系。这个一对多的“多”不仅仅是同一类型,而是不同类型的观察者,这里只举同一类型的例子。观
2022-01-21 23:08:53 411
原创 建造者模式
建造者模式为什么需要建造者模式?创建复杂对象,这些对象内部构建间的建造顺序通常是稳定的,但是对象内部的构建通常面临着复杂的变化。使用建造者模式使得建造代码与表示类型代码相分离,需要改变一个产品的类型,只需要再定义一个具体的建造者即可。什么是建造者模式?将一个复杂对象的构建与它的表示相分离,使得同样的创建方式可以生成不同类型的对象。建造者模式的抽象实现逻辑说明:建造者类中定义了产品类有哪几个部分,具体的建造者类实现方法去生成同一部分的不同形态,指挥者类确保每个部分可按照顺序装配部分。产品类p
2022-01-20 23:15:34 294
原创 设计模式之外观模式
外观模式为什么需要外观模式?一个类A需要使用多个复杂的类,且类A也有多个实例,此时则可以生成一个类B,在类B中使用多个类,类A调用类B来调用多个类什么是外观模式?为子系统的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用外观模式的抽象实现逻辑说明:首先是多个系统类SystemClass1,SystemClass2…,外观类中需要使用多个系统类的方法,因此外观类成员有多个系统类,在客户端类中调用外观类的方法,等效于直接在客户端类中调用多个系统类UML图
2022-01-04 16:25:51 282
原创 图形用户界面编程
图形用户界面编程什么是图形用户界面编程?图形用户接口(Graphical User Interface,GUI)以图形界面方式实现人机交互。使用GUI方法:选用合适的GUI对象,布局,配置事件响应机制。GUI的组件容器组件窗体:可存放面板的容器,有标题面板:无标题栏,必须放在窗体中,那么什么是面板?一个面板Panner对象,有一种布局方式。可视化的非容器组件按钮,用于点击的标签,存放文字的,一般是一行的简单提示信息单选框,多选框,组合框文本框,用于接收输入的,比如键盘输入,一般是
2021-12-25 23:47:15 1139
原创 基于springboot实现全局异常处理
基于springboot实现全局异常处理声明:本人并不具备详细解析这个过程的具体实现,我将介绍如何使用,及我的一些个人理解。场景:后端返回信息,前端可以根据后端数据返回的“错误”信息基于用户更好的体验逻辑说明:首先创建一个自定义异常类继承RuntimeException(不需要捕获),我的例子是“BusinessException”,将业务信息与异常类分离,创建一个枚举类“BusinessExceptionCode”,枚举业务异常信息。创建一个异常处理框架,“ControllerExceptionHa
2021-12-24 23:34:24 732
原创 设计模式之模板方法
模板方法什么是模板方法?子类继承父类时,不同子类之间不应该有重复代码。定义一个操作中的算法骨架,而将一些步骤延迟到子类。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的特定步骤。模板方法的应用场景当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤再更详细的层次上的实现可能不同时,我们使用该方法。大白话解释:父类中有一个方法实现一个功能,子类重写这个方法具体实现功能,但是不同子类实现该功能时只有少部分代码不一致,因此我们应该再提炼可以重复书写的代码出来,这就是模板方法。怎
2021-12-23 20:16:46 285
原创 序列化与反序列化
序列化与反序列化什么是序列化?什么是反序列化?序列化: 将对象写入对象输出流中反序列化:从对象输入流中读出对象为什么需要序列化?对象传输数据复杂,类与类之间有关联,比如继承或者引用,序列化机制可以通过对象图机制读写对象,以满足复杂对象的关联,如单链表。实际上,这是动态保存了对象的状态。怎么实现序列化?java类库提供很多IO类支持不同需求的IO操作。首先介绍自动序列化,自动序列化需要被传输的类实Serializable接口,此类中引用到的类也需要实现这个接口,接口虽然是空实现,但是必须实现才能
2021-12-22 23:53:27 278
原创 设计模式之原型模式
原型模式什么是原型模式?用原型实例指定创建创建对象的种类,并且拷贝这些原型创建新的对象原型模式解决了什么问题?原型模式是根据已有的类创建一个相同状态的类,不需要再重新初始话一个类,动态获取了对象运行的状态。如何使用原型模式?Object类中默认定义了一个clone方法权限为Protected,我们需要重写这个方法并且增大权限为public。java类库中定义了一个Cloneable接口,我们实现这个接口,尽管这个接口是空的。继承了这个接口,jvm才认为这个类是可以被克隆的。由于原型模式比较简
2021-12-21 21:28:07 465
原创 工厂模式的抽象介绍与实现
工厂模式的抽象介绍与实现为什么需要工厂模式,对比简单工厂模式,工厂模式优势在哪里?简单工厂模式的优点在于实例化类是在工厂类中进行选择,根据客户端的选择在工厂中实例化类,但是这优点同样也是缺点,我们要增加功能时,我们则需要修改工厂类中的代码,这违反了开放-封闭原则(对扩展开放,对修改封闭)。工厂模式则解决了这一问题。什么是工厂模式?定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。大白话解释:使用工厂模式,决定具体功能类的实例化不再在工厂类中进行,而是转移到客
2021-12-20 17:38:29 121
原创 设计模式之代理模式
代理模式什么是代理模式?为其他对象提供一种代理以控制对这个对象的访问。代理模式其实是访问对象时间接到可以附加多种用途代理模式的抽象介绍Subject类定义了RealSubject和proxy的共用接口,这样在需要使用RealSubject的地方可以使用proxypublic abstract class Subject { public abstract void request();}RealSubject类请求类继承Subject类,需要被proxy代理public c
2021-12-19 16:26:51 200
原创 装饰模式的抽象介绍与简单实现
装饰模式的抽象介绍与简单实现何为装饰模式?动态地给对对象添加一些额外的职责,就增加功能来说,装饰子类比生成子类更加灵活。首先看看装饰模式的UML图Component类定义一个对象接口,可以给这些对象动态的添加职责public abstract class Component { public abstract void Operation();}ConcreteComponent类继承Component类定义一个具体的对象,也可添加职责public class Concret
2021-12-18 12:33:34 310
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人