常用算法归类
二分查找(非递归)
分治算法
动态规划
KMP算法
贪心算法
回溯算法
以下只给出思路与关键方法,算法的源代码放在了git中,需要的自取
leidl97/algorithm-src
二分查找(非递归)非递归的话肯定使用while了
难点
注意边界值条件,只有当左边的值大于右边才跳出循环
当目标值小于mid时,应该让right = mid + 1,需要加1,
同样的,相反情况也需要 -1 。
方法实现
12345678910111213141516171819//非递归实现private static void search3(int[] a, int act) { int left = 0; int right = a.length-1; while (left <= right) { int mid = (left + right) / 2; if (a[mid] == act) { //找到该值 System.out.println("找到该值 ...
报考软件设计师的经历
本人科班出身,工作后公司鼓励考,21年3月份报名,5月底考试,用了一个月时间复习,7月查成绩飘过,之前表示如果过了就做个总结帖,现在兑现诺言
快拿我的速效救心丸来
含金量?IT这行认证满天飞,但基本都没什么实际用处,大多都属于花钱买证的性质,像这种的含金量还用到处网上搜?高不高的自己心里没点数吗。软考这个证虽然也不怎么样,但别的不说一是国家认证,二是实打实考的。多的也不说了,既然决心要考一个了,那就认真备考吧,进入做功课环节,一贴一条龙服务,建议收藏
引用信息摘取官网,可以直接空降查看
官网地址中国计算机技术职业资格网www.ruankao.org.cn
报考要求
报考任何级别不需要学历、资历条件,只要达到相应的专业技术水平就可以报考相应的级别
翻译一下就是没什么限制,想考就能考
报考条件
考试要求 (1)掌握数据表示、算术和逻辑运算; (2)掌握相关的应用数学、离散数学的基础知识; (3)掌握计算机体系结构以及各主要部件的性能和 ...
单例模式
设计模式源码git地址:design-pattern-src: 设计模式源码 (gitee.com)
什么是单例模式
使用场景
常见的应用场景
实现套路
八大实现方式
什么是单例模式单例模式指某个类中只存在一个对象实例,创建对象的,属于创建者模式
使用场景对于一些频繁创建销毁的对象来说,创建对象耗时或者消耗资源多,工具类对象
常见的应用场景①Runtime类
12345678910111213141516171819public class Runtime { private static Runtime currentRuntime = new Runtime(); /** * Returns the runtime object associated with the current Java application. * Most of the methods of class <code>Runtime</code> are instance * methods and must be invoked w ...
原型模式
设计模式源码git地址:design-pattern-src: 设计模式源码 (gitee.com)
什么是原型模式
使用场景
常见应用场景
什么是浅拷贝?
什么是深拷贝?
两种拷贝方式怎么实现?
什么是原型模式原型模式就是去克隆对象,又涉及到创建对象了,为创建者模式
使用场景1、类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等,原型可以简化创建过程,提高创建效率
2、需要对对象中的部分属性进行修改,而其他属性不需要改变
常见应用场景spring中的bean对象创建
1<bean id="hi" class="com.test.Hi" init-method="init" scope="prototype">
其方法实现(摘取部分)来源于抽象类AbstractBeanFactory
1234567891011121314151617181920212223242526272829303132if (mbd.isSingleton()) { sharedInstan ...
工厂模式
设计模式源码git地址:design-pattern-src: 设计模式源码 (gitee.com)
引子
使用场景
常见应用场景
场景案例
常规思路
简单工厂模式
工厂方法模式
抽象工厂模式
引子相信大家也经常在spring中见到xxxFactoty的字样,工厂模式也算是一个比较常用的设计模式,很有必要掌握
工厂模式分为三种,简单工厂,工厂方法,抽象工厂。其中简单工厂不属于23种设计模式
使用场景不想直接new对象,如果类改变,需要改代码,如果依赖该类的很多,那将是很痛苦的事情
常见应用场景spring中的工厂模式的继承图,之后文章中分析
场景案例假如要生产电脑,比如华为,苹果电脑,如何实现业务?
常规思路定义属性,创建方法,调用展示。
伪代码,一个类就可以实现,给我A创建A电脑,给B创建B电脑
12345if("A".equlas(type)) { //生产A电脑} else if("B".equlas(type)) { //生产B电脑}
假设在添加一个C电脑
1234567if(& ...
建造者模式
什么是建造者模式
解决了什么问题
使用场景
常见的实现场景
场景案例
使用流行的建造者模式解决问题
不适用建造者模式解决问题
使用传统的建造者模式解决问题
什么是建造者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。
解决了什么问题该模式解决的是如何将一个复杂对象(属性多)赋值的问题
使用场景大家想想,平时如何一个对象赋值?
1、构造器
平时常用的方式,虽然构造器用起来很方便,但随着属性增多,那么需要写的构造器也会增多多,而且容易传混
2、set方式
缺点:对象状态易发生变化,也是一长串,实现起来不美观
常用的实现场景①lombok中的@Builder注解
比如刚才House对象
123456@Builderpublic class House { private String base; private String wall; private String cell;}
在编译后(与我们手动实现的相似)
12345678910111213141516171819202 ...
桥接模式
设计模式源码git地址:design-pattern-src: 设计模式源码 (gitee.com)
这是一个不常用的设计模式,了解核心思想即可
什么是桥接模式
应用场景
场景举例
Java实现
什么是桥接模式1、将抽象部分与实体部分分离
2、处理多个独立变化的维度,在抽象层建立关联,其中抽象类作为桥
3、通过构造函数的方式将接口传入实现联系
应用场景JDBC多种驱动的实现
场景举例目前有支付方式wx支付与zfb支付,有解锁方式人脸识别与指纹解锁
现需要两种方式结合的方式才能完成付款功能,如何进行实现?
如果采用传统的方式,可得到类图
此时如果加一个云闪付,那么需要增加3个类,增加一个密码解锁需要增加2个类
这个只是最简单的举例,实际业务远比这复杂得多,可以想象到,如果进行扩展,就很容易出现类爆炸的情况,这个时候使用桥接模式,可以很好的应对这种情况
传统方式的源码可以去git查看,这里就不贴了
桥接模式的类图
可以看到解锁抽象类当作桥,用于连接支付接口,扩展十分方便
Java实现支付接口
123public interface IPay { void pay ...
代理模式
设计模式源码git地址:design-pattern-src: 设计模式源码 (gitee.com)
日常生活中常见的代理比如说老板秘书,明星经纪人,本来是老板或明星的活,代理就都给干了,除此之外,还可能多做一些额外的,比如帮明星筹建演唱会,打官司,做公关之类的
为什么需要代理模式
代理模式种类
应用场景
静态代理
动态代理
cglib代理
总结
为什么需要代理模式1、客户端可能无法直接操作对象(在另一台机器),那么可以在客户端建立一个代理对象,然后客户端直接调用目标对象,代理对象在与目标对象建立联系
2、需要加强目标对象的功能。有人表示为什么不在当初的类中加好,要使用代理来补充。单一职责要求一个类的功能尽可能单一,而且增强的功能大多都是与之前业务不同,比如增加日志输出,权限判断等,本来就不应该由之前的类去承担
种类静态代理,动态代理(jdk代理/接口代理),cglib代理
在《精通Spring4.x 企业应用开发实战》给出建议
单例使用cglib,多例使用jdk
原因:jdk创建对象性能高于cglib,而生成对象的运行性能却比cglib低
应用场景最常见的就是spring的AOP ...