自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Java开发者Peng博客

对于技术我们是认真的

  • 博客(77)
  • 资源 (4)
  • 收藏
  • 关注

原创 并发编程java

【代码】并发编程java。

2023-05-05 19:05:23 496 1

翻译 设计模式-单例模式(下)

1、如何理解单例模式的唯一性:我们重新看一下单例的定义:“一个类只允许创建唯一一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。”定义中提到,“一个类只允许创建唯一一个对象”。那对象的唯一性的作用范围是什么呢?是指线程内只允许创建一个对象,还是指进程内只允许创建一个对象?答案是后者,也就是说,单例模式创建的对象是进程唯一的。2、如何实现线程唯一的单例: “进程唯一”指的是进程内唯一,进程间不唯一。类比一下,“线程唯一”指的是线程内唯一,线...

2022-05-10 18:51:25 182

翻译 设计模式-单例模式(中)

1、单例存在的问题: 大部分情况下,我们在项目中使用单例,都是用它来表示一些全局唯一类,比如配置信息类、连接池类、ID 生成器类。单例模式书写简洁、使用方便,在代码中,我们不需要创建对象,直接通过类似 IdGenerator.getInstance().getId() 这样的方法来调用就可以了。但是,这种使用方法有点类似硬编码(hard code),会带来诸多问题。1.1、单例对 OOP 特性的支持不友好: OOP 的四大特性是封装、抽象、继承、多态。单例这种设计模式对于...

2022-05-10 11:54:02 168

翻译 设计模式-单例模式(上)

1、什么是单例以及为什么使用单例?1.1、单例设计模式(Singleton Design Pattern)。一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。使用单例可以解决那些问题:2、处理资源访问冲突: 譬如日志设计时,多对象在多线程环境下并发写日志时可能导致日志覆盖,进而导致日志丢失问题。举例代码如下:/** * 日志记录类 * @author PengMvc * */public class Logger..

2022-05-05 17:49:35 323

翻译 设计模式-职责链模式(下)

