自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

一、什么是模板模式模板模式通过一个抽象类来定义需要实现的框架,通过一系列的抽象方法,将方法延迟到子类去实现。相当于对一个程序建立一套模板,子类可以根据自身需要,按照模板的要求进行功能上的填充和扩展。二、案例1.如果我们想炒一道菜,可以用抽象类定义好一系列的模板方法,如加盐–>爆炒–>上菜:abstract class Cook{ abstract void name(); //定义炒菜的模板方法 abstract void salt(); a

2020-09-09 21:37:30 149

原创 Java方法之重写(Override)与重载(Overload)

一、方法的重写方法的重写主要存在于继承体系中,表现为子类方法根据自身需要对父类方法进行继承并改写。重写一般只改变方法体的内容,不改变方法的外壳,即对参数列表、返回类型等都不进行改变。二、方法的重载方法的重载主要体现了Java的多态,为编译时多态。主要表现为在一个类中,对某个方法的改写。重载必须保证方法名相同,且参数列表不同,每个重载方法必须有一个独一无二的参数列表,可以通过改变参数个数、参数类型来实现。最常用的就是构造函数的重载(拥有不同参数列表的构造函数)。三、重写与重载的区别重写体现

2020-09-08 17:06:44 198

原创 Redis的持久化机制

一、什么是Redis的持久化?Redis是一种基于内存的非关系型数据库,其大部分的操作都直接在内存中执行,而内存中的数据是不能持久储存的,如果服务器宕机关闭会导致内存中的数据丢失,因此Redis就需要将内存中的数据持久化到磁盘中,便于长久的保存。Redis提供了两种持久化的方式:RDB(Redis DataBase)AOF(Append Only File)二、RDB1.什么是RDB:RDB是Redis默认的持久化方法。按照一定的时间间隔将内存中的数据以快照的形式保存到磁盘中。Redis

2020-09-03 21:07:49 120

原创 Spring中FactoryBean和BeanFactory有什么区别?

一、BeanFactoryBeanFactory是Spring里面最底层的接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。二、FactoryBeanFactoryBean是一个Bean,实现了FactoryBean接口的类有能力改变bean,类似于普通bean的一个装饰器,普通的bean对象可以通过实现FactoryBean接口,对bean进行改造。FactoryBean接口提供了三个方法:getObject

2020-09-02 21:14:25 695

转载 【转载】Spring常见面试题

1、Spring是什么?​ Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置。主要由以下几个模块组成:Spring Core:核心类库,提供IOC服务;Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);Spring AOP:AOP服务;Spring DAO

2020-09-02 20:53:11 89

原创 设计模式之代理模式

一、什么是代理模式?​ 代理模式给一个对象提供一个代理对象,并由代理对象控制对原对象的访问。​ 类比生活,代理相当于我们常说的中介。假设这么一种情境,如果我想租房,直接找到房东来租房是很不方便的,我们一般选择通过房屋中介来进行租房。在这里房东相当于是被代理的对象,而房屋中介就相当于代理。二、有哪些代理模式?​ 代理模式可以分为两类:静态代理:由程序员通过代码自己创建代理类,在程序运行之前,代理类的字节码文件就已经被创建了,即代理类在程序运行之前就已经确定了。动态代理:动态代理可以在程序运

2020-09-01 21:22:22 89

原创 一文完全搞懂二叉树的递归和迭代算法(前、中、后序)

