自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

编码小波的博客

编程随笔

  • 博客(27)
  • 收藏
  • 关注

原创 Spring用到的设计模式

Spring 中用到了那些设计模式?这个问题,在面试中比较常见。所以,花了几天时间总结了一下,由于我的个人能力有限,文中如有任何错误各位都可以指出。这篇文章的主要目的是回顾一下 Spring 中的常见的设计模式。工厂设计模式Spring使用工厂模式可以通过 BeanFactory 或 ApplicationContext 创建 bean 对象。两者对比:BeanFactory :延迟注入(使用到某个 bean 的时候才会注入),相比于BeanFactory来说会占用更少的内存,程序启动速度更快。

2020-12-01 22:51:41 165

原创 Spring依赖注入的方式

1、两种实现方式注解方式(如@Autowired,@Resource,@Required)配置文件(如xml)2、四种注入方式Set方法注入:set注入是最简单、最常用的注入方式,支持注解+xml。构造器注入:指带有参数的构造函数注入,支持注解+xml。静态工厂的方法注入:通过调用静态工厂的方法来获取自己需要的对象,只支持xml。实例工厂的方法注入:获取对象实例的方法不是静态的,所以你需要首先new工厂类,再调用普通的实例方法,只支持xml。3、代码示例set方法+注解方式

2020-11-22 21:33:08 223

原创 SpringMvc常见注解

@Controller:用于定义控制器类@ResponseBody:表示方法的返回结果直接写入HTTP response body中@PathVariable:获取路径参数@RequestParam:用在方法的参数前面@RequestBody:请求的json转化为bean去接收@RestController:是@Controller和@ResponseBody的合集@RequestMapping:提供路由信息,负责URL到Controller中的具体函数的映射@GetMapping:是@Re.

2020-11-22 21:16:16 151

原创 SpringMVC工作原理(工作流程)

1、看图2、描述用户发送请求至前端控制器DispatcherServlet;DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;DispatcherServlet 调用 HandlerAdapter处理器适配器;HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器)

2020-11-22 21:12:11 179

原创 线程的创建方式

