自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 建造者模式

什么是建造者模式?建造者模式是将一个复杂得对象的构建与它的表示分离,使得同样的建造过程可以创建不用的表示。主要作用?在用户不知道对象构造过程和细节的情况下可以直接创建复杂的对象.UML类图?Director:指挥者直接与客户(使用者)沟通沟通后指挥者将客户创建产品的需求划分为各个组件的建造请求(Builder)将各个组件的建造请求委派给具体的建造者(ConcreteBulder)具体建造者进行产品构建并返回产品信息实例? /** * 产品类-小汽车组装类 * */public c

2021-04-23 13:18:12 92

原创 原型模式

什么是原型模式?原型模式是指用原型实例创建对象种类,并且通过拷贝这些原型创建新的对象原型模式结构图prototype:原型类,声明一个克隆自己的接口ConcretePrototype:具体的原型类,实现一个克隆自己的操作Client:让一个对象克隆自己,从而创建一个新的对象深拷贝和浅拷贝的问题浅拷贝使用cloneable接口来实现深拷贝通过重写cloneable方法或者对象序列化来实现(推荐序列化)//创建流对象ByteArrayOutputStream bos = null; Ob

2021-04-23 13:15:27 85

原创 单例模式的八种实现方式

单例模式介绍所谓的单例模式就是采用一定的方法保证在整个系统中,对某一个类只能存在一个对象实例,并且该类只提供一个取得该对象实例的方法饿汉式(静态常量)//饿汉式(静态变量) class Singleton {//1. 构造器私有化,外部不能通过new创建对象 private Singleton() {}//2.本类内部创建对象实例private final static Singleton instance = new Singleton();//3. 提供一个公有的静态方法,返回实例对

2021-04-23 13:13:40 96

原创 设计模式六大准则

设计模式的六大原则设计模式的作用?1.代码重用性(相同功能的代码不需要多次编写)2.可读性(代码规范性便于其他人阅读和理解)3.可扩展性(当需要增加新功能非常的方便称之为可维护)4.可靠性(当我们新增加功能不会影响原来的功能)5.使程序呈现高内聚低耦合的特性设计模式六大准则?单一职责原则一个类应该只负责一项职责接口隔离原则客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上依赖倒换原则高层模块不应该依赖底层模块,二者应该依赖其抽象里氏替换原则在使用继承

2021-04-23 13:09:43 89

原创 Spring注解汇总

@Configuration告诉spring这是一个配置类@Bean给容器中注册一个bean类型为返回值类型id默认是方法名,结合@Configuration或者@Component使用。可以导入第三方组件,方法有参数默认从ioc容器获取,可以指定initMethod和destoryMethod方法@Scope设置组件作用域protoType多例子 singleton单例(默认)@Lazy懒加载(只针对单例有效)@ComponentScan包扫描@ComponentScans可以配置多

2021-04-23 13:06:20 67

原创 Netty快速入门(八)

Netty粘包,拆包问题以及自定义协议解决方案问题概述由于Tcp是面向连接的,面向流的,提供高可靠性的服务。收发两端都要有一一成对的socket。因此,发送端为了将多个发送给接收端的包更有效的发送给对方,使用了Nagle算法,将多次间隔较小且数据量较小的数据,合并成了一个大的数据块,然后进行封包发送给对方。这样虽然能提升效率,但是接收端很难分辨出完整的数据包了。Tcp半包拆包演示第一行数据没有发生粘包和拆包现象第二行接收端一次性接收到了两个独立的数据包,称之为粘包第三行第一次读取到了完整的D1

2021-04-22 13:47:27 69

原创 Netty快速入门(七)

ProtoBuf解释ProtoBuf是谷歌提供的一种轻便高效的结构化数据存储格式.它很适合做数据存储以及RPC远程调用数据交换为什么需要ProtoBuf编写网络应用程序时,数据在网络中传输的都是二进制字节码数据。在发送时需要编码,接收时需要解码。netty本身自带的ObjectEncoder和ObjectDecoder可以实现各种业务对象的编解码操作,但是底层依然使用的是java序列化技术,效率不高,序列化后体积过大,并且无法跨语言,所以可以使用protoBuf来解决。目前大多数公司使用方法是Htt