1、职责链模式常用在框架的开发中,为框架提供扩展点,让框架的使用者在不修改框架源码的情况下,基于扩展点添加新的功能。实际上,更具体点来说,职责链模式最常用来开发框架的过滤器和拦截器。2、应用1-Servlet Filter:2.1、Servlet Filter 是 Java Servlet 规范中定义的组件,可以实现对 HTTP 请求的过滤功能,比如鉴权、限流、记录日志、验证参数等等。因为它是 Servlet 规范的一部分,所以,只要是支持 Servlet 的 Web 容器(比如,Tomcat、Je

2022-04-27 17:46:00 93

翻译 设计模式-职责链模式(上)

1、模板模式、策略模式、职责链模式。这三种模式具有相同的作用:复用和扩展,在实际的项目开发中比较常用,特别是框架开发中,我们可以利用它们来提供框架的扩展点,能够让框架的使用者在不修改框架源码的情况下,基于扩展点定制化框架的功能。2、什么是指责链模式:翻译成中文就是:将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。...

2022-04-19 19:46:41 189

翻译 设计模式-策略模式(下)

1、设计原则和思想其实比设计模式更加普适和重要,掌握了代码的设计原则和思想,我们甚至可以自己创造出来新的设计模式。2、问题和解决思路: 假设有这样一个需求,希望写一个小程序,实现对一个文件进行排序的功能。文件中只包含整型数,并且,相邻的数字通过逗号来区隔。如果由你来编写这样一个小程序,你会如何来实现呢?你可以把它当作面试题,先自己思考一下,再来看我下面的讲解。 你可能会说,这不是很简单嘛,只需要将文件中的内容读取出来,并且通过逗号分割成一个一个的数字,放到内存数组中,然后...

2022-04-08 17:17:18 112

翻译 设计模式-策略模式(上)

1、策略模式的原理和实现:1.1、策略模式,英文全称是 Strategy Design Pattern,定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端。1.2、工厂模式是解耦对象的创建和使用,观察者模式是解耦观察者和被观察者。策略模式跟两者类似,也能起到解耦的作用,不过,它解耦的是策略的定义、创建、使用这三部分。2、接下来具体讲述这三部分:2.1、策略的定义:策略类的定义比较简单,包含一个策略接口和一组实现这个接口的策略类。因为

2022-04-07 17:43:20 95

翻译 设计模式-模板模式

1、模板模式的作用:模板模式主要是用来解决复用和扩展两个问题。2、模板模式,全称是模板方法设计模式,英文是 Template Method Design Pattern。 模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。这里的“算法”,我们可以理解为广义上的“业务逻辑”,并不特指数据结构和算法中的“算法”。3、原理很简单,代码实现也很简单。templateMethod() 函数定义为 f...

2022-04-06 16:05:10 743 1

翻译 设计模式-观察者模式eventBus(下)

1、实现方式类型: 同步阻塞是最经典的实现方式,主要是为了代码解耦;异步非阻塞除了能实现代码解耦之外,还能提高代码的执行效率;进程间的观察者模式解耦更加彻底,一般是基于消息队列来实现,用来实现不同进程间的被观察者和观察者之间的交互。2、异步非阻塞观察者模式的简易实现: 其中一种是:在每个 regSuccess() 函数中创建一个新的线程执行代码逻辑;另一种是:在 UserController 的 register() 函数中使用线程池来执行每个观察者的 handleRe...

2022-03-31 16:19:48 922

翻译 设计模式-观察者模式(上)

1、23 种经典的设计模式分为三类:创建型、结构型、行为型。 观察者模式会对应不同的代码实现方式:有同步阻塞的实现方式,也有异步非阻塞的实现方式;有进程内的实现方式,也有跨进程的实现方式。1.2、详细介绍: 有同步阻塞的实现方式:一般是进程内的,且开的是单线程,跨进程很少同步阻塞,因为弊端太多,譬如性能问题,时效性等。 异步非阻塞:一般是夸进程,方式一:开起异步线程调用RPC接口,方式二:选用中间件MQ。进程内一般也可以开异步线程调本应用的接口,从而提高接口的响...

2022-03-24 11:59:03 137

翻译 设计模式-适配器模式

1、什么是适配器模式:适配器模式的英文翻译是 Adapter Design Pattern。顾名思义,这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。对于这个模式,有一个经常被拿来解释它的例子,就是 USB 转接头充当适配器,把两种不兼容的接口,通过转接变得可以一起工作。 适配器模式有两种实现方式:类适配器和对象适配器。其中,类适配器使用继承关系来实现,对象适配器使用组合关系来实现,ITarget 表示要转化成的接口定义。...

2022-03-16 12:10:18 138

翻译 设计模式-装饰者模式

1、java IO类的用法:1.1、java中的io类就很好的运用了装饰者的设计模式,一般我们读取文件代码如下:/** * * @author PengMvc * */public class ReadContent { public static void main(String[] args) { FileInputStream inputStream = null; try { inputStream= new FileInputStream(new File(".

2022-03-14 18:10:39 75

翻译 设计模式-工厂模式下

1、DI 容器(Dependency Injection Container)底层最基本的设计思路就是基于工厂模式。2、一个简单的 DI 容器的核心功能一般有三个:配置解析、对象创建和对象生命周期管理。2.1、简单工厂模式有两种实现方式,一种是每次都返回新创建的对象,另一种是每次都返回同一个事先创建好的对象,也就是所谓的单例对象。在 Spring 框架中,我们可以通过配置 scope 属性,来区分这两种不同类型的对象。scope=prototype 表示返回新创建的对象,scope=singleto

2022-03-08 17:38:10 71

翻译 设计模式-工厂模式上(Factory Design Pattern)

1、工厂模式分为三种更加细分的类型:简单工厂、工厂方法和抽象工厂。2、简单工厂、工厂方法原理比较简单,在实际的项目中也比较常用。而抽象工厂的原理稍微复杂点,在实际的项目中相对也不常用。3、详细介绍:3.1、简单工厂: 在下面这段代码中,我们根据配置文件的后缀(json、xml、yaml、properties),选择不同的解析器(JsonRuleConfigParser、XmlRuleConfigParser……),将存储在文件中的配置解析成内存对象 RuleConfig。p...

2022-03-07 17:51:45 143

原创 单例模式(代码编写)-懒汉式

package com.test2;/** * 单列模式(懒汉式) * @author xp,zhang * */public class SingleTon { // 私有化无参构造函数 private SingleTon() {}; private static SingleTon singleTon; public static synchronized SingleTon getSingleTon() { if(singleTon == null) { s.

2022-01-24 11:42:04 245

原创 分布式系统中Hash算法运用

1、分布式系统和集群的区别1.1、分布式系统:指的是将一个大的应用按照功能职责或者业务的不同划分为不同的模块,各个模块可以独立部署,通过http/https(更安全)或者其它的方式进行交互。1.2、集群:指的是将多个相同的应用部署在多个服务器上,同时对外提供服务。2、节点取余:假如你的缓存服务器有10台,在缓存数据时,你会取业务字段写一个hash算法,经过hash算法后会有一个hash值,拿hash值对10取模,得到的是0-9的数字,再将数字和缓存服务器映射,得到的就是你的数据具体存储到那台缓存

2022-01-13 17:45:11 407

原创 线程交替打印奇偶数

1、这个一般面试编码可能会遇到,我这里通过实现Runnable接口、运用同步代码块和Object下提供关于线程的wait()、和notify方法。2、当然你也可以通过继承Thread类和线程池实现(只开2个线程有点浪费),同时借助ReentrantLock锁(可重入锁)实现/** * 线程交替打印奇数和偶数1-100 * 提供一种实现,其他实现可继承thread类、 * 或者基于java.util.concurrent.ThreadPoolExecutor实现(这个有点浪费,只开两个线程)

2021-12-31 11:12:25 449

翻译 设计模式-4大特性解决编程问题

1、封装: 封装也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式(或者叫函数)来访问内部信息或者数据。public class Wallet { private String id; private long createTime; private BigDecimal balance; private long balanceLastModifiedTime; // ...省略其他属性... public Wallet...

2021-12-02 14:38:50 62

原创 生成序列号(幂等)

1、source+唯一序列号构成唯一字段入库2、借助redis的自增指令实现唯一(incr指令)/** * 生成唯一流水号(存在概率重复) * 真正唯一可借助redis或者数据库 * @author xpzhang * */public class IdempotentTest { public static void main(String[] args) { System.out.println(getUniqueIdentifier()); .

2021-12-01 17:24:40 895

翻译 设计模式-面向对象

1.面向对象编程的英文缩写是 OOP,全称是 Object Oriented Programming。对应地,面向对象编程语言的英文缩写是 OOPL,全称是 Object Oriented Programming Language。2. 什么是面向对象编程? 面向对象编程是一种编程范式或编程风格。它以类或对象作为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石 。3. 什么是面向对象编程语言? 面向对象编程语言是支持类或对象的语法机制,...

2021-12-01 10:16:45 81

翻译 设计模式-面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?

1、面向对象 现在,主流的编程范式或者是编程风格有三种,它们分别是面向过程、面向对象和函数式编程。面向对象这种编程风格又是这其中最主流的。现在比较流行的编程语言大部分都是面向对象编程语言。大部分项目也都是基于面向对象编程风格开发的。面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式编码实现的基础。2、设计原则 对于每一种设计原则,我们需要掌握它的设计初衷,能解决哪些编程问题,有哪些应用场景。只有这样,我们才能在...

2021-11-30 17:56:14 160

翻译 设计模式-“好“和“坏“代码

1、可维护性(maintainability) 所谓“代码易维护”就是指,在不破坏原有代码设计、不引入新的 bug 的情况下,能够快速地修改或者添加代码。所谓“代码不易维护”就是指,修改或者添加代码需要冒着极大的引入新 bug 的风险,并且需要花费很长的时间才能完成。2.、可读性(readability) 代码的可读性应该是评价代码质量最重要的指标之一。我们在编写代码的时候,时刻要考虑到代码是否易读、易理解。除此之外,代码的可读性在非常大程度上会影响代码的可维护性。...

2021-11-30 17:27:00 112

原创 手动定义线程池相关参数

/** * 手动定义线程池参数,避免出现出现OOM * 采用的是无界队列(当任务数大于核心线程数,多余的任务在队列排队 * 直到有空闲的线程才去处理) * @author xpzhang * */public class CommonThreadPool { // 核心线程池 private static final int CORE_POOL_SIZE = 10; // 线程活跃时间 private static final int KEEP_ALIVE_TIME .

2021-11-30 15:35:49 124

原创 BF算法代码实现

1、真正的BF算法的时间复杂度O(n*m),算是比较高的了,但是实际开发中我们匹配的主串一般都不会太长,所以对于小数据量的匹配还是比较快的。2、代码的实现比较简单,简单意外这出现错误的概率会降低,在满足性能要求的前提下,简单是首选。这也是我们常说的KISS(Keep it Simple and Stupid)设计原则。3、代码实现(并不是完全按照BF定义):/** * BF算法 * @author xpzhang * */public class BFMatch { publ

2021-11-30 11:27:44 939

翻译 动态规划(下)

1、如何实现搜索引擎中的拼写纠错功能? 在Trie 树那节我们讲过,利用 Trie 树,可以实现搜索引擎的关键词提示功能,这样可以节省用户输入搜索关键词的时间。实际上,搜索引擎在用户体验方面的优化还有很多,比如你可能经常会用的拼写纠错功能。2、如何量化两个字符串的相似度?2.1:有一个非常著名的量化方法,那就是编辑距离(Edit Distance)。2.2:编辑距离指的就是,将一个字符串转化成另一个字符串,需要的最少编辑操作次数(比如增加一个字符、删除一个字符、替换一个字符)。编...

2021-11-26 11:34:36 84

原创 优化计算,提高效率(计算备忘录)

1、 适用场景:1.1:一般我们在用递归进行数据处理时,可能会存在大量的重复计算,这些重复计算会大大影响计算的性能。1.2:调用单个计算的处理业务的时间复杂度比较高。2、自己用map简单的实现了备忘录的功能,备忘录的实现方法很多,当然也可以借助redis,我这里借助了map,但是这种思想都是相类似的,注重对思想的掌握,下面是我简单写了个demo。/** * 计算备忘录:对于重复计算多,且计算成本高的适用 * @author xpzhang * */public class Cac

2021-11-26 11:05:57 689

翻译 算法-动态规划(中)

1、动态规划能解决的问题有什么规律可循呢?实际上,动态规划作为一个非常成熟的算法思想,很多人对此已经做了非常全面的总结。我把这部分理论总结为“一个模型三个特征”。1.1:什么是“一个模型”?它指的是动态规划适合解决的问题的模型。我把这个模型定义为“多阶段决策最优解模型”。 我们一般是用动态规划来解决最优问题。而解决问题的过程,需要经历多个决策阶段。每个决策阶段都对应着一组状态。然后我们寻找一组决策序列,经过这组决策序列,能够产生最终期望求解的最优值。什么是“三个特征”?它们分别是最优...

2021-11-25 18:15:41 167

翻译 算法-动态规划(上)

1、动态规划比较适合用来求解最优问题,比如求最大值、最小值等等。它可以非常显著地降低时间复杂度,提高代码的执行效率。2、举例:2.1、0-1背包问题: 对于一组不同重量、不可分割的物品,我们需要选择一些装入背包,在满足背包最大重量限制的前提下,背包中物品总重量的最大值是多少呢? 关于这个问题,我们上一节讲了回溯的解决方法,也就是穷举搜索所有可能的装法,然后找出满足条件的最大值。不过,回溯算法的复杂度比较高,是指数级别的。那有没有什么规律,可以有效降低时间复杂度呢?...

2021-11-22 18:00:23 150

原创 kafka消费组

1、同一个topic,每个消费者组都可以拿到相同的全部数据。2、消费者多于分区数:2.1 创建一个测试用的单分区topic-test2.2 创建一个分组group12.3 在group1中启动两个消费者producer:a,b,cconsumer1:无consumer2:a,b,c结论:同一分区内的消息只能被同一组中的一个消费者消费,当消费者的数量多于分区数量时,多于的消费者空闲(不能消费数据)。3、消费者小于和等于分区数3.1 创建一个三分区的topictest2

2021-11-18 20:25:03 3679

翻译 算法-回溯算法

1、笼统地讲,回溯算法很多时候都应用在“搜索”这类问题上。不过这里说的搜索,并不是狭义的指我们前面讲过的图的搜索算法,而是在一组可能的解中,搜索满足期望的解。2、理解回溯算法: 在我们的一生中,会遇到很多重要的岔路口。在岔路口上,每个选择都会影响我们今后的人生。有的人在每个岔路口都能做出最正确的选择,最后生活、事业都达到了一个很高的高度;而有的人一路选错,最后碌碌无为。如果人生可以量化,那如何才能在岔路口做出最正确的选择,让自己的人生“最优”呢? 我们可以借助前面学过的贪心算...

2021-11-18 16:41:06 134

翻译 算法-分治算法

1、MapReduce 是 Google 大数据处理的三驾马车之一,另外两个是 GFS 和 Bigtable。它在倒排索引、PageRank 计算、网页分析等搜索引擎相关的技术中都有大量的应用。 尽管开发一个 MapReduce 看起来很高深,感觉跟我们遥不可及。实际上,万变不离其宗,它的本质就是我们今天要学的这种算法思想,分治算法。2、如何理解分治算法? 分治算法(divide and conquer)的核心思想其实就是四个字,分而治之 ,也就是将原问题划分成 n 个规模...

2021-11-11 17:54:38 209

翻译 算法-贪心算法

1、贪心算法有很多经典的应用,比如霍夫曼编码(Huffman Coding)、Prim 和 Kruskal 最小生成树算法、还有 Dijkstra 单源最短路径算法。2、举例:2.1:假设我们有一个可以容纳 100kg 物品的背包,可以装各种物品。我们有以下 5 种豆子,每种豆子的总量和总价值都各不相同。为了让背包中所装物品的总价值最大,我们如何选择在背包中装哪些豆子?每种豆子又该装多少呢? 我们只要先算一算每个物品的单价,按照单价由高到低依次来装就好了。单价从高到低排列,依次是...

2021-11-11 11:41:55 259

翻译 算法-AC 自动机

1、基于单模式串和 Trie 树实现的敏感词过滤: 有 BF 算法、RK 算法、BM 算法、KMP 算法,还有 Trie 树。前面四种算法都是单模式串匹配算法,只有 Trie 树是多模式串匹配算法。 单模式串匹配算法,是在一个模式串和一个主串之间进行匹配,也就是说,在一个主串中查找一个模式串。多模式串匹配算法,就是在多个模式串和一个主串之间做匹配,也就是说,在一个主串中查找多个模式串。 单模式串匹配算法(比如 KMP 算法)与用户输入的文字内容进行匹配。但是,这...

2021-11-10 17:33:19 536

翻译 算法-Tried

1、什么是“Trie 树”? Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。 当然,这样一个问题可以有多种解决方法,比如散列表、红黑树,或者我们前面几节讲到的一些字符串匹配算法,但是,Trie 树在这个问题的解决上,有它特有的优点。不仅如此,Trie 树能解决的问题也不限于此,我们一会儿慢慢分析。 我们有 6 个字符串,它们分别是:how,hi,her,he...

2021-11-09 17:07:30 138

翻译 算法-字符串匹配(下)

1、KMP 算法是根据三位作者(D.E.Knuth,J.H.Morris 和 V.R.Pratt)的名字来命名的,算法的全称是 Knuth Morris Pratt 算法,简称为 KMP 算法。 KMP 算法的核心思想:我们假设主串是 a,模式串是 b。在模式串与主串匹配的过程中,当遇到不可匹配的字符的时候,我们希望找到一些规律,可以将模式串往后多滑动几位,跳过那些肯定不会匹配的情况。 在模式串和主串匹配的过程中,把不能匹配的那个字符仍然叫作坏字符,把已经匹配的那段字符串叫作...

2021-11-09 10:08:18 76

翻译 算法-字符串匹配(中)

1、BM 算法的核心思想 我们把模式串和主串的匹配过程,看作模式串在主串中不停地往后滑动。当遇到不匹配的字符时,BF 算法和 RK 算法的做法是,模式串往后滑动一位,然后从模式串的第一个字符开始重新匹配。 主串中的 c,在模式串中是不存在的,所以,模式串向后滑动的时候,只要 c 与模式串没有重合,肯定无法匹配。所以,我们可以一次性把模式串往后多滑动几位,把模式串移动到 c 的后面。2、BM 算法包含两部分,分别是坏字符规则(bad character rule)和好...

2021-11-08 18:01:38 75

翻译 算法-字符串匹配(上)

1、单模式串匹配的算法,也就是一个串跟一个串进行匹配。2、BF 算法: BF 算法中的 BF 是 Brute Force 的缩写,中文叫作暴力匹配算法,也叫朴素匹配算法。从名字可以看出,这种算法的字符串匹配方式很“暴力”,当然也就会比较简单、好懂,但相应的性能也不高。 我们在字符串 A 中查找字符串 B,那字符串 A 就是主串,字符串 B 就是模式串。我们把主串的长度记作 n,模式串的长度记作 m。因为我们是在主串中查找模式串,所以 n>m。 如果...

2021-11-05 17:06:38 83

翻译 算法-深度和广度优先搜索

1、六度分割理论: 在社交网络中,有一个六度分割理论,具体是说,你与世界上的另一个人间隔的关系不会超过六度,也就是说平均只需要六步就可以联系到任何两个互不相识的人。 一个用户的一度连接用户很好理解,就是他的好友,二度连接用户就是他好友的好友,三度连接用户就是他好友的好友的好友。在社交网络中,我们往往通过用户之间的连接关系,来实现推荐“可能认识的人”这么一个功能。2、搜索算法: 算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于“图...

2021-11-05 10:21:02 373

翻译 数据结构-图

1、我们前面讲过了树这种非线性表数据结构,今天我们要讲另一种非线性表数据结构,图(Graph)。和树比起来,这是一种更加复杂的非线性表结构。 我们知道,树中的元素我们称为节点,图中的元素我们就叫做顶点(vertex)。从我画的图中可以看出来,图中的一个顶点可以与任意其他顶点建立连接关系。我们把这种建立的关系叫做边(edge)。 我们就拿微信举例子吧。我们可以把每个用户看作一个顶点。如果两个用户之间互加好友,那就在两者之间建立一条边。所以,整个微信的好友关系就可以用一张图...

2021-11-04 17:24:21 82

设计模式学习模板demo

设计模式学习模板demo

2022-12-09

TestDemo.7z

平时测试demo

2021-12-01

DataStructures.7z

数据结构项目

2021-12-01

tableWord.7z

导出数据库表结构

2021-11-30

old-project.7z

old-project.7z

2021-11-25

空空如也

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

TA关注的人

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