自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 收藏
  • 关注

原创 排序算法(冒泡、选择、插入)

​比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。空间复杂度:是指算法在计算

2020-12-09 13:22:00 162

原创 MySQL执行一条查询语句的内部执行过程

MySQL执行一条查询语句的内部执行过程客户端(运行程序)先通过连接器连接到MySQL服务器连接器通过数据库权限身份验证后,先查询数据库缓存是否存在(之前执行过相同条件的SQL查询),如果有会直接返回缓存中的数据。如果没有则会进入分析器进入分析器后会对查询语句进行语法的分析,判断该查询语句SQL是否存在语法错误,如果存在查询语法错误,会直接返回给客户端错误,如果正确会进入优化器优化器会对查询语句进行优化处理:如:如果一条语句用到了多个索引会判断哪个索引性能更好最终会进入执行器,开始执行查询语句直

2020-11-24 09:20:50 850

原创 Git常用命令

新建代码库在当前目录新建一个Git代码库git init 初始化为master分支新建一个目录,将其初始化为Git代码库git init [project-name]克隆远程代码库到本地git clone [url]Git配置显示当前的Git配置git config --list设置系统用户git config --system user.name "zhangsan"git config --system user.email "zhangsan@1

2020-11-22 10:28:24 78

原创 排序算法:希尔、归并

​本篇主要讲解的是归并排序的自顶向下及自底向上的实现和优化。1959年Shell发明,第一个突破O(n²)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。希尔排序就是插入排序的延伸,在插入排序中每一次都和之前的一个元素进行比较,而希尔排序尝试每次和之前第h个元素进行比较,这样通过将h从一个很大的值逐渐缩小到1,一步一步的将完全无序的数组变成近乎有序的数据-》变成有序性更强的数组,最后当h等于1的时候变成一个排好序的数组。in

2020-12-18 11:09:19 316 1

原创 Zookeeper

分布式协调技术分布式协调技术主要用来解决分布式环境当中多个进程之间的同步控制,让它们有序的去访问某种临界资源,防止造成"脏数据"的后果。在这图中有三台机器,每台机器各跑一个应用程序。然后我们将这三台机器通过网络将其连接起来,构成一个系统来为用户提供服务,对用户来说这个系统的架构是透明的,他感觉不到我这个系统是一个什么样的架构。那么我们就可以把这种系统称作一个分布式系统。在这个分布式系统中如何对进程进行调度,我假设在第一台机器上挂载了一个资源,然后这三个物理分布的进程都要竞争这个资源,但我们又不希望他

2020-11-27 10:38:42 151

原创 【第14条】考虑实现Comparable接口

考虑实现Comparable接口与本章中讨论的其他方法不同,compareTo方法并没有在Object 类中声明。相反,它是Comparable 接口中唯一的方法。compareTo方法不但允许进行简单的等同性比较,而且允许执行顺序比较,除此之外,它与Object的equals方法具有相似的特征,它还是个泛型(generic)。类实现了 Comparable接口,就表明它的实例具有内在的排序关系 (natural ordering)。为实现Comparable接口的对象数组进行排序就这么简单:Array

2020-11-13 17:04:02 297

原创 ​【第13条】谨慎地覆盖clone

谨慎地覆盖cloneCloneable接口的目的是作为对象的一个mixin接口(mixin interface)(详见第20条),表明这样的对象允许克隆(clone)。遗憾的是,它并没有成功地达到这个目的。它的主要缺陷在于缺少一个clone方法,而Object的clone方法是受保护的。如果不借助于反射(reflection)(详见第65条),就不能仅仅因为一个对象实现了Cloneable,就调用clone方法。即使是反射调用也可能会失败,因为不能保证该对象一定具有可访问的clone方法。尽管存在这样或那

2020-11-13 16:56:50 225

原创 【第12条】坚持覆盖toString