一、递归算法​ 递归算法就很简单了,有固定的模板,前中后序万变不离其宗,代码如下(只在注释处有改动)。前序遍历:class Solution { List<Integer> res = new ArrayList<>(); public List<Integer> preorderTraversal(TreeNode root) { if(root == null) return res; dfs(root);

2020-08-31 21:00:01 215

原创 Servlet面试题

一、什么是ServletServlet是一种使用Java语言编写的程序,运行在Web服务器或应用服务器上,是介于浏览器和服务器之间的中间层,用于提供给客户提供动态交互的功能。Servlet可以处理来自客户端的HTTP请求,并生成响应返回给客户端。二、Servlet处理客户端请求的几个步骤用户在浏览器地址中输入一个URL,向服务器发起一个HTTP请求。服务器接收到请求后,将请求转交给容器,容器根据请求的URL找到客户要访问的Servlet,并针对该请求创建一个单独的线程。如果能找到对应

2020-08-27 11:53:53 347

原创 设计模式之装饰者模式

在Java面向对象思想中,有一个重要的开闭原则,即类应该对扩展开放,对修改关闭,扩展就是添加新功能的意思,因此该原则要求在添加新功能时不需要修改代码。而符合开闭原则最典型的设计模式就是装饰者模式。一、什么是装饰者模式?装饰者模式可以在不改变代码结构的前提下,对已有的对象添加新的功能。如果不考虑装饰者模式,我们要扩展一个类,可以使用继承的方式来实现,通过对扩展类添加子类,在子类中对扩展类的方法进行补充。通过这种继承的方式进行扩展有一个弊端,随着扩展功能的增多,子类的数量会增多。所以采用装饰者模式来替代继

2020-08-25 12:03:41 204

原创 redis之缓存穿透、缓存击穿与缓存雪崩

一、概述redis作为一种基于键值对的非关系型数据库,由于其直接在内存中进行读写,具有特别高效的读写效率,所以常用于作为数据库的缓存,当服务器需要查询数据时,先去redis中查询,如果查询命中,则直接返回数据给服务器;如果查询未命中,再去数据库中进行查询。redis中缓存数据库中的热点数据,可以在高并发的情况下,有效减小数据库查询的压力。虽然redis能有效提升查询效率和并发性,但是也存在一定的问题,典型的问题即:缓存穿透缓存击穿缓存雪崩二、缓存穿透定义:当用户查询一个数据,发现red

2020-08-24 21:50:13 727

原创 【LeetCode】108、109题——将有序数组、链表转化为二叉搜索树

1.题目108题将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。109题给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。2.解法108题——递归解题思路:类似于二分法,数组两边边界下标,取中值mid,mid下标所在的数值及为二叉树的根节点。取mi

2020-08-20 21:29:19 115

原创 Leetcode只出现一次的数字

Leetcode136.只出现一次的数字Leetcode137.只出现一次的数字ⅡLeetcode260.只出现一次的数字ⅢLeetcode136.只出现一次的数字题目:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。解题思路:1.利用HashMap,对数组进行遍历,将数组元素添加到Map中去,再对Map遍历,找到只出现一次的元素。时间和空间复杂度都是O( n )。2.利用HashSet,对数组进行遍历,新出现的元素添加到Set中,如果.

2020-08-19 20:03:12 536

原创 设计模式之工厂模式

一、什么是工厂模式?工厂模式是最常用的设计模式之一,它提供了一种创建对象的最佳方式,可以实现对象创建者和调用者的解耦。二、工厂模式的三种类型1.简单工厂模式​ 定义:定义一个工厂类,根据传入的参数不同返回不同的实例,被创建的实例具有共同的父类或接口。​ 案例:假设有这么一种情况,如果我需要买一辆车,可选择的有宝马和奥迪两类。首先我们实现一个 Car 的接口,接口声明一个name方法:public interface Car { void name();}​ 写一个奥迪类和宝马

2020-08-18 22:27:16 124

原创 【剑指Offer】面试题16—— 数值的整数次方

1.题目​ 实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。2.解法快速幂解题思路:我们可以将幂 n 表示成二进制的形式,比如若 n = 9,用二进制表示为 10011001 = 1 x 1 + 0 x 2 + 0 x 4 + 1 x 8 = 1 x 20 + 0 x 21 + 0 x 22 + 1 x 23​xn = x9 = x1x1 + x0x2 + x0x4 + x

2020-08-17 19:58:01 97

原创 【剑指Offer】面试题52——两个链表的第一个公共节点

1.题目2.解法暴力解法解题思路:类似于两个数组的嵌套循环,找到公共的节点。代码实现:public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode curA = headA, curB = headB; //两层循环 while(curA != null){ while(

2020-08-17 19:56:17 154

原创 JVM之对象的内存布局

1.对象内存划分:在Hotspot虚拟机中,对象的内存布局可以划分为三个部分:对象头实例数据对齐填充2.对象头对象头中储存了两类信息:对象自身运行时的数据,官方称为“Mark Word”,包括哈希码、GC分代年龄、锁状态标志、线程持有的锁等等。在32位和64位虚拟机中,Mark Word占据的内存空间分别为32个bit和64个bit,即4个字节和8个字节。类型指针,官方称为“Klass Pointer”,即对象指向它的类型元数据的指针。在虚拟机默认开启指针压缩的情况下,Klass Po

2020-08-12 20:07:09 186

原创 单例模式之饿汉式与懒汉式

一、什么是单例模式单例模式是Java中最简单的设计模式之一,在单例模式中,保证一个类只能有唯一的一个实例对象。意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。主要解决:一个全局使用的类频繁地创建与销毁。何时使用:当您想控制实例数目,节省系统资源的时候。如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。关键代码:构造函数是私有的。二、饿汉模式public class Singleton { private static Singleton instance

2020-08-09 21:10:56 155

原创 生产者消费者问题之虚假唤醒

一、生产者消费者情景在并发问题中,考虑这么一种生产者消费者情景:设计A、B两个线程和一个参数count,如果count == 0,A线程进行生产,即对count + 1;如果count == 1,B线程进行消费,即对count - 1。代码如下:public class ProducerConsumer { public static void main(String[] args) { Data data = new Data(); //A线程

2020-08-06 20:42:00 422

原创 JDK1.8之Lambda表达式

一、作用:​ Lambda表达式是JDK1.8重要特性之一,其作用是可以减少匿名内部类的使用,使代码更加简洁。二、使用限制​ 并不是所有的接口都可以用Lambda表达式,要求接口必须是函数式接口,即接口有且只能有一个抽象方法,但是可以有多个非抽象方法。JDK 1.8 之前已有的函数式接口:java.lang.Runnablejava.util.concurrent.Callablejava.security.PrivilegedActionjava.util.Comparatorja

2020-08-04 18:13:49 241

原创 JVM之判断对象是否可以被回收

1.引用计数算法​ 在对象中添加一个引用计数器,如果该对象被引用一次,计数器就加一,如果引用失效一个,计数器就减一;如果计数器为零,则该对象就可以被回收。​ 在Java中一般不采用引用计数算法对对象进行管理,因为引用计数算法需要考虑一些特殊情况,必须要配合大量额外工作才能保证正确地工作,例如典型的对象之间互相循环引用的问题。如果两个对象之间互相引用,会导致这两个对象的计数器始终不为零,最终导致两个对象永远无法被清理的情况(类似于死锁)。2.可达性分析算法​ 主流的商用程序语言(Java、C#等

2020-07-30 21:13:27 390

原创 Java虚拟机之内存区域划分

Java虚拟机之内存区域划分程序计数器线程私有。在内存中占据一块较小的区域,可以看作是当前线程所执行的字节码的行号指示器。由于Java虚拟机的多线程是通过线程轮流切换、分配处理器时间的方式来实现的,而每个处理器同一时间只能执行一条线程中的指令,所以每条线程需要一个独立的程序计数器,以便在线程切换过程中,记录并恢复到正确的执行位置。如果线程执行的是一个Java方法,计数器记录的就是正在执行的虚拟机字节码指令的地址;如果正在执行的是本地方法(Native方法),则计数器值为空。Java虚拟机栈

2020-07-19 23:03:33 66

空空如也

空空如也

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

TA关注的人

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