线程的创建方式继承Thread类实现实现Runnable接口方式实现Callable接口方式其中前两种比较常用。但是,需要有返回值需要实现Callable接口。代码示例继承Thread类实现 /** * 继承Thread类,并重写run方法 */ public class MyThread extends Thread { @Override public void run() { super.run(); System.o

2020-11-01 22:29:43 77

原创 异步获取多线程返回的数据

该问题涉及到三个接口:Callable、Future、CompletionService,还有一个类:FutureTask。下面分别进行下简单介绍:一、Future:V get() :获取异步执行的结果,如果没有结果可用,此方法会阻塞直到异步计算完成。V get(Long timeout , TimeUnit unit) :获取异步执行结果,如果没有结果可用,此方法会阻塞,但是会有时间限制,如果阻塞时间超过设定的timeout时间,该方法将抛出异常。boolean isDone() :判断任务是否

2020-11-01 22:22:23 2086

原创 Java中线程池的创建及自定义线程池

一、线程池简介线程池就是预先创建一些线程,它们的集合称为线程池。线程池可以很好地提高性能,在系统启动时即创建大量空闲的线程,程序将一个task给到线程池,线程池就会启动一条线程来执行这个任务,执行结束后,该线程不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。线程的创建和销毁比较消耗时间,线程池可以避免这个问题。二、如何创建线程池Executors是jdk1.5之后的一个新类,提供了一些静态方法,帮助我们方便的生成一些常见的线程池:newSingleThreadExecutor:创建

2020-11-01 15:55:39 1897

原创 事务的隔离级别及引发的问题

一、事务的四个隔离级别4个隔离级别:读未提交、读已提交、可重复读、可串行化。读未提交(READ UNCOMMITTED),事务中的修改,即使没有提交,对其它事务也是可见的。比如事务A和事务B同时进行,事务A在整个执行阶段,会将某数据的值从1开始一直加到10,然后进行事务提交。此时,事务B能够读取事务A操作过程中的未提交的数据(1、2、3、4、5、6…10)读已提交(READ COMMITTED),一个事务能读取已经提交的事务所做的修改,不能读取未提交的事务所做的修改。也就是事务未提交之前,对其他事务

2020-11-01 11:02:09 1905

原创 Thread类中的start()和run()方法有什么区别

通过调用线程类的start()方法来启动一个线程,使线程处于就绪状态,即可以被JVM来调度执行,在调度过程中,JVM通过调用线程类的run()方法来完成实际的业务逻辑,当run()方法结束后,此线程就会终止。如果直接调用线程类的run()方法,会被当作一个普通的函数调用,程序中仍然只有主线程这一个线程。即start()方法能够异步的调用run()方法,但是直接调用run()方法却是同步的,无法达到多线程的目的。因此,只用通过调用线程类的start()方法才能达到多线程的目的。...

2020-11-01 10:33:10 279

原创 synchronized 与volatile区别

简要回答volatile是一个类型修饰符(type specifier);volatile,它能够使变量在值发生改变时能尽快地让其他线程知道;关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且只能修改变量,而synchronized可以修饰方法,以及代码块;多线程访问volatile不会发生阻塞,而synchronized会出现阻塞;volatile能保证数据的可见性,但不能保证原子性;而synchronized可以保证原子性,也可以间

2020-11-01 10:30:38 263

原创 Synchronized 与ThreadLocal区别

简要回答都是为了解决多线程中相同变量的访问冲突问题。Synchronized同步机制,提供一份变量,让不同的线程排队访问。ThreadLocal关键字,为每一个线程都提供了一份变量,因此可以同时访问而互不影响。ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。辅助理解ThreadLocal public class ConnectionUtil { private static ThreadLocal&lt

2020-11-01 10:22:37 132

转载 Synchronized关键字原理

一、前言Synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。学习Java的小伙伴都知道synchronized关键字是解决并发问题常用解决方案,常用的有以下三种使用方式:修饰代码块,即同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象。修饰普通方法,即同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象。修饰静态方法,其作用的范围是整个静态方法,

2020-11-01 10:18:43 96

原创 POJO/VO/PO/BO/DTO/ENTITY/JavaBean的区别

JavaBean一种可重用组件,即“一次性编写,任何地方执行,任何地方重用”。满足三个条件:类必须是具体的和公共的具有无参构造器提供一致性设计模式的公共方法将内部域暴露成员属性。主要用途:可以用在功能处理、值、数据库访问和JSP中,任何可以用Java代码创造的对象。有两种:一种是有用户界面(UI,User Interface)的JavaBean;还有一种是没有用户界面的JavaBean,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种JavaBean。

2020-10-25 10:49:13 132

原创 synchronized与Lock的区别

开始正文之前先对多线程中的一些知识点进行回顾:一、技术点1.线程与进程一个程序最少需要一个进程,而一个进程最少需要一个线程。关系是线程–>进程–>程序的大致组成结构。所以线程是程序执行流的最小单位,而进程是系统进行资源分配和调度的一个独立单位。以下我们所有讨论的都是建立在线程基础之上。Thread的几个重要方法:**start()**方法,调用该方法开始执行该线程;**stop()**方法,调用该方法强制结束该线程执行;**join()**方法,调用该方法等待该线程结束;**s

2020-10-24 15:32:28 173

原创 线程的状态(生命周期)

Java中线程的状态被定义在公共枚举类java.lang.Thread.state中,在Java.lang.Thread里,有个内部枚举: State,一个线程在某一时刻可以是State里的一种状态:线程的六种状态:新建(NEW):表示线程新建出来,还没有被启动的状态,比如:Thread t = new MyThread();就绪/运行(RUNNABLE):该状态包含了经典线程模型的两种状态:就绪(Ready)、运行(Running):阻塞(BLOCKED):通常与锁有关系,表示线程正在获取有锁

2020-10-24 14:56:07 95

原创 java中的锁

在并发场景中,会涉及到各种各样的锁,如公平锁,乐观锁,共享锁、分段所等等,本篇文章主要对并发编程中的各种锁进行介绍,主要内容有:公平锁 / 非公平锁可重入锁 / 不可重入锁独享锁 / 共享锁互斥锁 / 读写锁乐观锁 / 悲观锁分段锁偏向锁 / 轻量级锁 / 重量级锁自旋锁下面对各种锁进行详细介绍:1、公平锁 / 非公平锁公平锁公平锁是指多个线程按照申请锁的顺序来获取锁。就是很公平,在并发环境中,每个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或者当前线程是等待队列的第一

2020-10-20 23:19:12 152

原创 设计模式的六大原则

一、设计模式六大原则单一职责原则(Single-Responsibility-Principle)开闭原则(Open Close Principle)里氏代换原则(Liskov Substitution Principle)依赖倒转原则(Dependence Inversion Principle)接口隔离原则(Interface Segregation Principle)迪米特法则,又称最少知道原则(Demeter Principle)二、六大原则详解1、单一职责原则(Single-

2020-10-17 12:36:59 1402

原创 接口和抽象类的区别

一、抽象类抽象类使用abstract修饰;抽象类不能实例化,即不能使用new关键字来实例化对象;含有抽象方法(使用abstract关键字修饰的方法)的类是抽象类,必须使用abstract关键字修饰;抽象类可以含有抽象方法,也可以不包含抽象方法,抽象类中可以有具体的方法;如果一个子类实现了父类(抽象类)的所有抽象方法,那么该子类可以不必是抽象类,否则必须是抽象类;抽象类中的抽象方法只有方法体,没有具体实现二、接口接口使用interface修饰;接口不能被实例化;一个类只能继承一个类,

2020-10-17 10:25:08 302

转载 常见的排序算法

冒泡排序插入排序快速排序选择排序希尔排序归并排序堆排序计数排序桶排序基数排序

2020-10-14 23:18:19 146

原创 单例模式的四大原则及其实现方式

单例的四大原则:构造私有。以静态方法或者枚举返回实例。确保实例只有一个,尤其是多线程环境。确保反序列换时不会重新构建对象。单列模式有5种常见的写法饿汉式懒汉式双检锁静态内部类(用的最多)枚举代码实现:1.饿汉式public class SingleTon{ private static SingleTon INSTANCE = new SingleTon(); private SingleTon(){} public static SingleTon ge

2020-10-13 22:05:39 914

原创 设计模式的六大原则

设计模式的六大原则         1、开闭原则(Open Close Principle)         2、里氏代换原则(Liskov Substitution Principle)         3、依赖倒转原则(Depend

2020-10-12 22:23:27 1739 1

原创 设计模式简介

        根据模式的目标将模式分为三个类目:创建型、行为型和结构型。一、创建型        创建型模式设计对象的实例化,这类模式的特点是,不让用户依赖于对象的创建或排列方式,避免用户直接使用new运算符创建对象。下列5种模式属于创建型模式:(1)工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Meth

2020-10-12 22:14:16 118 1

转载 八大数据结构简介

数据结构分类        数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。        常用的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等,如图所示:        每一种数据结构都有着独特的数据存储方式,

2020-10-12 21:51:10 890

原创 java中动态代理技术的两种实现方式

       动态代理是使用反射和字节码,在运行期间创建指定接口或类的子类以及它的实例对象的一项技术,通过这个技术可以对代码进行无侵入式的增强。java中动态代理技术有两种实现方式:JDK原生动态代理、CGLIB动态代理一、JDK原生动态代理       这一种主要是针对有接口实现的情况,它的底层是创建接口的实现代理类,实现扩展功能。也就是我们要增强的这个类实现了某

2020-10-12 21:05:34 1627

原创 String、StringBuffer和StringBuilder

一、String       String 字符串常量:在java中字符串属于对象,java中提供了String类来创建和操作字符串; String的值是不可变的,这就导致每次对String的操作都会产生出一个新的对象,这样会导致效率低下,并且浪费资源空间;一旦栈内存中的对象没有了,栈内存中的空间会马上被释放出来,但是堆内存中的实体并不会马上释放,而是会被java的垃圾回收机制回收。二、StringBuffe &nbsp

2020-10-11 15:57:49 149

转载 HashMap工作原理

HashMap内部是基于哈希表实现的键值对存储,继承 AbstractMap 并且实现了 Map 接口。一、什么是哈希表在讨论哈希表之前,我们先大概了解下其他数据结构的新增、查找等基础操作执行性能  **数组:**采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为O(logn);对于一般的插入删除操作,涉

2020-10-11 10:48:30 377

原创 ArrayList扩容机制

ArrayList扩容机制ArrayList每次扩容是原来的1.5倍。数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量的增长大约是其原容量的1.5倍。这样代价是很高的,因此在实际使用时,我们应该尽量避免数组容量的扩张。尽可能指定其容量,以避免数组扩容的发生。初始化方式不同,容量也不同:初始化方式容量数量变化List arrayList = new ArrayList();初始数组容量为10,当真正对数组进行添加时,才真正分配容量10->15-&g

2020-10-10 22:51:51 4133

空空如也

空空如也

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

TA关注的人

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