始终要覆盖toString虽然Object提供了 toString方法的一个实现,但它返回的字符串通常并不是类的用户所期望看到的。它包含类的名称,以及一个“@”符号,接着是散列码的无符号十六进制表示法,例如PhoneNumber@163b91。toString的通用约定指出,被返回的字符串应该是一个“简洁的但信息丰富,并且易于阅读的表达形式”。尽管有人认为 PhoneNumber@163b91算得上是简洁和易于阅读了,但是与707-867-5309比较起来,它还算不上是信息丰富的。toString约定进一

2020-11-10 17:14:53 302 1

原创 【第10条】请遵守通用约定覆盖equals

覆盖equals时请遵守通用约定覆盖 equals 方法看起来似乎很简单,但是有许多覆盖方式会导致错误,并且后果非常严重 最容易避免这类问题的办法就是不覆盖 equals 方法,在这种情况下,类的每个实例都只与 自身相等 如果满足了以下任何一个条件,这就正是所期望的结果:类的每个实例本质上都是唯一的。 对于代表活动实体而不是值(value)的类来说确实如 ,例如 Thread。Object 提供的 equals 实现对于这些类来说正是正确的行为。类没有必要提供“逻辑相等”( logical equa

2020-11-10 16:57:34 178

原创 【第9条】try-with-resources优先于try-finally

try-with-resources优先于try-finallyJava类库中包含许多必须通过调用close方法手动关闭的资源。例如InputStream,OutputStream和java.sql.Connection。客户经常会忽略资源的关闭,造成严重的性能后果也就可想而知了。虽然这其中的许多资源都是用终结方法作为安全网,但是效果并不理想(详见第8条)。根据经验,try-finally语句是确保资源会被适时关闭的最佳方法,就算发生异常或者返回也一样// t...

2020-11-04 17:24:15 837

原创 【第8条】避免使用终结方法和清除方法

避免使用终结方法和清除方法最终方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的。它们的使用会导致不稳定的行为,糟糕的性能和移植性问题。Finalizer机制有一些特殊的用途,我们稍后会在这个条目中介绍,但是通常应该避免它们。从Java 9开始,Finalizer机制已被弃用,但仍被Java类库所使用。Java 9中Cleaner机制代替了Finalizer机制。清除方法没有终结方法那么危险,但仍然是不可预测、运行缓慢,一般情况下也是不必要的...

2020-11-04 17:22:44 227

原创 【第7条】消除过期的对象引用

消除过期的对象引用当你从手工管理内存的语言(比如C或C++)转换到具有垃圾收集功能的比如Java语言时,程序员的工作会变得更加容易,因为当你用完了对象之后,它们会被自动回收。当你第一次经历对象回收功能的时候,会觉得这简直有点不可思议。它很容易给你留下这样的印象,认为自己不再需要考虑内存管理的事情了,其实不然。考虑以下简单的栈实现:// Can you spot the "memory leak"? public class Stack { private Object[] eleme.

2020-11-04 17:20:59 106

原创 【第6条】避免创建不必要的对象

避免创建不必要的对象一般来说,最好能重用单个对象,而不是在每次需要的时候就创建一个相同功能的新对象。重用方式既快速,又流行。如果对象是不可变的(immutable)(详见第17条),它就始终可以被重用作为一个极端的反面例子,看看下面的语句:String s = new String("bikini"); // DON'T DO THIS!语句每次执行时都会创建一个新的String实例,而这些对象的创建都不是必需的。String构造方法("bikini")的参数本身就是一...

2020-11-04 17:20:23 169

原创 【第5条】优先考虑依赖注入来引用资源

优先考虑依赖注入来引用资源许多类依赖于一个或多个底层资源。例如,拼写检查器依赖于字典。将此类类实现为静态工具类并不少见:// Inappropriate use of static utility - inflexible & untestable! public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} // Nonins...

2020-11-04 17:18:52 164

原创 【第4条】通过私有构造器强化不可实例化的能力

通过私有构造器强化不可实例化的能力偶尔你会想写一个只包含静态方法和静态字段的类。这些类的名声非常不好,因为有些人滥用这些类从而避免以面向对象方式思考从而编写过程化的程序,但是它们确实有着特殊的用途。它们可以用来按照java.lang.Math或java.util.Arrays的方式,把基本类型的值或数组类型上的相关方法组织起来。我们也可以通过java.util.Collections的方式,把实现特定接口上面的静态方法进行分组,也包括工厂方法。(从Java 8开始,你也可以将这些方...

2020-11-04 17:17:16 105

原创 【第3条】用私有构造器或者枚举类型强化Singleton属性

用私有构造器或者枚举类型强化Singleton属性单例是一个仅实例化一次的类。单例对象通常表示无状态对象,如函数或一个本质上唯一的系统组件。使类称为Singleton会使它的客户端测试变得十分困难,因为不可能给Singleton替换模拟实现,除非实现一个充当其类型的接口有两种常见的方法来实现单例。两者都基于保持构造方法私有和导出公共静态成员以提供对唯一实例的访问。在第一种方法中,成员是final修饰的属性:// Singleton with public final field pu...

2020-11-03 11:19:09 159

原创 【第2条】遇到多个构造器参数时要考虑使用构建器

当构造方法参数过多时使用builder模式静态工厂和构造器有个共同的局限性:它们都不能很好地扩展到大量的可选参数。比如用一个类表示包装食品外面显示的营养成分标签。这些标签中有几个域是必需的:每份的含量、每罐的含量以及每份的卡路里。还有超过20个的可选域:总脂肪量、饱和脂防量、转化脂防、胆固醇、钠,等等。大多数产品在某几个可选域中都会有非零的值。对于这样的类,应该用哪种构造器或者静态工厂来编写呢?程序员一向习惯采用重叠构造器(telescopingconstructor)模式,在这种模式下,提..

2020-11-03 11:12:13 240

原创 【第1条】用静态工厂方法代替构造器

考虑使用静态工厂方法替代构造方法一个类允许客户端获取其实例的传统方式,是提供一个公共构造方法。其实,还有另一种技术应该成为每个程序员工具箱的一部分。一个类可以提供一个简单的、只返回该类实例的公共静态工厂方法。下面是一个Boolean简单的例子( 基本类型boolean的包装类)。此方法将基本类型boolean转换为Boolean对象引用:public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Bo...

2020-11-03 11:03:31 160

原创 玩转设计模式:单例模式

单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点应用场景优点由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决常见的五种单例模式实现方式饿汉式: 线程安全,调用效率高,不能延时加载懒汉式: 线程安全,调用效率不高,可以延时加载双重检测锁: 由于JVM底层内部模型原因,偶尔会出问题,不建议使用静态内部类: 线程安全,调用效率高,可以延时加

2020-08-10 22:44:59 84

原创 设计模式总体概述

设计模式分类创建型模式(五种): 单例模式、工程方法模式、抽象工厂模式、建造者模式、原型模式结构型模式(七种): 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式行为型模式(十一种): 策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式创建模式:用于创建对象单例模式(Singleton)保证一个类只有一个实例,并且提供一个访问该实例的全局访问点工程方法模式(FactoryMethod)定

2020-08-10 21:16:43 103

原创 为什么要学习设计模式

为什么要学习设计模式首先给大家分享一句话放眼未来,拥抱变化,是非常值得推荐的,反之,也可以用另一种思路看待问题,放眼未来,关注不变的东西,进而抓住事物的本质显然学习设计模式就是在变化中寻求不变,设计模式是经过沉淀的东西。从编程的角度来说:设计模式是一套被反复使用的、多数人知晓的、经过分类编程的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式本质就是设计原则的落地,而设计原则的本质就是经验。经验是我们在历史劳动中对实践的总结,来指导我们当下或未来把

2020-08-10 21:16:07 589 1

原创 面向对象设计原则-迪米特法则

迪米特法则(Law of Demeter, LoD)一个软件实体应当尽可能少的与其他实体发生相互作用如果一个系统符合迪米特法则,那么当其中某一个模块发生修改时,就会尽量少地影响其他模块,扩张相对容易,这是对软件实体之间通信的限制,迪米特法则要求限制软件实体之间通信的宽度和深度。迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系迪米特法则还有几种定义形式,包括:不要和“陌生人”说话、只与你的直接朋友通信等,在迪米特法则中,对于一个对象,其朋友包括以下几类:当前对象本身(this)以参

2020-08-08 22:01:33 171

原创 充分了解UML类图

UML(Unified Modeling Language)统一建模语言由于UML类图的精确、无歧义、完整的建模,通常我们通过使用UML类图来详细的描述系统中的对象和他们的关系。认识UML类图也能帮助我们快速了解、理清系统中对象之间的关系类图表示方式在UML类图中,包含类名、属性和方法三块如下图所示,包含了name、age、email三个属性以及方法userInfo()属性和方法前面的符号表示了可见性,UML类图中表示可见性的符号如下+ : 表示public- : 表示private#

2020-08-08 10:28:33 272

原创 CentOS7下Kafka环境安装(二)

上一章:Kafka基本概念(一)安装Kafka需要保证有zookeeper环境和JDKJDK安装百度云: https://pan.baidu.com/s/1LDpCDV4teuC1wqTunRUEXQ 提取码:jjl9解压: tar -zxvf jdk-8u152-linux-x64.tar.gz -C /opt/soft配置环境变量: vim /etc/profileJAVA_H...

2020-02-23 11:07:39 265

原创 Kafka基本概念(一)

borker: Kafka的服务器端由被称为broker的服务进程构成,即一个Kafka集群由多个broker组成  borker负责接收和处理客户端发送过来的请求,以及对消息进行持久化  虽然多个borker进程能够运行在同一台机器上,但更常见的做法是将不同的borker分散运行在不同的机器上,这样如果集群中某一台机器宕机,其他机器上的borker也依然能够对外提供服务topic: 相当于...

2020-02-22 18:30:11 266

转载 Springboot整合Elasticsearch快速入门

1 前奏Elasticsearch提供的Java客户端有一些不太方便的地方:很多地方需要拼接Json字符串,在java中拼接字符串有多恐怖你应该懂的需要自己把对象序列化为json存储查询到结果也需要自己反序列化为对象因此,我们这里就不讲解原生的Elasticsearch客户端API了。而是学习Spring提供的套件:Spring Data Elasticsearch1.1 简介...

2020-02-13 10:53:52 426

原创 面向对象设计原则-合成复用原则

合成复用原则(Composite Reuse Principle,CRP)  合成复用原则又叫组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP)。它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。   如果要使用继承关系,则必须严格遵循里氏替换原则。 合成复用原则同里氏替换原则相辅相成的,两者都是...

2020-01-26 22:23:33 297

原创 迪米特法则

迪米特法则(Law of Demeter,LoD)  迪米特法则又叫作最少知识原则(Least Knowledge Principle,LKP)迪米特法则的定义是:只与你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to strangers)。其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可...

