- 博客(116)
- 资源 (1)
- 收藏
- 关注
原创 23种设计模式:21访问者模式(Visitor)
概念访问者模式:表示一个作用于某个对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作介绍访问者模式的概念非常不容易理解,用通俗的话说,我希望在满足“开放-封闭原则”的条件下,能改变元素的操作。访问者模式本来就很复杂,再加上使用上还有条件,所有实际工作中也很少能用到,下面我们直接看例子吧。我们需要设计一个程序,满足下面要求:程序能反应“男人”、“女人”在不同的状态下的不同反应。状态分为:成功、失败、恋爱。状态可能在后期会有新增,新增状态不会影响原先的代
2020-11-03 23:17:54 135
原创 Java基础篇:反射入门
反射入门篇幅有点长,但我不想打散了,因为只看其中一部分也没啥意义,所以分为了上中下3篇,写的不好的方面,希望大家指出简介反射能干什么?你只需要给我一个类的地址,我就能知道类的全部信息(类名称、父类、继承的接口、方法、属性、甚至实例化并赋值),那么下面我们就来看看它怎么办到的吧!预备工作这次我们准备用了一个Customer类,我们把它当成反射的对象,我们希望通过反射获取它的全部信息,我们先来看看这个类吧!Customer类,(包名有点随意了):(注意,下面要用)有一个无参数构造方法和一个pri
2020-07-02 16:34:15 159
原创 JVM基础:JVM内存模型简单介绍
PC寄存器一块很小的内存空间,用于记录下一条CPU要运行的指令,各个线程之间是独立拥有自己的PC寄存器当执行Java代码时:存放的Java字节码地址当执行native方法时:则程序计数器为空虚拟机栈也是线程私有的内存空间,和线程一起创建,它保存方法的局部变量、部分结果,并参与方法的调用和返回。栈的大小可以设置为动态扩展或者固定大小可以使用 -Xss参数来设置栈的固定大小如果超过固定大小,程序则会抛出StackOverflowError异常如果设定为动态扩展,超过内存范围后,抛出Ou.
2020-05-14 16:59:09 261
原创 JAVA多线程基础:高效的无锁并行计算CAS算法
CAS算法为了解决什么问题?我们为了在多线程下保持数据同步,不得不在不同的线程间进行锁竞争时,这样总不可避免相互等待,从而阻塞当前线程。这样导致的性能低下……什么是CAS算法如果我们让每个线程拥有各自独立的变量副本,当各个线程在并行计算时,无需相互等待对方的结果,最后将大家运行的结果拿出来对比,对比“胜出”的就为最终的结果,所以这是一种基于比较交换的无锁并发控制方法。算法优点虽然无锁算法的设计和实现更为复杂的多,但是它有以下优点:由于其非阻塞性,它对死锁问题天生免疫,既无死锁问题线程间的相互
2020-05-13 12:17:37 272
原创 JAVA多线程基础:线程池的原理与使用
为啥要用线程池呢?大概就一下原因吧!线程的使用如果不加控制和管理,会对系统的性能会产生不利的影响线程的创建和消耗会占用很多时间大量的线程回收会给GC带来很大的压力,延迟GC停顿时间模拟线程池这里只是简单的模拟线程池,让大家了解原理,真正的线程池比这个麻烦很多……其中,我们只需要2个类ThreadPool:这个就是线程池,他的主要作用的管理线程,有线程就提供,没有线程了就创建再提供,用完了就回收PThread:线程池都有了,那这个是干什么的呢?一般我们创建的线程开始后,都会自动的销毁,
2020-05-10 21:02:53 195
原创 深度学习基础篇:逻辑回归Logistic Regression
什么是逻辑回归?逻辑回归算法应用非常广泛,他是用来解决“分类”问题,可能同学要问,回归问题不是返回的是数值吗?怎么变成分类了?这是因为逻辑回归比较特殊,他虽然返回的是数值,但是这个数值是各个类别出现的概率,概率最大的类别,我们就将它作为类别的输出结果。所以,逻辑回归就是根据事物的特征值,最后能够输出判别这个事物属于什么类别的一种方法。如何更加特征值获得分类结果?首先看下面2个公式:p^\...
2020-04-17 00:44:59 1125
原创 人脸识别实战(深度学习)-导论
喜欢编写应用的方式去学习和理解知识点。本系列博客,会先从人脸识别项目入手,一步一步搭建人脸识别项目,让大家感性的认识深度学习。搭建项目需要下面这些步骤获得训练数据获取数据数据增强分割数据搭建人脸识别模型人脸特征模型训练特征区分模型训练测试模型准确率测试模式准确率,并优化人脸活体检测...
2020-04-15 12:02:26 359
原创 凸包问题-Graham 算法
这里我只是想记录一下凸包问题,我发现如果要把他讲解非常清楚,需要画比较复杂的集合图形,而我不会。所以,这篇文章可能只能帮你梳理一下算法步骤或者参考一下代码。什么是凸包问题找一条线,能够将二维平面上的所有的点围起来,返回这条线上的所有的点,解决凸包的算法很多,比如Jarvis 算法、Graham 算法、Andrew 算法。我这里主要记录Graham 算法的过程步骤我们需要找到P0点,P0点的特征是,y最小,如果有多个,那么去取最右边的,也就是x最大的,然后我们将P0点放在首位以P0为原点,将剩
2022-05-17 21:05:56 873
原创 动态规划-解决编辑距离的问题
这是LeetCode的72题,好久没有做动态规划了,所以碰到这道题,第一反应完全没有想到动态规划,所以记录下来,以提示自己,同时也分享给大家,我写的不好,也可以参照官方题解原题72. 编辑距离给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符 示例 1:输入:word1 = "horse", word2 = "ros"输出:3解释:horse.
2022-05-14 11:57:05 215
原创 数据结构:树状数组(BitTree)
作用如果你需要经常修改一个数组中的值,同时又需要计算这个数组的前N项和,此时,你希望计算和的效率高一点的时候,就可以尝试树状数组关键方法update(i, v):更新第i个元素,加上Vsum(n): 查询序列前N个元素的和lowbit(int i):这个研究他的特征,不如直接打印结果,然后去感受效果更好我的理解过程我先把 lowbit(int i),也就是 i & -i,的结果,for循环全部打印尝试了一遍(代码注释中有)然后尝试理解update 和 sum的概念,然后DEBUG一
2022-03-01 23:31:01 530
原创 数据结构与算法分析:快速排序
适合已经会快速排序的算法的同学回忆主要步骤0. R = 最开始的下标,L = 末尾的下标1. 取下标R的值存入pivot,2. 从L开始由前往前找,找小于pivot的数,然后放入R的位置(此时相当于L是空的,因为数值被移走了),然后R向后移动一个位置3. 从R开始往后面找,找到大于pivot的数,然后放入L的位置,L向前移动一个位置4. 直到R == L为止,将R对应的下标赋值为pivot5. 递归重复上面的操作核心代码模拟private void sort(String[] tim.
2022-01-24 00:21:12 299
原创 错入记录:tomcat日志暴涨,出现大量空格
情景描述这几天发现服务器出现日志暴涨,catalina.out 出现了几十个G,删除日志后重启服务器,重启成功后catalina.out 也能达到上百兆打开catalina.out ,发现里面很多空格,且都是出现在dobbo相关的日志里面解决方案发现有个这样缓存的文件,dubbo-registry-127.0.0.1.cache,查看发现也有170多兆,并且里面有也有大量的空格于是删除这个缓存文件(dubbo-registry-127.0.0.1.cache)后重启服务,日志恢复正常后续本来
2022-01-11 10:31:22 895
原创 java基础:手动编译java程序(引包,带目录)
这应该是很基础的,但我们习惯用IDEA等工具后,反而忘记了,这里我们测试Redis连接(我本地启动了redis,你本地不启动也不影响)准备材料workspace.zipWindow下实现解压上面的workspace,在地址栏中输入cmd进入workspace,cd workspace将jar引用到classPath中,让java能找到 SET CLASSPATH=.;D:\workspace\libs\jedis-3.3.0.jar ;注意需要修改成你的正式目录编译 javac c.
2021-11-09 11:48:21 1697 1
原创 Mysql基础:存储过程之变量
要使用存储过程,就必须先了解变量的语法变量尝鲜理解枯燥的概念前,可以先试试,下面的SQL语句,看会打印出什么?系统变量SHOW GLOBAL VARIABLES; -- 查看所有的全局变量SHOW SESSION VARIABLES; -- 查看所有的会话变量SHOW SESSION VARIABLES like '%char%'; -- 筛选显示会话变量select @@global.character_set_client; -- 查看某个具体的全局变量的值select @@s
2021-04-29 23:35:15 591
原创 23种设计模式:20解释器模式(Interpreter)
介绍解释器模式和字面意思一样,作用主要是为了解释某些特别的字符,比如Java语言的,字节码解释成机器码的过程,但今天不可能举这么复杂的例子,那么我参考了大话设计模式中的例子,并简化了其中某些我认为不必要的“语法”。例子如下:我希望将“CDEFGAB”替代“1234567”的音符(也就是Do-Re-Mi-Fa-So-La-Ti)将“1 2 3” 替代 “低音 中音 高音”于是替代后的一串字符如下:2 E G A E G D E G A 3 C 2 A G C E D(输入)那么原来的字符为:
2020-11-03 00:10:50 116
原创 23种设计模式:19中介者模式(Mediator)
用一个中介者对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互介绍中介,大家多半想到出租房子吧!好吧!今天就以出租房子作为例子!房东:中介,我想出租我的房子,每月1800元。中介:好的。租客:中介,我想租房子,2000以内的。中介:好的,我正好有一套。上面的房屋出租过程,租客和房东完全不需要相互交流就可以将业务完成,也就是租客和房东之间解耦合了。下面我们看看UML图吧!UML图代码...
2020-11-02 00:36:00 183 2
原创 23种设计模式:18责任链模式(Chain of Responsibility)
介绍今天介绍责任链模式,举个小美相亲的例子,假如小美想相亲,就叫大姑、舅舅、姐姐去帮她依次把关。他的3个亲人对相亲的小伙子有如下要求:大姑:小伙子一定要能挣钱,工资必须高于5000,否则不行。舅舅:小伙子不能太瘦,体重要超过110,否则保护不了小美。姐姐:小伙一定要超过160,矮了不行。小美:只要是男的就行。上面的大姑、舅舅、姐姐三人组成了一个责任链,他们的责任是按照自己的要求帮小美把关,下面我画以下它的UML图UML图责任链关键一点是,自己依赖自己的接口。而最后一个判断者必须处理完业
2020-10-29 23:47:31 154
原创 23种设计模式:17命令模式(Command)
介绍今天我们用汽车去4S点保养作为例子,4S店提供如下服务:洗车、换机油、加气。所以我们需要的角色有下面4个:客户:这里就是发送命令的主程序main方法命令:也就是上面的洗车、换机油、加气服务前台:负责收集客户的命令(服务),然后告诉修理工修理工:执行前台传递过来的服务从上面可以看出,命令类连接客户、前台、修理工的。而命令的种类很有可能随着业务的增加而发生变化。客户和修理工不会直接发生关系,所以UML图如下:UML图代码业务为张三最开始希望进行洗车、换机油、加气3个服务,但是突然有
2020-10-28 00:14:08 118
原创 23种设计模式:16桥接模式(Bridge)
介绍哈哈,Bridge和我的昵称差不多!桥接模式其实很简单的,网上很多学习资料大概是为了介绍合成/聚合复用原则或者是为了说清楚桥接模式的好处,都会先用一个特别复杂的错误案例,然后将学习的同学脑袋弄晕,然后才开始介绍桥接模式。那么,今天我就直接说举例说桥接模式,然后再举错误的例子,最后介绍合成/聚合原则案例分析假设我们希望分别从“用途”和“品牌”2个方面去创建汽车,比如:用途(Purpose): 家用、赛道、商务……品牌(Brand):特斯拉、宝马、BYD……如果是桥接模式,创建方式如
2020-10-27 00:05:02 107
原创 23种设计模式:14迭代器模式
介绍迭代器模式非常的常用,以至于我们的JDK直接将迭代器封装到JDK中,比如Iterator类。所以在开发中,我们很少自己写迭代器,而是用JDk封装好的迭代器,下面我们就简单模拟一下迭代器。UMLMyList:相当于我们平时用的List接口,但这里为了方便理解,只写了和迭代器相关的。MyArrayList:相当于我们平时用的ArrayListIterator:这个是迭代器的接口MyItr:这里是真实的迭代器代码先看集合吧!public abstract class MyList
2020-10-25 22:22:40 93
原创 23种设计模式:13组合模式
介绍组合模式非常简单,其实就是一个树状结构的组织或者模型,我们可以看看下面的总公司和分公司的组织架构。其中有总公司,总公司下面有各种部门和分公司分公司下面也有相应的部门组合模式就是为了描述这种部门关系而存在的,UML非常简单,不利于理解,大家可以直接看代码吧!UML代码Component:接口,代表一种组织架构部public interface Component { void add(Component component); void del(Componen
2020-10-25 11:24:55 211
原创 23种设计模式:12备忘录模式
介绍备忘录模式场景很常见,今天我们就来简单模拟,word文档记录文字后,每次备份,然后恢复备份是怎么实现的。首先,我们需要3个角色,分布是文档本身、备份、保存备份的容器文本本身:它具有添加内容、生成备份文件、还原备份文件3个功能备份文件:它能存储文档中关键的细节。保存备份的容器:它存储的各个时间段的备份文件,方便随时存取。UML图代码Document:这个是模拟的word文档 package com.bridge.memento; public class
2020-10-24 20:58:01 121
原创 23种设计模式:11适配器模式
介绍适配器模式非常简单,他常用于新系统对接老系统或者多个第三方系统的接口。所以,一般在新开发的系统中,是很少使用适配器模式。下面我模拟一下,新系统对接2个第三方系统的场景。需要注意下面的不同:系统01的connect方法的端口port需要的是String类型。系统02的连接和断开方法,使用的是open()和close()。为了让系统和系统01、系统02都能对接上,我们此时需要使用适配器模式。UML图代码老系统系统01public class DeviceAdapter01 im
2020-10-23 00:29:57 133
原创 23种设计模式:10状态模式
介绍状态模式中主要有2个类,分别是Work和State,今天我们利用工作的状态来理解状态模式,比如,我们在工作的时候,根据时间的不同,有以下几种状态。12点之前:精神百倍12 - 13点:饿了,午饭:犯困,午休13 - 17点:下午状态还不错,继续努力17 - 21点:可能加班,也可能被强制回家21点之后:不行了,睡着了。上面的场景,我们可以看出,我们的工作状态和时间有关(或者被强制回家)。所以,我们希望设计一个State类,这个State类代表工作中的时间状态,同时,它可以根据不同的时间
2020-10-21 17:17:04 188
原创 23种设计模式:08外观模式(Facade)
案列模拟我们现在来模拟一下买股票的情形:第一天:买股票1、买股票2、买股票3、买股票4、买股票5……第二天:.抛出股票2、股票3,买过票17、股票28,计算自己所得第三天:分析股票走势………………你是否发现,这样的话,你每天的时间都买股票、抛股票、计算、分析去了…………那么是否有更容易的方式呢?当然就是基金了。虽然基金要收取手续费,但是他帮你节省了很多事情,而你需要做的只需购买基金或赎回,其他股票的分析,买入,抛出都交给基金去管理了这里提到的通过买基金的方式替代股票,就是外观模式了外观模式
2020-10-13 22:32:11 104
原创 23种设计模式:05工厂模式与抽象工厂模式
要说工厂模式,我们先回忆一下之前的简单工厂模式,简单工厂模式的UML图如下:简单工厂模式的缺点简单工厂模式缺点在于,工厂方法OperationFatory中,如果此时我需要加一个求余数的工具类,我需要修改OperationFatory方法,这违反了开放-封闭原则工厂模式的解决方案工厂模式为了解决这个问题,可谓煞费苦心啊,我们先来看看工厂模式的UML图吧!总结工厂模式为了解决这个问题,我们需要创建更多的类,且代码的复杂度也增加了,那么其实我们有更好的解决方案,即抽象工厂模式抽象工厂模式解决方案
2020-10-12 21:58:52 84
原创 23种设计模式:04代理模式与动态代理模式
代理模式代理模式思想非常简单,为其他对象提供一种代理以控制对这个对象的访问。下面我举一个漫威中的英雄“钢铁侠”的例子,在战斗中钢铁侠的外盔甲帮托尼打架。UML图代码接口,我这里举例的是漫威公司interface Marvel{ void fly(); void guard(); void shooting();}托尼,本来是平凡人,因为继承了漫威的接口,然后有了钢铁外壳,称为了钢铁侠class Musk implements Marvel{ @
2020-09-28 23:33:02 93
原创 23种设计模式:03装饰模式
最近写这些博客的目的也是帮自己梳理一下之前学习的知识,并希望的到新的感悟,放入博客之中,最近的感悟是,我们需要重点理解设计模的几个原则,然后各个模式是用于解决不同的场景的需求,而具体场景下,我们不必拘泥于模式的格式是否正确,否则这就违背了模式的初衷,我们应该将能独立的分析自己的需求和要达到的目的,然后可以借鉴各个模式的解决方案应用场景对实体类“人”的职能的“任意”扩展当我们希望对人的职能进行扩展,而具体的扩展的功能我们希望再不同的需求场景下是可以装配的,而不是一层不变的,比如“张三”可以开车、穿西.
2020-09-24 00:04:36 141
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人