自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 设计模式——组合模式

组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。透明方式在Component中声明所有用来管理子对象的方法,其中包括Add、Remove等。这样实现Component接口的所有子类都具备了Add和Remove。这样做的好处就是叶子节点和枝节点对于外界没有区别,它们具备完全一致的行为接口。但也存在着问题,即对于叶子节点来说,本身不具备Add和Remove功能,所以实现它是没有意义的。安全方式在Component接口中不去

2021-01-04 21:34:41 216 1

原创 (JAVA)剑指offer 15 二进制中1的个数

题目描述位运算:因为除法的效率比移位运算要低得多,在实际编程中应尽可能地用移位运算符代替乘除法。请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如,把9表示成二进制是1001,有2位是1,即应输出2.解法:把一个整数减去1后再和原来的数做&运算,得到的结果相当于把整数的二进制中最右边的1变成0. private static int intNumberOf1(int n){ // 注意防止负数右移出现死循环 int

2021-01-04 15:26:02 157

原创 (JAVA)剑指Offer 14 剪绳子——动态规划/贪婪算法介绍

动态规划常用场景:求一个问题的最优解(通常是最大值或最小值),而且该问题能够分解成若干个子问题,并且子问题之间还有重叠的更小子问题,就可以考虑使用动态规划来解决。特点1:求解(子)问题的最优解特点2:整体问题的最优解是依赖各个子问题的最优解特点3:将大问题分解成若干个小问题,这些小问题之间还有相互重叠更小的子问题特点4:从上往下分析问题,从下往上求解问题一般来说从解决最小问题开始,并把已经解决的子问题的最优解存储下来(置于一维或二维数组中),并把子问题的最优解组合起来逐步解决整体问题。

2021-01-02 17:06:17 189

原创 设计模式——备忘录模式

备忘录模式在不破坏封装性的前提下,捕获一个对象的内在状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态Originator类class Originator{ private String state; // 关于对象属性的set get方法.... // 创建备忘录,将当前需要保存的信息导入并实例化出一个Memento对象 public Memento CreateMemento(){ return (new Memento(state)); } // 恢复

2021-01-02 15:50:43 225 2

原创 JAVA面试——内部类

定义在类内部的类称为内部类。内部类根据不同的定义方式,可分为静态内部类/成员内部类/局部内部类和匿名内部类。静态内部类 定义在类内部的静态类成为静态内部类。静态内部类可以访问外部类的静态变量和方法;在静态内部类中可以定义静态变量/方法/构造函数等;静态内部类通过“外部类.静态内部类”的方式调用。 public class OuterClass{ private static String className = "StaticInnerClass"; public static clas

2021-01-02 11:42:21 185

原创 Java面试——反射机制

Java是一种半动态语言,动态语言是程序在运行时可以改变其结构的语言,比如新的属性或方法的添加/删除等结构上的变化。Javascript/Ruby/Python等都属于静态语言;C/C++不属于静态语言。反射机制反射机制指在程序运行过程中,对任意一个类都能获取其所有属性和方法,并且对任意一个对象都能调用其任意一个方法。这种动态获取类和对象的信息,以便动态调用对象的方法的功能成为Java语言的反射机制。Java中的对象有两种类型:编译时类型和运行时类型。编译时类型指在声明对象时所采用的类型运

2020-12-31 15:34:07 78

原创 Java面试——异常分类及处理

异常是指在方法不能按照正常方式完成时,可以通过抛出异常的方式退出该方法。在异常中封装了方法执行过程中的错误信息及原因,调用方在获取该异常后可根据业务的情况选择处理该异常或者继续抛出该异常。异常分类Throwable是所有错误或异常的父类,Throwable又可分为Error和Exception,如上图。Error:Java程序错误,程序启动时出现Error,则启动失败;如果在运行过程中出现Error,则系统将退出进程。出现Error通常是因为系统的内部错误或资源耗尽,Error不能被在运

2020-12-24 10:52:16 115

原创 设计模式——适配器模式

适配器模式将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类一起工作。适配器代码结构Target(客户需要的接口,目标可以是具体或者抽象类,也可为接口)class Target{ public void Request(){ // 普通请求 }}Adaptee(需要适配的类)class Adaptee{ public void SpecificRequest(){ // 特殊请求 }}Adapter(

2020-12-24 09:55:37 81

原创 JAVA面试——集合(容器)

List——可重复ArrayList:基于数组实现、增删慢、查询快、线程不安全内部数据结构基于数组实现,提供了对List的增加(add)、删除(remove)和访问(get)功能。缺点:元素必须连续存储,当需要在ArrayList的中间位置插入或者删除元素时,需要移动大量元素,修改代价较高,故更适合随机查找和遍历的操作。ArrayList不需要在定义时指定数组的长度,在数组长度不能满足存储要求时,ArrayList会创建一个新的更大的数组并将数组中已有的数据复制到新的数组中。Vecto

2020-12-22 10:53:15 83

原创 设计模式——状态模式

状态模式当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了它的类。状态模式解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。优点:将与特定状态相关的行为局部化,并且将不同状态的行为分割开来,可以消除庞大的条件分支语句。当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式。代码结构State类:抽象状态类,定义一个接口来封装与Context的一个

2020-12-19 16:30:19 101 1

转载 设计模式——抽象工厂模式

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。代码实例可以看这篇博客优点易于交换产品系列,由于具体工厂类在一个应用中只需要初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。它让具体的创建实例的过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在代码中。使用反射技术替代繁琐的switch判断等条件判断。为了自己复习方便写的,这篇乱七八糟….

2020-12-18 16:56:32 103 1

原创 设计模式——观察者模式

观察者模式 观察者模式也叫做发布——订阅模式(Publish/Subscribe)模式。 它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。 这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。代码结构Subject类,即主题或者抽象统治者,一般用一个抽象类或者一个接口实现。它把所有对观察者对象的引用保存在一个集合里面,每个主题都可以有任意数量的观察者。abstract class Subject{ private ArrayList<O

2020-12-10 12:24:14 89

原创 剑指offer——单例设计模式

单例模式特点:单例类只能有一个实例单例类必须自己创建自己的唯一实例单例类必须给所有其他对象提供这一实例饿汉式饿汉式单例模式:饿汉就是类一旦加载,就把单例初始化完成,保证getInstance时,单例已经存在饿汉式在类创建的同时就已经创建好了一个静态的对象供系统使用,天生就是线程安全的class SingletonH{ private SingletonH(){} private static final SingletonH single = new Singleton

2020-12-02 12:47:01 136 1

原创 IDEA-SpringBoot任务管理

开发Web应用时,多数应用都具备任务调度功能。常见的任务包括:异步任务、定时任务和发邮件任务。异步任务Web应用开发中,大多数情况都是通过同步方式完成数据交互处理,但是当在处理与第三方系统的交互时,容易造成响应迟缓的情况,之前大部分都是使用多线程完成该类任务,我们还可以使用异步调用的方式解决该问题。根据异步处理方式的不同,可以将异步任务的调用分为无返回值异步任务调用和有返回值异步任务调用。异步任务——无返回值异步任务调用模拟向用户发送验证码的过程Spring框架提供了对异步任务的支持,

2020-11-27 13:02:15 264

原创 设计模式-建造者模式

建造者模式将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们使用了建造者模式,那么用户只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。代码结构Product类-产品类具体对应的产品角色class Product{ List<String> parts = new List<String

2020-11-26 11:30:51 88 1

原创 IDEA-SprinBoot与RabbitMQ整合实现

环境搭建创建SpringBoot项目,选择Web模块中的Web依赖和RabbitMQ依赖及Integration依赖编写配置文件,连接RabbitMQ服务 RabbitMQ介绍安装如果没有在配置文件中配置外部RabbitMQ连接,会启用内部的RabbitMQ中间件,不推荐使用。# 配置RabbitMQ消息中间件连接配置spring.rabbitmq.host=localhostspring.rabbitmq.port=5672spring.rabbitmq.username=gues

2020-11-25 16:07:12 543

原创 IDEA-消息服务和RabbitMQ消息中间件环境搭建

在实际项目开发中,有时候需要与其他系统进行集成完成相关业务功能,这种情况最原始的做法是程序内部相互调用。 除此之外,还可以使用消息服务中间件进行业务处理,使用消息服务中间件能够提升系统的异步通信和扩展解耦能力。消息服务概述使用消息服务可以实现一个高性能、高可用、高扩展的系统,解决了异步处理、应用解耦、流量削峰、分布式事务管理等问题。1.异步处理场景:用户注册后,系统需要将信息写入数据库,并发送注册邮件和注册短信通知。针对该场景,有三种处理方式串行处理方式:用户发送注册请求后,服务器.

2020-11-24 15:47:08 338

原创 IDEA-Spring Security安全管理-自定义用户授权管理

当一个系统建立之后,通常需要适当地做一些权限控制,使得不同用户具有不同的权限操作系统。数据准备等见上一篇博客自定义用户认证用户自定义访问控制实际生产中,网站访问多是基于HTTP请求的,我们可以通过重写WebSecurityConfigurerAdapter类的configure(HTTPSecurity http)方法来对基于Http的请求访问进行控制。configure(HttpSecurity http)方法的参数类型是HttpSecurity类,该类提供了Http请求的限制以及权限、S

2020-11-23 15:55:43 681

原创 设计模式-外观模式

外观模式为子系统中的一组接口提供一个一致的页面,此模式定义了一个高层接口,该接口使该子系统更加容易使用。代码结构如下// 子系统类class SubSystemOne{ public void MethodOne(){ //...具体实现 }}class SubSystemTwo{ public void MethodTwo(){ //...具体实现 }}class SubSystemThree{ public void MethodThree(){ //.

2020-11-22 17:05:34 65

原创 IDEA-Spring Security安全管理-自定义用户认证

针对项目的安全管理,Spring家族提供了安全框架Spring Security,它是一个基于Spring生态圈的,用于提供安全访问控制解决问题的框架。常见的安全管理功能如下: 1.MVC Security是Spring Boot整合Spring MVC搭建Web应用的安全管理框架 2.WebFlux Security是Spring Boot整合Spring WebFlux搭建Web应用的安全管理,继承了其他安全功能优点,有可能越来越流行 3.OAuth2是大型项目的安全管理框架,可实现第三.

2020-11-22 14:07:06 1017 1

原创 设计模式-迪米特法则

迪米特法则——最少知识原则如果两个类不必彼此通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。在类的设计结构上,每一个类都应当尽量降低成员的访问权限即一个类包装好自己的private状态,不需要让别的类知道的字段或行为就不要公开。迪米特法则的根本思想:强调类之间的松耦合类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。...

2020-11-21 16:44:27 56

原创 (JAVA)LeetCode 20 有效的括号

题目描述给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。思路:对于括号的匹配问题,数据结构中已经详细介绍,那就是借助栈的思想-后进先出碰到 ‘(’, ‘{’, ‘[’,入栈 碰到相反的括号那么出栈进行比较代码:class Solution { public boolean isValid(Str

2020-11-21 13:26:46 83

原创 IDEA-SpringBoot整合Redis缓存实现

在SpringBoot中,数据的管理缓存依赖于Spring框架中相关的缓存管理器接口。 如果程序中没有定义类型为cacheManager的Bean组件或者是名为cacheResolver的cacheResolver缓存解析器,SpringBoot将尝试按照指定顺序选择并启用缓存组件。 如果没有任何缓存组件,会默认使用Simple缓存组件进行管理,它是默认的缓存管理组件,默认使用内存中的ConcurrentHashMap进行缓存存储。基于注解的Redis缓存实现基本环境搭建见 上一篇博客Red

2020-11-20 17:13:07 592

原创 (JAVA)LeetCode 234 回文链表

题目描述请判断一个链表是否为回文链表。解法一:思路:遍历链表获得链表的长度,采用栈后进先出的思想,将链表的前半部分入栈,每个元素出栈判断是否与链表的元素(长度为奇数时需要向后遍历一个)相等。查看LeetCode题解:也可以使用双指针法,先将链表元素置于数组中,使用双指针逐个判断是否为回文,时间复杂度和空间复杂度如该解法相同。class Solution { public boolean isPalindrome(ListNode head) { if(head==

2020-11-20 14:56:15 73

原创 (JAVA)LeetCode 198 打家劫舍

题目描述你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。LeetCode解释: 如果房屋数量大于两间,应该如何计算能够偷窃到的最高总金额呢?对于第 k(k>2) 间房屋,有两个选项:偷窃第 k 间房屋,那么就不能偷窃第 k−1 间房

2020-11-19 20:22:44 76

原创 IDEA-SpringBoot默认缓存管理

缓存是分布式系统中的重要组件,主要解决数据库数据的高并发访问问题。Spring Boot 默认缓存管理Spring框架支持透明地向应用程序添加缓存并对缓存进行管理,其管理缓存的核心是将缓存应用于操作数据的方法中,从来减少操作数据的次数,同时不会对程序本身造成任何干扰。项目搭建对应数据库见SpringBoot整合JPA@Entity(name="comment") // ORM实体类,并制定映射的类名public class Comment { @Id //映射的主键id .

2020-11-18 16:42:25 816

原创 (JAVA)LeetCode 1 两数之和

class Solution { public int[] twoSum(int[] nums, int target) { // int [] solution = new int [2]; // HashMap<Integer,Integer> hashMap = new HashMap<>(); // for(int i=0;i<nums.length;i++){ // if(hashMap.

2020-11-18 13:55:26 55

原创 (JAVA)LeetCode 141 环形链表

题目描述给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。解法一:哈希表思路:借助哈希表是很常用的方法,尤其是在判断是否重复访问一个数据的时候

2020-11-17 11:09:09 60

原创 (JAVA)LeetCode 70 爬楼梯

题目描述假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数分析:要求 n 层的台阶的走法,由于一次走 1 或 2 个台阶,所以上到第 n 个台阶之前,一定是停留在第 n - 1 个台阶上,或者 n - 2 个台阶上。如果用 f ( n ) 代表 n 个台阶的走法。那么 f(n)=f(n-1)+f(n-2),f(1)=1,f(2)=2。发现这就是斐波那契数列(Fibonacci s

2020-11-16 15:28:03 59

原创 设计模式-模板方法模式

模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。代码结构如下:AbstractClass:抽象类,即抽象模板,定义并实现了一个模板方法。 abstract class AbstractClass{ public abstract void PrimitiveOperation1(); public abstract void PrimitiveOperation2(); public v

2020-11-16 11:11:32 60

原创 (JAVA)LeetCode 534 二叉树的直径

题目描述给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。注意:两结点之间的路径长度是以它们之间边的数目表示。解法:深度优先遍历两结点之间的路径长度(思考后一定是叶子结点之间存在最大路径)两个叶子节点之间的最短路径 = 根节点的左右儿子的深度之和最大值(Math.max)判断,声明变量判断即问题就转换为在求二叉树深度中加入对最大最短class Solution { int max=0;

2020-11-15 15:38:19 109

原创 设计模式-原型模式

原型模式用原型类型指定创建对象的种类,并通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。代码框架如下 // 原型类 class ConcretePrototype1 extends implements Cloneable { private String id; public Prototype(String id) { this.id=id; } public String getId(){

2020-11-15 14:32:13 104

原创 IDEA-SpringBoot应用的打包和部署

传统的Web应用进行打包部署时,通常会打成WAR包的形式,然后将WAR包部署到Tomcat等服务器中而SpringBoot应用使用的是嵌入式Servlet容器,默认以JAR包进行打包部署。Jar包方式打包部署添加Maven打包插件 <build> <plugins> <!--Maven 打包插件--> <plugin> <groupId&.

2020-11-14 11:35:55 860

原创 IDEA-SpringBoot文件上传和下载

文件上传开发Web应用时,文件上传是常见的需求,浏览器通过表单形式将文件以流的形式传递给服务器,服务器在对上传的数据解析处理。开发环境及代码见上一篇博客-SpringBoot整合Servlet三大组件编写文件上传的表单页面 upload.html<!DOCTYPE html>// 导入Thymeleaf配置<html lang="en" xmlns:th="http://www.thymeleaf.org"><head> <meta

2020-11-14 10:54:56 1827

原创 (JAVA)LeetCode 53 最大子序和

题目描述给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。解法一:暴力解(对于长序列时间超出)两次循环,使用 i 和 j 分别做子序列的左界和右界,对每个子序列内的数据求和,比较得到最大子序列的和。 public int maxSubArray(int[] nums) { int max=Integer.MIN_VALUE; for(int i=0;i<nums.length;i++){

2020-11-13 18:13:13 97

原创 设计模式-工厂方法模式

工厂方法模式简单工厂模式:工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。但是在我们添加功能的时候,就要修改原有的工厂类去添加分支判断条件,即不但扩展开放,修改也开放了,违背了软件设计中的开放-封闭原则。工厂方法出现。工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。Product接口:定义工厂方法所创建的对象的接口ConcreteProduct:具体的产品,实现了P

2020-11-13 14:00:28 58

原创 (JAVA)LeetCode 101 对称二叉树

题目描述给定一个二叉树,检查它是否是镜像对称的。解法一:暴力解审题之后思考,想了一下先中后序遍历的序列,发现中序遍历的序列是一个对称的序列,那么问题就可以转化为先遍历出序列在进行对称字符串的判断…自己能想到的最差的方法时间复杂度为:遍历二叉树O(n),判断对称字符串O(n),故O(n)空间复杂度为:需要数组空间存储序列O(n)问题:提交后发现代码健壮性存在问题192 / 195 个通过测试用例对于[1,2,2,2,null,2] 输入,确实存在着问题,由于存在着数据相同的情况,不能

2020-11-12 18:57:35 71

原创 设计模式-代理模式

代理模式为其他对象提供一种代理以控制对这个对象的访问结构如下Subject类:定义RealSubject类和Proxy类的公用接口,可以使得在任何使用RealSubject类的地方都可以使用Proxy类 public interface Subject{ void request(); }RealSubject类:定义Proxy所代表的真实实体 public class RealSubject implements Subject{ @Override publi

2020-11-12 14:24:25 37

原创 IDEA-SpringBoot整合Servlet三大组件

Spring MVC整合SpringBoot提供为整合MVC框架提供的功能特性内置两个视图解析器:ContentNegotiatingViewResolver和BeanNameViewResolver支持静态资源以及WebJars自动注册了转换器和格式化器支持Http消息转换器自动注册了消息代码解析器支持静态项目首页index.html支持定制应用图标favicon.ico自动初始化Web数据绑定器:ConfigurableWebBindingInitializerSpring MV

2020-11-12 11:42:49 998 4

原创 设计模式-装饰模式

装饰模式动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活装饰模式是为已有功能动态地添加更多功能的一种方式优势:把类中的装饰功能从类中搬移取出,可以简化原有类有效地把类的核心职责和装饰功能区分开来,去除重复的装饰逻辑代码示例// 人物类class Person{ private String name; public Person(){ } public Person(String name){ thi

2020-11-10 13:37:25 110

空空如也

空空如也

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

TA关注的人

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