- 博客(37)
- 收藏
- 关注
原创 设计模式——原型模式
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用介绍意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。主要解决:在运行期建立
2021-12-21 19:08:24
199
原创 设计模式——建造者模式
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。介绍意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变
2021-12-13 19:32:47
204
原创 设计模式——抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。介绍意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。主要解决:主要解决接口选择的问题。何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
2021-12-08 18:05:03
176
原创 设计模式——工厂模式
工厂模式介绍工厂模式(Factory Pattern)属于创建型模式,它提供了一种创建对象的最佳方式。我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决:主要解决接口选择的问题。何时使用:我们明确地计划不同条件下创建不同实例时。如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。关键代码:创建过程在其子类执行。应用实例:
2021-12-06 18:50:31
130
原创 设计模式——单例模式
介绍单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。主要解决:一个全局使用的类频繁地创建与销毁。何时使用:当您想控制实例数目,节省系统资源的时候。如何解决:判断系统是否已经
2021-12-02 21:21:36
89
原创 设计模式的六大原则
单一职责原则定义:一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。问题由来:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。优点:1.可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;2.提高类的可读性,提高系统的可维护性;3.变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显
2021-11-29 19:59:57
87
原创 一文了解线程池
线程池七大参数ThreadPoolExecutor 3 个最重要的参数: corePoolSize :核心线程数,线程数定义了最小可以同时运行的线程数量。 maximumPoolSize :线程池中允许存在的工作线程的最大数量 workQueue:一个阻塞队列,当新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,任务就会被存放在队列中。 ThreadPoolExecutor其他常见参数: keepAliveTime:线程存活时间,线程池
2021-11-26 16:57:43
171
原创 导入SQL时出现 Invalid default value for ‘XXX‘ 报错解决方法
问题如上图,在进行建表时,报错Invalid default value for 'XXX'原因:MySQL的版本不同,5.6及其以下版本不支持因为给了时间字段的列默认值一个 CURRENT_TIMESTAMP 默认值,而这个默认值在低版本的 MySQL 中是不支持的,因此就出现了图中的这个报错`reg_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',解决方案:一:重装 MySQL 数据库,版本选...
2021-11-24 20:13:59
20052
原创 高并发下接口幂等性解决方案
转载:高并发下接口幂等性解决方案_Gandoph的博客-CSDN博客_接口幂等性解决方案一、背景 我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。1. 前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果;2. 我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统bug重发,也应该只扣一次钱;3. 发送消息,也应该只发一次,同样的短信发给用户,用户会哭的;4. 创建业务订单,一次业务请求只能创建一个,创建多个就会出大问...
2021-11-22 21:49:56
117
原创 【实例详解】创建线程的四种方式
创建线程有四种方式: 继承 Thread 类; 实现 Runnable 接口; 实现 Callable 接口; 使用 Executors 工具类创建线程池 1、继承 Thread 类步骤 定义一个Thread类的子类,重写run方法,将相关逻辑实现,run()方法就是线程要执行的业务逻辑方法 创建自定义的线程子类对象 调用子类实例的star()方法来启动线程 public class MyThread extends T
2021-11-22 19:15:01
499
原创 MySQL中rank函数的使用
题目来源:牛客sql练习题对所有员工的薪水按照salary降序进行1-N的排名_牛客题霸_牛客网题目描述:有一个薪水表salaries简况如下:对所有员工的薪水按照salary降序进行1-N的排名,要求相同salary并列,且按照emp_no升序排列:分析:这道题目考察的是SQL窗口函数(OLAP函数)中用于排序的专用窗口函数用法下面介绍三种用于进行排序的专用窗口函数:1、RANK() 在计算排序时,若存在相同位次,会跳过之后的位次。 例如,有...
2021-11-16 09:39:35
10278
原创 volatile如何保证可见性
Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了 确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言 提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。在了解volatile实现原理之前,我们先来看下与其实现原理相关的CPU术语与说明volatile是如何来保证可见性的呢?在X86处理器下通过工具..
2021-11-15 18:37:57
377
原创 一文了解MySQL事务相关原理
什么是数据库事务?事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功
2021-11-14 08:36:41
119
原创 【图文详解】常用的限流算法—漏桶、令牌桶
令牌桶算法 对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合适了,令牌桶算法更为适合初始化限流器时,会初始化一定量的令牌,假设初始化10个令牌,每隔一段时间生成令牌,客户端发请求,被限流器拦截,查询是否有令牌为什么采用令牌桶,因为秒杀的那一刻,希望处理比较多的请求,短期处理突发一大波流量,并不会长期处理一大波请求在“令牌桶算法”中,只要令牌桶中存在令牌,那么就允许突发地传输数据直到达到用户配置的门限,所以它适合.
2021-11-12 18:33:26
1545
原创 十大经典排序算法—基数排序
1、算法思想:一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数2、动图演示(图片来源菜鸟教程)代码实现:public class RadixSort { public static void main(String[] args) { int[] arr = {22, 34, 3, 32, 82, 55, 89, 50, 37..
2021-11-11 19:25:22
99
原创 RocketMQ事务性消息实现—2PC方案
通过冯嘉发布的《RocketMQ 4.3正式发布,支持分布式事务》一文可以看到RocketMQ采用了2PC的方案来提交事务消息,同时增加一个补偿逻辑来处理二阶段超时或者失败的消息。2PC:两阶段提交协议,本地mysql执行事务和消费者的消息要能消费到,本地事务成功,消费者可以消费核心图解:该图分为两个逻辑:正常事务消息的发送及提交、事务消息的补偿流程事务消息发送及提交:第一步:MQ发送方发送消息(half消息,相当于半成品消息,不能立马消费) 第二步:MQ服务端返回响应..
2021-11-10 11:04:04
437
原创 十大经典排序算法—桶排序
1、算法思想:桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点:在额外空间充足的情况下,尽量增大桶的数量 使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中2、图片演示(图片来源菜鸟教程)元素分布在桶中:元素在每个桶中排序代码实现:public class BucketSort { private static final InsertSort insert...
2021-11-09 19:29:54
618
原创 本地缓存Guava Cache使用及场景
官方文档介绍:https://github.com/google/guava/wiki/CachesExplained1、导包<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>27.0.1-jre</version> </dependency&g
2021-11-09 19:21:22
528
原创 十大经典排序算法—计数排序
1、算法思想:第一步:找出待排序的数组中最大和最小的元素第二步:统计数组中每个值为i的元素出现的次数第三步:对所有的计数累加第四步:反向填充目标数组2、动图演示(动图来源菜鸟教程)代码实现:public class CountingSort { public static void main(String[] args) { int[] arr = {22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, .
2021-11-08 18:09:10
164
原创 java.math.BigDecimal类multiply用法
java.math.BigDecimal.multiply(BigInteger val)返回一个BigInteger,其值是 (this * val)查阅java8API手册public class BigDecimal extends Number implements Comparable<BigDecimal>构造方法:BigDecimal(BigIntegerval) 将BigInteger转换成BigDecimal。 BigDecim...
2021-11-06 18:05:27
5647
原创 十大经典排序算法—堆排序
1、算法思想:第一步:创建一个堆第二步:把堆首与堆尾互换第三步:把堆的尺寸缩小1,目的是把新的数组顶端数据调整到相应位置第四步:重复第二步,直到堆的尺寸为12、动图演示(动图来源菜鸟教程)代码实现:public class HeapSort { public static void main(String[] args) { int[] arr = {22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9.
2021-11-05 19:37:43
139
原创 十大经典排序算法—快速排序
1、算法思想:第一步:以左边第一个数为哨兵,从右边一直走找到第一个比哨兵小的数,从左边一直走找到第一个比哨兵大的数,交换第二步:当大数的索引比小数的索引大时,将小数与左边的哨兵交换,这时左边的数都比哨兵小,右边的数都比哨兵大第三步:重复第一步第二步,递归哨兵左右两边的数组2、动图演示(动图来源菜鸟教程)代码实现:public class QuickSort { public static void main(String[] args) { int[
2021-11-04 20:57:56
274
原创 org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException: sendDefaultImpl call timeout
Linux环境下部署rocketmq,进行发送和接受消息时出错、错误如下:解决方案:(亲测有效)可能是端口导致的RocketMQ除了要开放9876端口外,还需要开放10909和10911端口所以在云服务器安全组添加这两个端口号即可结果:sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producersh bin/tools.sh org.apache.rocketmq.example.quic...
2021-11-04 10:21:14
708
1
原创 十大经典排序算法—归并排序
1、算法思想:第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置第四步:重复第三步,直到某一指针达到序列尾第五步:将另一序列剩下的所有元素直接复制到合并序列尾2、动图演示(动图来源菜鸟教程)代码实现:public class MergeSort { public static void m.
2021-11-03 19:56:28
229
原创 十大经典排序算法—希尔排序
1、算法思想:第一步:将待排序序列分割成若干个子序列第二步:对若干个子序列分别进行直接插入排序,待整个序列中的记录基本有序时第三步:再对全体记录进行依次插入排序2、动图演示(动图来源菜鸟教程)代码实现:public class shellSort { public static void main(String[] args) { int[] arr = {22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35,.
2021-11-03 19:50:38
196
原创 十大经典排序算法—选择排序
1、算法思想:第一步:在未排序的序列中找到最小(大)的数,放到排序序列的起始位置第二步:再从剩下未排序的序列中找最小(大)的数,放到已经排序序列的最后位置第三步:重复第二步即可,直到完成所有排序2、动图演示(动图来源菜鸟教程)代码实现:public class SelectSort { public static void main(String[] args) { int[] arr = {22, 34, 3, 32, 82, 55, 89, 50,
2021-11-02 20:10:12
239
原创 一张图让你明白MySQL的主从复制
MySQL为什么要做主从复制在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运行。 做数据的热备,主库宕机后能够及时替换主库,保证业务可用性。 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。MySQL主从复制的流程1.主服务器的更新的数据(u.
2021-11-02 19:24:27
360
原创 彻底了解操作系统之死锁
目录定义死锁、饥饿、死循环什么时候产生死锁模拟死锁产生死锁的四个必要条件死锁处理策略定义当线程 A 持有独占锁a,并尝试去获取独占锁 b 的同时,线程 B 持有独占锁 b,并尝试获取独占锁 a 的情况下,就会发生 AB 两个线程由于互相持有对方需要的锁,而发生的阻塞现象,我们称为死锁。死锁、饥饿、死循环什么时候产生死锁模拟死锁死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进class Test..
2021-11-01 09:24:53
215
原创 【图文详解】彻底了解红黑树底层实现原理
红黑树定义红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目。(来源百度百科)结构特点...
2021-10-31 09:27:33
4264
1
原创 史上最详细Java面试总结—并发编程篇(一)
基础并发编程基础并发编程的优缺点优点 充分利用多核CPU的计算能力:通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升 方便进行业务拆分,提升系统并发能力和性能:在特殊的业务场景下,先天的就适合于并发编程。现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力以及性能。面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更能吻合这种业务拆分 。 缺点并发编程的
2021-10-30 19:08:31
456
3
原创 Description:Web server failed to start. Port 8080 was already in use.
这是在做项目过程中经常遇到的问题啦!描述:Web 服务器无法启动。 端口 8080 已被使用。很明显是端口号被占用啦,主要有两种办法解决解决方案一:将端口号设置为 8081,一般8081不会被占用此时运行项目运行成功在浏览器上输入相应地址访问,这样就可以拿到我们想要的数据啦解决方案二:...
2021-10-30 14:15:52
1975
原创 史上最详细Java面试总结—Java集合篇
常用的集合类Map接口和Collection接口是所有集合框架的父接口: Collection接口的子接口包括:Set接口和List接口 Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等 Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等 List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
2021-10-29 20:40:31
287
1
原创 出现incompatible types: possible lossy conversion from double to int错误
【力扣357题】计算各个位数不同的数字个数 原题链接:力扣给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10^n。输入: 2输出: 91 解释: 答案应为除去 11,22,33,44,55,66,77,88,99 外,在 [0,100) 区间内的所有数字。思路:动态规划class Solution { public int countNumbersWithUniqueDigits(int n) { int[] ..
2021-10-29 10:03:03
6787
1
原创 史上最详细Java面试总结—Java基础篇
目录Java概述什么是JavaJVM、JRE和JDK的关系什么是跨平台性Java语言有哪些特点什么是字节码Java和C++的区别基础语法Java的数据类型访问修饰符—常问基础&和&&的区别object类有哪些方法final finally finalize区别(常问)this、super关键字的用法static关键字面向对象面向对象面向对象三大特性面向对...
2021-10-29 08:38:30
511
3
原创 十大经典排序算法—冒泡排序
1、算法思想:第一步:比较相邻的元素,如果第一个比第二个大,就交换他们两个。第二步:对每一对相邻元素作同样的工作,直到数组最后两个数进行比较,最后的元素是最大的数第三步:针对所有的元素重复以上的步骤,除了最后一个(第二步中得到的最大元素)。第四步:持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。2、动图演示3、什么时候最快?当输入的数据已经是正序时4、什么时候最慢?当输入的数据是反序时(直接一个for反序输出即可)代码实现:...
2021-10-28 20:42:17
268
原创 【力扣334题】递增三元子序列—直指贪心
题目描述:一个整数数组nums ,判断这个数组中是否存在长度为 3 的递增子序列。如果存在这样的三元组下标 (i, j, k)且满足 i < j < k ,使得nums[i] < nums[j] < nums[k] ,返回 true ;否则,返回 false。难度:中等输入:nums = [1,2,3,4,5]输出:true解释:任何 i < j < k 的三元组都满足题意输入:nums = [2,1,5,0,4,6]输出:true解释:三...
2021-10-28 18:06:23
293
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人