自定义博客皮肤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)
  • 收藏
  • 关注

原创 结构型模式之装饰者模式

装饰者模式可以在不改变现有对象结构的情况下,动态的给该对象增加一些职责(就是加一些额外的功能)。去快餐店点菜,我们可以点一个炒饭,然后加个蛋,加个牛肉。点一份炒饭就是具体构建类,加个蛋,加个牛肉就是额外添加的职责。当然我们也可以使用继承的方式,让一个蛋炒饭继承炒饭,牛肉炒饭继承炒饭。但是这样的类或过多,而且扩展性不好。类图如下,最关键的点就是ExtFood抽象类,他既继承了FastFood又引用了FastFood。输出:炒饭:10.0炒饭加鸡蛋:11.0炒饭加鸡蛋加牛肉:16.0IO流中的包装

2022-06-21 16:45:08 284 1

原创 结构型模式之适配器模式

将一个类的接口转换成客户希望的另一个接口,让原本因为接口不兼容不能一起工作的类可以一起工作。比如三叉插头转换成二叉插头。适配器分为两类:现在有一台电脑只能读SD卡,但是我们现在手上只有TF卡。因此我们要创建一个适配器来让电脑能读TF卡。当适配者有接口规范的时候才能用,不然就用不了。因为适配器不能继承两个类。相对于类适配器,对象适配器把适配的的继承改成了引用。降低了耦合度jdk中的字节字符转换流就用了适配器模式...

2022-06-21 11:04:36 271

原创 结构型模式之代理模式

一个对象A需要给某个对象B提供一个代理以控制对对象A的访问。这个时候访问对象C不适合或者不能直接引用目标对象,所以需要代理对象A作为一个访问对象C和被访问对象B的中介。(比如买电脑,我们都是从电脑城的经销商那里买,不可能直接从华硕的工厂拿货)。代理模式分为两种:电脑厂家华硕按照出厂价卖给经销商电脑城,然后电脑城扩展了这个卖的功能加价2000再卖给消费者。在动态代理的方式中,代理类是在程序运行的过程中自动生成的。因此我们是无法在文件中找到一个代表代理类的Java文件的。我们使用了一个类来生成代理类。要注意

2022-06-20 16:54:58 233

原创 创建者模式大汇总

单例模式确保了在整个系统中这个类只有一个对象被创建。他提供了一种访问他唯一的一个对象的方式,可以直接访问,不需要额外实例化对象。单例模式有几个显著的特点:单例模式分为两类:类加载的时候就生成了对象,但是不用的话就很浪费内存.静态代码块方法上述的这两种方式其实差不多,就是在类里面new了一个私有静态变量,然后对外的方法只返回他。怎么样是不是非常的简单,而且枚举类的实现方式是最安全的。不会被反射或者序列化破解。懒汉式在类被使用到的时候,才会生成对象避免了内存的浪费。这个方式就是在调用方法的时候会先判断

2022-06-19 10:21:28 498

原创 JDK、JRE和JVM的关系与区别

其实他们三个的区别从他们的英文全称就可以看出来。JDK:Java Development Kit Java开发工具包JRE:Java Runtime Environment Java运行环境JVM:Java Virtual Machine Java虚拟机很明显的可以看出,JDK是面向开发人员的。JRE只是一个运行环境,JVM是Java虚拟机。他们三者是一个包含的关系,JDK最大向下包含JRE,JRE又向下包含JVM。JVM:就是java虚拟机,负责将class文件解释成机器码来运行JRE:包含

2022-06-08 17:37:07 266

原创 六大设计原则大汇总