2020-01-26 22:19:03 1064

原创 面向对象设计原则-接口隔离原则

接口隔离原则(Interface Segregation Principle,ISP)  接口隔离原则要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。  客户端不应该被迫依赖于它不使用的方法(Clients should not be forced to depend on methods they do not use)。该原则还有另外一个定义:一个...

2020-01-26 22:15:03 134

原创 面向对象设计原则-单一职责原则

单一职责原则(Single Responsibility Principle,SRP)  单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分(There should never be more than one reason for a class to change)。  该原则提出对象不应该承担太多职责,如果一个对象承担了太多的职责,至少存在以下两个缺点:    ...

2020-01-26 22:10:05 164

原创 面向对象设计原则-依赖倒置原则

依赖倒置原则(Dependence Inversion Principle,DIP)   依赖倒置原则的原始定义为:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象(High level modules shouldnot depend upon low level modules.Both should depend upon abstraction...

2020-01-26 22:03:53 166

原创 面向对象设计原则-里氏替换原则

里氏替换原则(Liskov Substitution Principle,LSP)  继承必须确保超类所拥有的性质在子类中仍然成立(Inheritance should ensure that any property proved about supertype objects also holds for subtype objects)。    里氏替换原则主要阐述了有关继承的一些原则...

2020-01-26 10:48:11 276

原创 面向对象设计原则-开闭原则

  在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。我们将在下面的几节中依次来介绍这 7 条原则,本节首先介绍开闭原则。开闭原则(Open Closed Principle,OCP)   软件实体应当对扩展开放,对修改关闭(Software entities should ...

2020-01-26 10:34:51 243

原创 Apache Dubbo配置文件

dubbo:service 服务提供者暴露服务配置,对应的配置类:org.apache.dubbo.config.ServiceConfig 服务发现 interface:服务接口名 ref :服务 对象实现 引用 version : 服务版本,建议使用两位数字版本,如:1.0,通常在接口不兼容时版本号才需要升级,默认值0....

2019-06-28 23:17:34 1419

原创 JVM-运行时数据区域

  java虚拟机管理的内存包括几个运行时数据内存:方法区、虚拟机栈、本地方法栈、堆、程序计数器、其中方法区和堆是由线程共享的数据区,其他几个是线程隔离的数据区。程序计数器、虚拟机栈、本地方法栈,随线程而生,线程亡而亡程序计数器  程序计数器是一块较小的内存,可以看作是当前线程所执行的行号指示器。  字节码解释器工作的时候通过改变这个计数器的值来选取下一条需要执行的字节码的指令、分支、循环、...

2019-06-07 19:45:48 78

原创 MyBatis N+1问题(在页面每条相同的结果只显示一遍)

<association property="appVersion" column="versionId" select="cn.appsys.mapper.AppVersionMapper.selById" javaType="cn.appsys.pojo.AppVersion"></association>当使用级联查询的时候,mybatis会先查询出所有符合条件的...

2019-05-28 14:22:07 204

原创 StringUtils工具类常用方法

添加依赖<dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version></dependency>常用方法空串检查Stri...

2019-05-05 20:00:32 3760 1

原创 Sping MVC

概述Spring为展现层提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架之一SpringMVC通过一套MVC注解,使一个Java类成为处理请求的控制器,而无须实现任何接口支持REST风格的URL请求采用了松耦合可插拔组件结构,比其他的MVC框架更具扩展性和灵活性一种轻量级的,基于MVC的web层应用框架,偏前端而不是基于业务逻辑层.Spring框架的一个后续产品Sp...

2019-05-04 11:25:41 218

转载 XP极限编程

敏捷方法论有一个共同的特点,那就是都将矛头指向了“文档”,它们认为传统的软件工程方法文档量太“重”了,称为“重量级”方法,而相应的敏捷方法则是“轻量级”方法。正是因为“轻量级”感觉没有什么力量,不但不能够有效体现灵活性,反而显得是不解决问题的方法论似的。因此,就有了一次划时代的会议,创建了敏捷联盟。在敏捷方法论领域中,比较知名的、有影响力的,是拥有与Microsoft的操作系统相同缩写语——XP...

2019-04-29 23:07:38 427

原创 LeetCode简单难度题解(二)

35、搜索插入位置循环数组 从后往前找,当匹配到第一个比目标值小的那个元素下标的时候 返回下标+1就是目标值要插入的位置,如果有正好匹配的值 直接返回下标public int searchInsert(int[] nums, int target) { for(int i = nums.length - 1; i >= 0; i--){ if(nums[i...

2019-04-29 19:13:32 331

空空如也

空空如也

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

TA关注的人

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