2021-04-22 11:37:47 76

原创 Netty快速入门(六)

Netty实现服务器和客户端WebSocket长连接要求:实现基于WebSocket的长连接的全双工交互改变http协议多次请求的约束实现长连接,服务器可以发送消息给浏览器 客户端和浏览器端会相互感知对方是否关闭连接代码import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.*;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel

2021-04-22 11:16:05 72

原创 Netty快速入门(五)

## Netty实现一个群聊系统要求:1.使用netty实现一个群聊系统,实现服务器端与客户端的非阻塞通信2.实现多人群聊3.可以检测用户上线离线并实现消息转发服务器端代码import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.*;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel;i

2021-04-22 10:52:33 73

原创 Netty快速入门(四)

Netty核心模块组件梳理BootStrap和ServerBootStrapBootStrap的意思是引导,一个Netty应用通常由一个bootStrap开始,主要用于配置整个Netty程序,串联各个组件。Netty中BootStrap是客户端程序引导类,ServerBootStrap是服务器端程序引导类。常见方法:Future和ChannelFutureNetty中所有的io操作都是异步的,并不能立即知道操作是否执行成功。但是可以通过注册监听等待操作执行完回调通知。具体的实现就是Future和

2021-04-22 10:33:10 124 1

原创 Netty快速入门(三)

异步模型基本介绍1.异步的概念和同步相对。当一个异步过程调用发出后并不能马上获取执行结果。实际处理这个调用的组件会在完成后通过状态、回调来通知调用者。2.Netty中的io操作都是异步的,包括bind,write,connect等操作都会返回一个ChannelFutrue3.调用者并不能立即获取结果,而是通过Future-Listener机制Future说明1.表示异步的执行结果,可以通过它提供的方法来检测执行是否完成2.ChannelFuture是一个接口,我们可以添加监听器,当监听的事件发

2021-04-21 17:54:14 84

原创 Netty快速入门(二)

NioEventLoop处理异步任务/定时任务1.异步任务这里直接在Netty快速入门(一) 自定义的服务器端handler中进行异步任务/** * 因为Netty是基于事件处理的 * 所以该类用于读写连接等事件处理的,每一种事件都有不用的处理方法,继承SimpleChannelInboundHandler,泛型为接收的数据类型 * */public class NettyServerHandler extends SimpleChannelInboundHandler<String

2021-04-21 17:04:28 62

原创 Netty快速入门(一)

Netty简介Netty是由jboss提供的一个基于NIO的开源框架。Netty提供异步、基于事件驱动的网络应用程序框架,用于快速开发出高性能、高可靠性的网络IO程序。Netty模型上图文解:1.Netty需要创建两组线程池(NioEventLoopGroup),BossGroup主要负责客户端的请求连接,连接成功后BossGroup会把连接交给 Worker Group,Worker Group负责客户端的读写操作。2.NioEventLoopGroup可以看作是一个事件循环组,这个组

2021-04-21 16:10:28 96

原创 数组存储二叉树遍历

数组存储二叉树遍历概念从数据结构来看,数组存储方式和树的存储方式可以相互转换,数组可以转换成树,树也可以转换成数组分析树的左子节点为 父节点坐标2+1树的右子节点为 父节点坐标2+2父节点坐标 = (当前节点-1)/2问题用代码实现数组以树的方式进行前序遍历/** * 数组存储顺序二叉树(把数组用树前序遍历方式输出) * * 1.树的左子节点为 父节点坐标*2+1 * 2.树的右子节点为 父节点坐标*2+2 * 3. 父节点坐标 = (当前节点-1)/2 * */pub

2021-03-30 15:58:18 1163

原创 二叉树的前序/中序/后序遍历以及删除实现