单一职责原则(Single responsibility principle)SRP单一职责原则就是说,一个类他只负责一件事情。这样子就比较好维护,不然的话,一个类里面就会有很多逻辑(if/else)堆在一起,变成一个屎山类。比如对不同的用户类型,系统提供不同的功能错误示范,这个代码把所有用户类型的功能逻辑都放在了一个类里面,然后使用if/else来判断。当之后要修改或者添加用户功能的时候,维护就会很复杂。违背了SRP原则public class BadDemo { public void

2022-05-27 11:34:35 396

原创 排序算法大汇总

排序算法大汇总冒泡排序选择排序插入排序希尔排序快速排序源代码TODO冒泡排序冒泡排序会两两比较每个元素的大小,并将其排序。每一趟排序都会确定一个元素的位置,把最大的放在最后面,并且在排序的过程中会将小的元素集中到前面,大的元素集中到后面,冒泡排序是稳定的时间复杂度O(n^2),空间复杂度O(1) public static int[] bubbleSort(int[] nums){ for (int i = 0; i < nums.length; i++) {

2022-05-03 14:09:00 525

原创 Java HashMap和哈希

哈希在各种语言的底层数据的顺序存储一般都是使用数组这个数据结构。而数据是可以根据索引直接获取数据的int a[0]。当数组过大的时候,我们想在这个数组中查找某给值所在的位置就需要遍历一遍数组花费较多的时间O(n),而哈希就可以解决这个问题。哈希可以把一个对象(万物皆对象)转化为一个固定的哈希值我们已这个哈希值来作为数组的索引,这样当我们想查找某个元素所在的位置时,就可以直接通过索引获取,而不用遍历数组了。常用的哈希算法直接定址法:直接以关键字k或者k加上某个常数(k+c)作为哈希地址。数字分析法:

2022-04-24 21:01:04 611

原创 Java 浅拷贝和深拷贝

浅拷贝和深拷贝代码地址浅拷贝:直接复制了对象A地址给另一个对象B。修改B,A也会跟着改变。深拷贝:复制了对象A的值给另一个对象B,这两个对象没有任何关系指向不同的地址。修改其中一个并不会对另一个造成影响。浅拷贝直接赋值ShallowCopy.java文件中的assign方法。重写clone()注意这个类得实现Cloneable接口clone 算是半深半浅吧。通过重写clone方法来实现拷贝可以做到对对象中基本数据类型(int,char,boolean等)及其包装类型(String、Inte

2022-04-20 15:17:17 726

原创 Redis的三种持久化方式

redisredis数据库是一个nosql数据库,存储的数据格式是key-value。由于redis运行在内存中所以redis的速度非常快。但是,也由于他是运行在内存中的所以只要服务器已关机,或者出现了说明问题。数据就很容易丢失。因此redis给我们提供了两种数据持久化的方式。RDB(redis database)RDB的方式就是把数据以快照(当前时刻的数据)的形式放在硬盘中。存在一个默认名为dump.rdb的二进制文件中。RDB实现方式使用save来进行RDB操作会导致redis在保存数据时阻

2022-03-26 21:18:56 1536

原创 java集合(Collection)底层细节

CollectionListArrayListSetList和Set的区别所有的Java集合都继承了Collection接口,而Collection接口又集成了Iterable(迭代器)接口。也就是说所有的Java集合类(ArrayList、HashMap等)都可以使用iterator进行遍历,且都实现了Collection接口中规定的方法。ListArrayListArrayList的底层实现是一个Object数组。由于是Object数组所以,int等基本类型不能往里面放得先转成Integer

2022-03-02 16:09:33 898

原创 POST、GET、Cookie、Session杂谈

一般来说get用于获取、检索,post用于**创建、更新get会将请求的参数附加到Url中,而post不会在URL中附加参数,而是将参数放在request body中。所以get比post更不安全(post也不安全,因为HTTP本身是明文协议。每个HTTP请求和返回的每个byte都会在网络上明文传播,不管是url,header还是body)使用get请求时,浏览器会把http header和data一并发送出去。而使用post请求时,服务器会先发送header,等待服务器响应后在发送具体data。g.

2022-02-28 14:18:49 923

原创 详解TCP

TCP与UDPTCP和UDP的区别为什么TCP可靠超时重传TCP和UDP的区别TCP是面对流的协议,提供可靠的面向连接的运输服务,是点对点通信。(下载等应用场景)UDP是面向报文的协议,不提供可靠交付,并且不需要连接,不仅仅支持点对点而且支持多播和广播。(群视频聊天、语音等)为什么TCP可靠TCP有三次握手建立连接和4次挥手关闭连接的机制,还有滑动窗口和阻塞控制算法。最关键的是还有超时重传机制。对于每份报文进行校验,保证报文的可靠性。超时重传当发送端的TCP发送数据时,会给数据编号。且每发送一

2022-02-25 13:51:25 2177

原创 OSI七层模型

OSI七层模型物理层数据链路层网络层传输层会话层表示层(翻译官)应用层OSI协议全称开放式通信系统互连参考模型,总共7层。每层都为其相邻层服务,但是他们各自实现自己的服务,并不关心相邻层是如何实现的。物理层物理层是OSI7层协议的最底层,物理层提供一个底层物理硬件的通信。通过2进制比特流来实现,2进制比特流使用物理硬件的高低电压来体现。设备A从数据链路层获取流形式数据后转化为比特流发送给设备B,设备B接收后将数据转化为二进制机器码给数据链路层。网卡、集线器、中继器工作子物理层。数据链路层数据链路

2022-02-24 16:21:06 2355

原创 算法套路汇总

链表链表千万别递归,递归栈会导致你的空间复杂度无法做到O(1)快慢指针判断是否有环一次遍历找到链中的倒数第几个点找到中间节点空置头节点    new一个空节点指向头节点可以有效的防止空指针报错数组前缀和数组    new一个新数组preSum来存放之前数组(该数组不能被修改)的和。就可以通过preSum数组的加减快速求出原数组某个区间内元素的和。进阶可以扩展到二维数组可以用哈希表来代替数组计算前缀

2021-11-17 10:49:19 808

原创 浅谈Spring事务管理

浅谈Spring事务管理啥是事务不同隔离级别带来的不同问题第一类丢失更新第二类丢失更新脏读幻读不可重复读应对方法isolation(隔离级别)propagation(传播方式)挖个坑啥是事务    事务就是你有一连串的操作,每个操作都必须成功完成。如果其中有一个操作失败就全部回滚,之前操作的所有更改都会被取消。    举例来说,你现在有一个学生表,一个学生成绩表。当一个学生a被开除时,就需要同时删除这两个表中关于a的相关数

2021-11-08 16:04:07 263

原创 Spring-boot controller获取前端参数及返回模板的几种方式

Spring controller获取前端参数及返回模板的几种方式接收前端参数直接接收通过path接收返回模板通过ModelAndView返回使用model返回在模板(前端网页中)使用数据在Spring-boot 2.5版本中,在启动Sring-boot服务时会有一个提示这其中的dispatcherServlet就是SpringMVC的前端控制器。所有的请求都是由这个前端控制器转发的,其根据@RequestMapping的值将请求转发到相应的方法中。这里模板使用的是thymeleaf 挖个坑,有机

2021-10-21 10:20:03 2029

原创 java stream

java streamJava 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。stream将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。+--------------------+ +------+ +------+ +---+

2021-10-20 14:08:29 82

原创 String、StringBuffer和StringBuilder

String、StringBuffer和StringBuilderStringjava中字符串String有两种创建方式。一种储存在公共池中,一种储存在堆上。String str="储存在公共池中的创建方式";String str2=new String("储存在堆上的创建方式");String是静态的,一旦创建就不可变。当改变str的值时,jvm会在内存中创建一个新的String存储str+str2的值,并将其赋值给str。因此变量str只是指向了一个新的对象,效率极低String str=

2021-10-14 14:22:57 75

原创 查找算法大汇总

二分查找(折半查找)    二分查找也叫折半查找,是一种高效的查找方法。时间复杂度O(n),但是要注意的是只有顺序存储的有序列表可以使用二分查找。原理    二分查找顾名思义是将列表分为两边。假设列表从小到大排列,首先判断中间位置是否等于查找元素,相等就返回当前位置。大于查找元素就对前半部分列表重复上述操作,小于查找元素就对后半部分列表重复上述操作。    举个栗子:list:[

2021-09-25 18:41:52 176

原创 原码反码补码计算机底层的加减法

结论先说结论原码无法做到正+负的运算而补码可以反码是原码转补码的中间产物转换正数的原码=反码=补码负数:反码=~abs(原码)           补码=反码+1原码在计算机中所有的数据都是表示为2进制的。原码就是直接将10进制转化为补码。并用最高位来表示数字的正负。(0表示正,1表示负) 2的原码为:0000 0000 0000 0010 -2的原码为:1000 0000 0000 0010

2021-09-18 11:01:29 1155

转载 位运算说明

位运算操作符能干啥操作符& 与运算 :两个位都是 1 时,结果才为 1,否则为 0,如1 0 0 1 1&1 1 0 0 1=1 0 0 0 1| 或运算 :与&与运算符相反两个位都是 0 时,结果才为 0,否则为 1如1 0 0 1 1 |1 1 0 0 1=1 1 0 1 1^ 异或运算,两个位相同则为 0,不同则为 1,如1 0 0 1 1 ^1 1 0 0 1=0 1 0 1 0~取反运算,0 则变为 1,1 则变为 0,如~ 1 0 0

2021-09-16 15:23:05 221

空空如也

空空如也

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

TA关注的人

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