六大设计模式原则-里氏替换原则
热衷学习,热衷生活!😄
沉淀、分享、成长,让自己和他人都能有所收获!😄
一、里氏替换原则定义里氏替换原则是实现开闭原则的重要方式之一,定义如下:里氏替换原则(Liskov Substitution Principle,LSP):继承必须确保超类所拥有的性质在子类中必须仍然成立。
里氏替换原则讲述了有关继承的一些原则,定义了什么时候该用继承,什么时候不该用继承。里氏替换原则是继承复用的基础,反应了父类和子类之间的关系,是对开闭原则的补充,是对实现抽象化的具体步骤的规范。
二、里氏替换原则的作用里氏替换原则的作用主要如下:
里氏替换原则是实现开闭原则的重要方式之一。
克服了继承中重写父类造成的可复用性变差的缺点。
是动作正确性的确保,即类的扩展不会给已有的系统造成错误,降低代码代码出错的可能性。
加强程序的健壮性,同时做到非常好的兼容性,提高程序的维护性、可扩展性,降低需求变更带来的风险。
三、里氏替换原则的实现方法里氏替换原则通俗的讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说,子类继承父类的时候,除了添加新的方法扩展功能之外,尽量不要重写父类的方法。
根 ...
六大设计模式原则-开闭原则
热衷学习,热衷生活!😄
沉淀、分享、成长,让自己和他人都能有所收获!😄
一、开闭原则定义开闭原则是面向对象的可复用设计的第一块基石,是最重要的面向对象设计原则。定义如下:
开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
在开闭原则的定义中,这个软件实体可以是一个软件模块、一个由多个类组成的局部结构或者一个独立的类。
二、开闭原则描述任何系统都需要面临一个很重要的问题,就是它们的需求会随着时间的推移而发生变化。当软件系统需要面对新的需求时,我们应该尽量保证系统的设计架构是稳定的。如果一个软件系统满足开闭原则,那么它可以非常方便的进行扩展,而且可以在不修改先有代码的前提下进行扩展,使得软件系统在拥有适应性和灵活性的同时具有很好的稳定性和扩展性。随着软件规模越来越大,软件寿命越来越大,软件维护成本越来越高,设计满足开闭原则的软件系统也越来越重要。
为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键。在实际开发中,可以为系统定一个相对稳定的抽象层,而将不同的实现 ...
六大设计模式原则-单一职责原则
热衷学习,热衷生活!😄
沉淀、分享、成长,让自己和他人都能有所收获!😄
一、单一职责原则定义单一职责原则是面向对象五个基本原则(SOLID)之一,也是最简单的面向对象设计原则,用于控制类的颗粒大小。单一职责定义如下:
单一职责原则(SRP:Single responsibility principle):一个类只负责一个功能领域中的相应职责,也可以定义为:一个类应该只有一个发生变化的原因。
二、单一职责原则描述单一职责原则告诉我们:一个类不能太”累”,在一个系统中,如果一个类(大到模块,小到方法)承担的职责越多,那么它被复用的可能性就越小,而且耦合度很高,如果当其中一个职责发生改变时,可能会影响到其他职责,所以我们在设计开发的时候应该讲这些职责进行分离,将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中,如果多个职业总是同时发生变化则可将他们封装在同一类中。
单一职责原则是实现高内聚、低耦合的指导方针,它是最简单但是又是最难运用的原则,需要设计人员发现类的不同职责并将其进行分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关的实践经验。(希望我们都能成 ...
String类详解
热衷学习,热衷生活!😄
沉淀、分享、成长,让自己和他人都能有所收获!😄
一 String描述1234public final class String implements java.io.Serializable, Comparable<String>, CharSequence { private final char value[]; ...}
String是一个用final声明的常量类,不能被任何类继承,底层是由char[]数组实现,这个数组也是final,一旦String对象被创建,包含这个对象中的字符序序列是不可被改变的,改类后续的所有方法都是不能改变该对象的,直至该对象被销毁(该类的有些方法看似改变了字符串比如substring、replace等,其实都是内部创建了一个新的字符串)。实现了Serializable系列化接口,实现了Comparable接口,用于比较两个字符串的大小(按顺序比较单个字符的ASCII码),最后实现CharSequence表示是一个有序字符的集合。
二 创建方法String最常用的创建方法 ...
HashCode & HashMap扰动函数
热衷学习,热衷生活!😄
沉淀、分享、成长,让自己和他人都能有所收获!😄
1.HashCode为什么用31作为乘数?String.class的hashCode方法如下:
1234567891011public int hashCode() { int h = hash; if (h == 0 && value.lengt > 0) { char[] val = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i] } hash = h } return h;}
上面方法中有一个写死固定值31,想必大家在看String的hashCode方法源码时都会有这个疑问,为什么是31?
hash函数必须选用质数,这是被科学家论证过的hash函数减少冲突的理论。
如果乘数是偶数,并且乘法溢出的话,信息就会丢失,因为使用偶数 ...
Github上传本地项目
热衷学习,热衷生活!😄
沉淀、分享、成长,让自己和他人都能有所收获!😄
1.选择项目,右键Git Bash Here(需要安装Git)
2.在Git命令窗口输入git init命令之后,会生成一个.git文件夹
1git init
3.输入git add . 命令将全部的文件添加到缓存去(注意这个”.”,是有空格的,”.”代表这个test这个文件夹下的目录全部都提交。你也可以通过git add 文件名 提交指定的文件)。
1git add .
4.输入git commit -m “这里是注释”,把文件提交到本地仓库
1git commit-m "初始化项目"
5.连接远程仓库,克隆自己的github项目地址,比如为https://gitcode.net/CreativeAlliance/lottery-1195-qingtian.git,输入命令。连接过程中需要输入github账号密码
1git remote add origin https://gitcode.net/CreativeAlliance/lottery-1195-qing ...
Hexo搭建个人博客(一)
热衷学习,热衷生活!😄
沉淀、分享、成长,让自己和他人都能有所收获!😄
什么是Hexo?Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。
安装Hexo前提安装 Hexo 相当简单,只需要先安装下列应用程序即可:
Node.js (Node.js 版本需不低于 10.13,建议使用 Node.js 12.0 及以上版本)
Git
成功安装好Git,Node.js之后可以使用下面命令行查看版本。
12git --versionnode -v
安装HexoGit和Nodejs安装好后,就可以安装Hexo了,你可以先创建一个文件夹blog,然后cd到这个文件夹下(或者在这个文件夹下直接右键git bash打开)
输入以下命令安装Hexo
1npm install -g hexo-cli
安装完成之后输入hexo -v查看一下版本
1hexo -v
安装 Hexo 完成后,请执行下列命令,Hexo 将会在指定文件夹中新建所需要的文件。folder是自己建的文件夹,也可以建好文件夹然 ...
Java中ArrayList和LinkedList的区别
热衷学习,热衷生活!😄
沉淀、分享、成长,让自己和他人都能有所收获!😄
两者数据结构不同,ArrayList是基于数组实现、LinkedList是基于双向链表实现。从获取、删除、插入、内存开销这几个点来说明两者的区别。
1、 获取:ArrayList的获取比LinkedList获取相比非常快,因为ArrayList的get方法的时间复杂度为O(1),而LinkList的为O(n)。
ArrayList的get方法源码:
123456789public E get(int index) { rangeCheck(index); return elementData(index);}E elementData(int index) { // 直接下标获取数组值, 时间复杂度为O(1) return (E) elementData[index];}
LinkList的get方法源码:
12345678910111213141516171819public E get(int index){ ch ...
双端队列ArrayDeque、LinkedList
热衷学习,热衷生活!😄
沉淀、分享、成长,让自己和他人都能有所收获!😄
一、前言Stack栈:先进后出
Queue队列:先进先出
在Java里有一个Stack类,但是这个类已经不推荐使用了,而Queue是一个接口,当我们需要使用栈和队列时,推荐使用更加高效的ArrayDeque该类实现Deque接口,次选使用LinkedList。
二、总体介绍要讲栈和队列,首先要讲Deque接口。Deque的含义是”double ended queue”,即双端队列,既可以当栈使用,也可以当队列使用。
下表列出Deque和Queue相对应的接口:
Queue 方法
Deque 方法
说明
add(e)
addLast(e)
向队尾插入元素,失败则抛出异常
offer(e)
offerLast(e)
向队尾插入元素,失败则返回false
remove()
removeFirst()
获取并删除队首元素,失败则抛出异常
poll()
pollFirst()
获取并删除队首元素,失败则返回null
element()
getFirst()
获取但不删除队首元素,失败则抛出 ...
位运算
热衷学习,热衷生活!😄
沉淀、分享、成长,让自己和他人都能有所收获!😄
符号
描述
栗子
&
与运算,两个位都为1时,结果为1,否则为0
比如2 & 3,2的二进制为10,3的二进制为11,与运算为10,转成十进制为2
|
或运算,两个位都为0时,结果为0,否则为1
比如2 | 3,2的二进制为10,3的二进制为11,或运算为11,转成十进制为3
^
异或运算,两个位相同为0,不相同为1
比如2 ^ 3,2的二进制为10,3的二进制为11,与或运算为01,转成十进制为1
~
取反运算,1变0,0变1
比如~2 ,2的二进制为10,取反运算为01,转成十进制为1
>>
按位右移运算,高位补0
比如10>>2,10的二进制为1010,往右移2位高位补0为0010,转成十进制就为2
<<
按位左移运算,低位补0
比如10<<2,10的二进制为1010,往左移2位低位补0为101000,转成十进制为40
>>>
按位右移补0操作运算
比如10>>>2, ...