二叉树的前序/中序/后序遍历概念1.每个节点最多只有两个子节点的树称之为二叉树2.二叉树的子节点分为左节点/右节点3.如果二叉树所有的叶子节点都在最后一层,并且节点总数=2*n-1(n为层数),则称之为满二叉树4.如果该二叉树的所有叶子节点最后一层或者倒数第二层,而且最后一层叶子节点在左面连续,倒数第二层节点在右面连续,我们称之为完全二叉树分析前/中/后序遍历都是针对于父节点来说的前序遍历:先输出父节点,再遍历左子树,最后遍历右子树中序遍历:先遍历左子树,再输出父节点,最后遍历右

2021-03-30 09:59:35 266

原创 散列(哈希)表实现

散列(哈希)表实现定义1)散列表也叫做哈希表,是根据关键码值(key,value)来进行访问的数据结构,例如java中的hashmap/hashtable。2)哈希表可以使用数组+链表实现或者数组+二叉树实现分析用数组+链表实现哈希表数组存储首个链表节点位置)链表内每个节点位置记录下一个链表节点位置代码实现需求:设计一个散列表用于存储班级以及学生(可以有多个班级,每个班级有多个学生)/** * 具体存储的数据(学生) * */public class Student {

2021-03-24 17:50:25 226

原创 数组实现栈

数组实现栈定义1)栈是一个先进后出的有序列表,与堆正好相反2)栈限制列表中新增或者删除元素只能从一侧进行操作,称之为栈顶代码实现(代码内分析)** * 数组实现栈 * */public class ArrayStack { //定义一个接收数据的数组 private int [] stack; //最多能存储数据的个数 private int maxSize; //定义一个栈顶 private int top; /** *

2021-03-24 10:36:34 78

原创 单链表实现约瑟夫问题

什么是约瑟夫问题设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从 1 开始报数,数到 m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由此 产生一个出队编号的序列分析1)创建一个尾辅助指针指向最后一个节点(头节点的前一个节点)2)报数前根据输入的开始位置坐标进行移动firstNode头节点以及helperNode尾节点(移动输入次数-1次因为开始数的节点也会报数)3)报数时根据输入的报数间隔

2021-03-22 20:56:01 294

原创 双向链表的实现

双向链表实现列表双向链表与单向链表区别单向链表查找的方向只能是一个方向,而双向链表可以向前和向后查找双向链表可以实现自我删除,而单向链表需要辅助节点删除分析1)遍历/修改:和单向链表一致2)增加(默认添加到最后面)(1)找到双向链表最后一个节点(2)新增节点的上一个节点指向添加之前的最后一个节点(3)最后一个节点下一个节点指向新增节点3)删除(1)找到双向链表删除的节点并获取删除的节点上一个节点和下一个节点(2)让删除节点的上一个节点的next节点指向删除节点的下一个节点(3)让删

2021-03-22 13:53:06 118

原创 单链表的实现

链表实现列表一.链表概念1)链表是有序的列表2)链表是以节点的方式存储数据,是链式存储3)每个节点都包括data数据以及next节点4)链表分为带头结点的链表和不带头结点的链表,根据实际需求定代码实现定义一个具体存储数据node,用于存储数据以及指向下个node节点地址/** * 定义一个存储数据的node * */public class Node { public Node(int id ,String name, int sort) { this.id

2021-03-22 13:11:43 74

原创 数组实现环形队列

数组实现环形队列一.队列概念1)队列是一个有序列表,可以使用数组或者链表方式实现2)队列遵循先进先出原则!数组实现分析:图中我们将 头节点指向第一个元素(也就是头节点元素)尾节点指向尾元素的下一个节点为了实现环形队列我们需要采用取模方式计算头/尾节点位置代码实现/** * 环形队列 * */public class CyclicArrayQueue { private int maxSize;//总容量 private int head;//头节点 priv

2021-03-22 09:39:42 206

原创 1.稀疏数组

稀疏数组一.定义稀疏数组是用于存储多维数组有效数据的一种结构,如果多维数组中有很多没有意义的数据,就可以使用稀疏数组来存储,可以达到有效的节省内存空间的目的.二.分析首先定义一个二维数组,存储2个有效数据public static void main(String[] args) { //模拟棋盘的二维数组 int [][] chess = new int[11][10]; chess[1][2] = -2; chess[2][3]

2021-03-19 20:47:46 79

空空如也

空空如也

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

TA关注的人

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