- 博客(44)
- 收藏
- 关注
原创 单例模式详细介绍
单例模式详细介绍单例模式可以说只要是一个合格的开发都会写,但是如果要深究,小小的单例模式可以牵扯到很多东西,比如 多线程是否安全,是否懒加载,性能等等。1、饿汉式public class Hungry { //私有构造方法,使得别人无法new这个对象,使内存中只有一个对象 private Hungry() { } //饿汉式就是很饿,一上来就new这个对象 private final static Hungry hungry = new Hungry(); public s
2020-09-01 20:22:52
343
原创 分析springboot自动配置原理
分析自动配置原理我们以HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理;//表示这是一个配置类,和以前编写的配置文件一样,也可以给容器中添加组件;@Configuration//启动指定类的ConfigurationProperties功能;//进入这个HttpProperties查看,将配置文件中对应的值和HttpProperties绑定起来;//并把HttpProperties加入到ioc容器中@EnableConfigurationP
2020-08-29 22:15:51
220
原创 Spring boot多环境切换
profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境;多配置文件我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本;例如:application-test.properties 代表测试环境配置 application-dev.properties 代表开发环境配置,但是Springboot并不会直接启动这些配置文件,它默认使用application.pr
2020-08-29 19:31:56
288
原创 Springboot自动配置原理(详细易懂)
Springboot自动配置原理Spring Boot的启动类上有一个@SpringBootApplication注解,这个注解是Spring Boot项目必不可少的注解。那么自动配置原理一定和这个注解有着千丝万缕的联系!//@SpringBootApplication 来标注一个主程序类 , 说明这是一个Spring Boot应用@SpringBootApplicationpublic class SpringbootApplication { public static void main(S
2020-08-27 00:15:31
2219
原创 SpringMVC文件上传和下载
SpringMVC文件上传和下载1、准备工作 文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作。如果想使用Spring的文件上传功能,则需要在上下文中配置MultipartResolver。 前端表单要求:为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。只有在这样
2020-08-25 14:12:26
172
原创 SSM整合
SSM整合1、环境要求环境:IDEAMySQL 5.7.19Tomcat 9Maven 3.6要求:需要熟练掌握MySQL数据库,Spring,JavaWeb及MyBatis知识,简单的前端知识;2.数据库搭建创建一个存放书籍数据的数据库表CREATE DATABASE `ssmbuild`;USE `ssmbuild`;DROP TABLE IF EXISTS `books`;CREATE TABLE `books` (`bookID` INT(10) NOT NUL
2020-08-24 12:28:36
208
原创 springMVC使用流程
springMVC使用流程写在前面如果不懂springMVC的执行原理,建议先看我上一篇博客配置版1.新建一个Moudle , springmvc-02-hello , 添加web的支持!2.确定导入了SpringMVC 的依赖!3.配置web.xml , 注册DispatcherServlet<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
2020-08-23 17:57:07
185
原创 SpringMVC原理
SpringMVC原理Spring的web框架围绕DispatcherServlet [ 调度Servlet ] 设计,DispatcherServlet的作用是将请求分发到不同的处理器。Spring MVC框架像许多其他MVC框架一样, 以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类)。SpringMVC的原理如下图所示:当发起请求时被前端的控制器(DispatcherSer
2020-08-23 16:47:50
202
原创 Spring整合mybatis
Spring整合mybatis第一种:用sqlSessionTemplate1.引入Spring配置文件beans.xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:
2020-08-22 23:32:52
148
原创 spring事务,声明式事务
spring事务,声明式事务事务在项目开发过程非常重要,涉及到数据的一致性的问题,不容马虎!事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性。事务就是把一系列的动作当成一个独立的工作单元,这些动作要么全部完成,要么全部不起作用。事务四个属性ACID原子性(atomicity)事务是原子性操作,由一系列动作组成,事务的原子性确保动作要么全部完成,要么完全不起作用一致性(consistency)一旦所有事务动作完成,事务就要被提交。数据和资源处于一种满足业务规则的一致性状
2020-08-22 23:17:49
133
原创 spring实现aop的三种方式
spring实现aop的三种方式第一种,spring API实现1.首先编写我们的业务接口和实现类public interface UserService { public void add(); public void delete(); public void update(); public void search();}public class UserServiceImpl implemen
2020-08-22 18:09:24
389
原创 动态代理
动态代理动态代理的角色和静态代理的一样 .动态代理的代理类是动态生成的 . 静态代理的代理类是我们提前写好的动态代理分为两类 : 一类是基于接口动态代理 , 一类是基于类的动态代理JDK的动态代理需要了解两个类核心 : InvocationHandler 和 Proxy , 打开JDK帮助文档看看【InvocationHandler:调用处理程序】Object invoke(Object proxy, 方法 method, Object[] args);//参数//proxy - 调
2020-08-22 15:43:57
177
原创 静态代理模式
静态代理模式开篇介绍思想:我们在不改变原来的代码的情况下,实现了对原有功能的增强。代理模式图解:静态代理角色分析抽象角色 : 一般使用接口或者抽象类来实现真实角色 : 被代理的角色代理角色 : 代理真实角色 ; 代理真实角色后 , 一般会做一些附属的操作 .客户 : 使用代理角色来进行一些操作比如租房,找中介,房东就只有租房操作就行,带人看房这些不用管,让中介来实现。代码实现1.租房Rent . java类 即抽象角色(一般是接口或者抽象类)//抽象角色:租房
2020-08-21 18:25:36
200
原创 @Autowire和@Resource的区别(精简易懂)
@Autowire和@Resource的区别@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。@Autowired默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,@Qualifier(value = “cat2”)@Res
2020-08-21 11:35:37
2611
1
原创 Spring Bean的作用域
Spring Bean的作用域在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象几种作用域中,request、session作用域仅在基于web的应用中使用(不必关心你所采用的是什么web应用框架),只能用在基于web的Spring ApplicationContext环境。1. Singleton单例当一个bean的作用域为Singleton,那么Spring IoC容器中只会存在一个共
2020-08-20 23:11:07
142
原创 关于SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession的生命周期和作用域
我们可以先画一个流程图,分析一下Mybatis的执行过程!作用域理解SqlSessionFactoryBuilder 的作用在于创建 SqlSessionFactory,创建成功后SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建 SqlSessionFactory 的方法中,而不要让其长期存在。因此SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)SqlSessionFactory 可以被认为是一个数据库连接池,
2020-08-18 16:01:17
731
原创 java Stream流
Stream流说到Stream便容易想到I/O Stream,而实际上,谁规定“流”就一定是“IO流”呢?在Java 8中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream概念,用于解决已有集合类库既有的弊端。流式思想概述流式思想类似于工厂车间的“生产流水线”。这张图中展示了过滤、映射、跳过、计数等多步操作,这是一种集合元素的处理方案,而方案就是一种“函数模型”。图中的每一个方框都是一个“流”,调用指定的方法,可以从一个流模型转换为另一个流模型。而最右侧的数字3是最终结果。这
2020-08-02 17:32:38
320
原创 java常用函数式接口
常用函数式接口1.java.util.function.Supplier接口仅包含一个无参的方法:T get()。用来获取一个泛型参数指定类型的对象数据。Supplier接口被称之为生产型接口,指定接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据public class Demo01Supplier { //定义一个方法,方法的参数传递Supplier<T>接口,泛型执行String,get方法就会返回一个String public static Str
2020-08-02 16:34:06
290
原创 为什么线程通信的方法wait(), notify()和notifyAll()被定义在Object类里
关于wait()、notify()的使用public class WaitDemo { public static Object object = new Object(); public static void main(String[] args) throws InterruptedException { Thread1 thread1 = new Thread1(); Thread2 thread2 = new Thread2();
2020-07-28 00:14:36
1225
原创 多线程——常用线程方法
1.sleep()线程休眠sleep (时间) 指定当前线程阻塞的毫秒数;sleep存在异常InterruptedException;sleep时间达到后线程进入就绪状态;sleep可以模拟网络延时,倒计时等。每一个对象都有一个锁,sleep不会释放锁;package multiplethread;public class TestThread { public static void main(String[] args) { Thread t1= new Thread(
2020-07-27 18:28:17
166
原创 什么叫线程安全的类
在线程安全性的定义中,最核心的概念就是 正确性。当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同(自身已经实现同步),这个类都能表现出正确的行为,那么这个类就是线程安全的。简单说就是:在多线程的运行环境之下,通过一定的同步机制,保证多个线程对同一共享资源的操作能够得到正确的执行,符合这样条件的类称为线程安全的类1.StringBuffer和StringBuilder的区别StringBuffer 是线程安全的StringBu
2020-07-27 17:41:27
1114
原创 多线程——如何停止线程(三种方式)
方式一使用退出标识,使得线程正常退出,即当run方法完成后进程终止。private int tickeys=10; private boolean flag=true; @Override public void run() { while (flag){ try { buyTickey(); } catch (InterruptedException e) {
2020-07-27 16:32:30
3449
原创 java IO(五)——序列化和反序列化
序列化和反序列化概念objectoutputstream:对象的序列化流java. io. objectOutputstream extends OutputStreamobjectoutputstream:对象的序列化流作用:把对象以流的方式写入到文件中保存构造方法:objectoutputstream(OutputStream out) 创建写入指OutputStream 的objectoutputstream.参数:OutputStream out :字节输出流特有的成员方
2020-07-20 10:03:13
137
原创 java IO(四)——转换流
转换流1字符编码和字符集字符编码计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码。反之,将存储在计算机中的二进制数按照某规则解析显示出来,称为解码。比如说,按照A规则存储,同样按照A规则解析,那么就能显示正确的文本符号。反之,按照A规则存储,再按照B规则解析,就会导致乱码现象。编码:字符(能看懂的)->字节(看不懂的)解码:字节(看不懂的)->字符(能看懂的)字符编码C
2020-07-20 09:57:11
184
原创 Java IO(三)——缓冲流
缓冲流的原理BufferedOutputStream :字节缓冲输出流java. io. BufferedOutputStream extends OutputStreamBufferedOutputStream:字节缓冲输出流继承自父类的共性成员方法:public void close() :关闭此输出流并释放与此流相关联的任何系统资源。public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。public void write(byte[] b):
2020-07-20 09:41:15
231
原创 java IO(二)—— 字符输入输出流
javo. io. Reader:字符输入流是字符输入流的最顶层的父类,定义了-些共性的成员方法,是一个抽象类共性的成员方法:int read() 读取单个字符并返回。int read(char[] cbuf)- 次读取多个字符,将字符读入数组。void close() 关闭该流并释放与之关联的所有资源。java. io. FileReader extends InputStreamReader extends ReaderFileReader:文件字符输入流作用:把硬盘文件中的数据以字
2020-07-20 09:34:12
271
原创 java IO(一)——文件输入输出流
java IO硬盘和内存1.字节输出流1.1字节输出流OutputStream和FileOutputStream 类介绍java. io. OutputStream:字节输出流此抽象类是表示输出字节流的所有类的超类。定义了一些子类共性的成员方法:public void close() : 关闭此输出流并释放与此流相关联的任何系统资源。public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。public void write(byte[] b):将b
2020-07-20 09:23:24
739
原创 解决fileReader读取文件乱码
解决fileReader读取文件乱码idea默认编码格式是utf-8(标准万国码的一种),而Windows操作系统默认是GBK(中文码表),如果fileReader读取系统中的文件,则无法将字节转换为字符,此时会出现乱码。如果用转换流InputStreamReader读取文件,它可以指点编码表,也就是说可以指定任意一个编码,把字节转换为字符,这时就不会出现乱码。过程...
2020-07-19 17:28:37
2190
1
原创 剑指offer 39 数组中出现次数超过一半的数字
剑指offer 39 数组中出现次数超过一半的数字题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2限制:1 <= 数组长度 <= 50000解法一:用HashMap记录每个数的个数class Solution { public int majorityElement(int[] nums)
2020-07-18 23:19:07
101
原创 剑指offer 10-II 青蛙跳台阶
剑指offer 10-II 青蛙跳台阶一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2输出:2示例 2:输入:n = 7输出:21提示:0 <= n <= 100动态规划解析:状态定义: 设 dp为一维数组,其中 dp[i] 的值代表 斐波那契数列第 $i个数字 。转移方程:
2020-07-18 23:18:02
132
原创 剑指offer10-1 斐波那契数列
剑指offer10-1 斐波那契数列题目写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。解法1:递归很多新手一上来就会想到用递归,当然,结
2020-07-18 23:17:05
134
原创 HashMap(三)底层源码分析
HashMap核心属性分析 /** * The default initial capacity - MUST be a power of two. * 默认散列表数组长度 */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 /** * The maximum capacity, used if a higher value i
2020-07-17 15:33:13
158
原创 红黑树面试必备,查询插入删除,多情景多图详细介绍
红黑树性质解释性质性质3的(NIL)也就是NULL,是叶子节点,黑色的。性质5,如F节点,高度是3,包含NIL->K->F,NIL->H->D->F,NIL->M->D->F,每个路径的黑节点都只有2性质6由以上解释的性质5可以推出黑色完美平衡红黑树并不是一个完美平衡二叉查找树, 从图上可以看到,根结点P的左子树显然比右子树高,但左子树和右子树的黑结点的层数是相等的,也即任意一个结点到每个叶子结点的路径都包含数量相同的黑结点(性质5)。所以我们叫
2020-07-15 23:59:30
413
原创 HashMap (二)HashMap底层源码图文讲解
HashMap (二)HashMap源码讲解1.继承体系是什么样的?2.Node数据结构分析?HashMap内部有一个Node(Entry)的内部类,其中有四个属性,我们要存储一个值,则需要一个key和一个value,存到map中就会先将key和value保存在这个Node类创建的对象中。static class Node<K,V> implements Map.Entry<K,V> { final int hash; //通过key算过来的你hashcod
2020-07-15 17:31:51
241
原创 HashMap(一)基础入门 了解HashMap数据结构和哈希的概念
HashMap(一)基础入门 了解其数据结构和哈希1.数组的优势/劣势优势:查询快。数组的内存是连续的,每一块空间是一样大的,从结构上可以看到优点就是索引快,从下标0,1,2,3……就可以查询到指定的内容劣势:增删慢,如果增加时内存不足还要进行扩容,删除大部分时候要进行数组的拼接,比较麻烦。2.链表的优势/劣势链表不是连续的内存,每一块内存里面有一个引用,去保留下一个内存的地址。优势:增删快,一般增加删除的时候只要把引用的修改就可以了劣势:链表没有index,查询的时候要逐一对比,速度慢
2020-07-15 17:27:54
330
原创 三分钟明白什么是java的多态
多态多态性是OOP中的一个重要特性,主要是用来实现动态联编的,换句话说,就是程序的最终状态只有在执行过程中才被决定而非在编译期间就决定了。这对于大型系统来说能提高系统的灵活性和扩展性。个人理解:多态:同一个方法可以根据发送对象的不同而采用多种不同的行为方式。一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。多态可以让我们不用关心某个对象到底是什么具体类型,就可以使用该对象的某些方法,从而实现更加灵活的编程,提高系统的可扩展性。允许不同类的对象对同一消息做出响应。即同一消息可以根据发
2020-07-14 11:30:25
241
原创 详细介绍java字符串常量池,3分钟学会
字符串常量池在介绍字符串常量池之前,先引入一个知识String str="a";str="b";String str2="c";str2=str2+str;都说String是不可变的,那为什么str可以从"a"变为"b"; 还有将"c"和"b"相加?其实并不是改变值,而是重新开辟了一个"b";首先开辟一个"a",str=“b"后,开辟一个"b”,将str指向"b"String str2=“c”,开辟一个"c",当str2=str2+str,开辟"cb",将str2指向"cb"所以并不
2020-07-14 11:15:07
637
原创 Java常用类String类介绍,看这篇就够了
java常用类 StringString 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。 字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。String源码public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {}String的成员变量
2020-07-13 19:02:45
233
原创 通俗理解java自动装箱和拆箱
自动装箱和拆箱1.包装类的介绍虽然 Java 语言是典型的面向对象编程语言,但其中的八种基本数据类型并不支持面向对象编程,基本类型的数据不具备“对象”的特性——不携带属性、没有方法可调用。 沿用它们只是为了迎合人类根深蒂固的习惯,并的确能简单、有效地进行常规数据处理。这种借助于非面向对象技术的做法有时也会带来不便,比如引用类型数据均继承了 Object 类的特性,要转换为 String 类型(经常有这种需要)时只要简单调用 Object 类中定义的toString()即可,而基本数据类型转换为
2020-07-13 10:29:30
170
原创 Object类的equals()方法与String类中的equals()方法。
Object类的equals()方法与String类中的equals()方法。Object类public boolean equals(Object obj) { return (this == obj);}Object中的equals方法是直接判断this和obj本身的值(地址)是否相等,即用来判断调用equals的对象和形参obj所引用的对象是否是同一对象,所谓同一对象就是指内存中同一块存储单元,如果this和obj指向的hi同一块内存对象,则返回true,如果this和obj指
2020-07-12 20:29:53
641
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人