java
文章平均质量分 79
若曦`
成为自己的希望,成为自己的光
展开
-
quartz学习笔记
定时任务Quartz原创 2022-09-14 17:50:08 · 741 阅读 · 1 评论 -
什么是序列化? 如何实现(反)序列化 序列化的应用
1. 什么是序列化与反序列化,什么情况需要序列化1.1 序列化序列化是什么序列化的目的什么情况需要序列化1.2 反序列反序列化是什么反序列化的目的2. Java中的序列化与反序列化2.1 如何实现序列化Java序列化的规定序列化的API实现(反)序列化的示例对象在硬盘上的存储方式2.2 利用序列化,实现深拷贝什么时候不要序列化Java中如何防止序列化1. 什么是序列化与反序列化,什么情况需要序列化1.1 序列化序列化是什么从百度百科中可以得知,序列化 (Serialization)是将对象的状态信.原创 2021-08-23 15:05:14 · 18777 阅读 · 3 评论 -
redis的curd及各种数据类型的存取
1. redis使用流程2. 增删改查3. redis各种数据类型的存取(1) String(2) List(3) Set① 无序Set② 有序Set(4) HashMap1. redis使用流程这是Springboot整合redis的使用步骤(1) pom.xml中导入redis依赖<!--导入这个redis依赖--><dependency> <groupId>org.springframework.boot</groupId> .原创 2021-06-08 19:10:14 · 489 阅读 · 0 评论 -
原子类与自旋锁原理初探
1. 原子性2. 原子变量(1) 内部的CAS(2) Unsafe类(3) CAS的缺点(4) 乐观锁3. 原子引用(1) AtomicReference和AtomicInteger的差异(2) 解决ABA问题自旋锁+版本(时间戳)比对源码分析使用示例4. 自旋锁自己实现一个自旋锁1. 原子性原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行也就是一个线程在某个代码块的执行过程中,不能被其他线程抢用cpu资源而导致中断2. 原子变量此篇博客为介.原创 2021-06-04 16:16:46 · 507 阅读 · 4 评论 -
线程的异步调用 CompletableFuture简介及使用
1. CompletableFuture简介在源码中可以看出,CompletableFuture是一个泛型类,实现了Future接口和CompletionStage接口一个completetableFuture就代表了一个任务,因为继承了上述两个接口的关系,可以完成一些线程的异步调用操作异步调用的简要介绍可以看这位大佬的博客 JAVA的异步调用<a>completionStage接口的作用:支持任务完成时触发的函数和操作Future接口的作用Future 是异步计算结果的容器接口,原创 2021-06-01 21:49:55 · 5535 阅读 · 0 评论 -
ForkJoin的使用及for循环、stream并行流三种方式的时间比较
1. ForkJoin简介2. ForkJoin的使用使用步骤代码示例3. 三种方式的效率比较(1) 普通方式(For循环)(2) ForkJoin(3) Stream并行流1. ForkJoin简介ForkJoin的作用是将一个任务划分成多个小任务,让多个线程去并行执行一个任务ForkJoin内置了一个ForkJoinPool (ForkJoin线程池),当任务没有指定线程的时候,就会使用默认的ForkJoin线程池ForkJoin使用了递归算法和分治思想,Forkjoin需要在多核cpu下才会.原创 2021-06-01 19:54:45 · 1494 阅读 · 0 评论 -
多线程下的阻塞队列特性及使用
1. 队列接口的常用子接口和实现类2. BlockingQueue(阻塞队列)四组API(1) ArrayBlockingQueue① 构造函数的源码解析及公平与非公平访问公平访问与非公平访问的说明② 使用示例③ 使用put()和take()的特性,解决生产者与消费者问题(2) LinkedBlockingQueue构造函数的源码分析使用方法3. LinkedBlockingQueue和ArrayBlockingQueue的差别1. 队列接口的常用子接口和实现类2. BlockingQueue(阻塞.原创 2021-05-31 19:04:03 · 664 阅读 · 0 评论 -
多线程下的生产者与消费者模式及(notify()与signal()唤醒的使用和区别)
1. 问题的起源用现实中的快餐店:生产一个汉堡消费一个汉堡为例代码如下// 多线程下的生产者与消费者模式public class bounded_buffer_Problem { public static void main(String[] args) { HamburgerShop hamburgerShop = new HamburgerShop(); // 开启一个生产者线程,for循环1000次,生产1000个汉堡 new Thr原创 2021-05-29 15:40:14 · 1109 阅读 · 0 评论 -
JUC工具包之加法、减法计数器、信号量
1. CountDownLatch(减法计数器)(1) 用法一(发令枪)(2) 用法二(记录所有线程的开始或结束时刻)2. CyclicBarrier(加法计数器)1. CountDownLatch(减法计数器)CountDownLatch 被人称作减法计数器,实际应用的时候,按照JDK文档的解释,可以有两种场景适用。用法一是作为发令枪,一个线程拿着发令枪,下令使其他多个线程同时开始进行用法二是观察所有线程的开始或结束时刻,比如公交车需要等所有乘客上车才能关门,或者是所有乘客下车才能关门,也就是当.原创 2021-05-28 12:41:40 · 797 阅读 · 0 评论 -
String、StringBuffer、StringBuilder的比较
1.String与StringBuffer、StringBuilder的比较String在字符串常量池中是不可变的对象StringBuffer与StringBulder是可变的例如:String a = "ab"; a="abc";第一句首先是在字符串常量池中开辟了一块空间用于存放"a";当改变a的值后,会在字符串常量池中开辟一块新空间存放"abc";等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象采用new String()的方式类似,不同是在常量池外的原创 2021-04-19 20:06:53 · 286 阅读 · 1 评论 -
java中的字符串
java中的字符串String的底层实现java9之前String底层数组采用**char[]**数组实现,每一个字符都将占用两个字节的空间而在java9之后,String底层采用**byte[]**数组实现String 实例化方式String str = "Hello World";String str = new String("hello,world"); (调用构造函数)字符串常量池从JDK1.8开始,常量池存在于堆(heap)中,之前都是在JVM中采用上述第一种实例化方式,会原创 2021-04-19 19:33:03 · 233 阅读 · 5 评论 -
SpringBoot的自动装配原理(含例子和源码分析)
1. SpringBoot的自动装配原理总结以DataSource的自动装配为例 2. 自定义一个自动装配的类3. @Configuration、@Import、@Conditional的作用4. 替换springboot的默认组件5. SpringBoot初始加载的自动配置类流程(源码分析)springboot初始加载的自动配置类流程总结1. SpringBoot的自动装配原理总结① SpringBoot应用在启动后,回先加载所有的自动配置类,也就是xxxxxAutoConfiguration类,并.原创 2021-05-19 14:29:56 · 4446 阅读 · 1 评论 -
java的stream流式编程
1. stream流的3个特性(1) stream流不存储数据(2) stream不改变数据源(3) stream不可重复使用2. 生成流的方式 (1) Array.stream()(2) Stream.of()(3) 对象.stream()3. 中间节点(懒节点)与终值节点 (1) 中间节点/懒节点的使用示例(2) 懒节点+终值节点 (3) 区分中间节点与终值节点的方法4. stream流的使用示例及特性(1) 节点的责任链模式① 执行每个节点方法:peek()(2) 上一个节点会影响下一个节点① 过滤.原创 2021-05-17 18:45:57 · 1570 阅读 · 0 评论 -
lambda表达式及四大函数式接口
1. lambda表达式简介2. lambda表达式的三种编写方式(1) expression 单条语句执行(不用加{ })(2) statement 语句块(使用{ }包裹函数)(3) refernce 方法引用1. lambda表达式简介lambda表达式是java8开始的新特性,可以看作匿名函数或者看作将一个函数作为另一个函数的参数2. lambda表达式的三种编写方式(1) expression 单条语句执行(不用加{ })函数式接口使用简单示例复杂示例当参数只有一个的时候,.原创 2021-05-17 13:00:44 · 973 阅读 · 0 评论 -
java流总结
1、IO流按照方向分,可以分为输入流和输出流按照单位分,可以分为字节流和字符流按照功能分,可以分为节点流和处理流2、字节流按照方向可以分为输入字节流和输出字节流。InputStream、OutputStream1 byte = 8 位二进制数 01010101InputStream和OutStream可以看作一根管道,用于将一个区域内的数据转移到java程序中或转移出去InputStream常用方法方法描述int read()以字节为单位读取数据int re原创 2021-05-16 22:22:11 · 659 阅读 · 1 评论 -
IOC的三级缓存图文详细解析(含如何解决循环依赖问题)
1. 三级缓存(1) 一级缓存模型(2) 二级缓存模型(3) 三级缓存模型2. 循环依赖问题1. 三级缓存三级缓存是为了解决循环依赖存在的一级缓存就是储存最终的完整bean的容器二级缓存是储存实例化但未初始化的半成品bean三级缓存是为了加工二级缓存中的bean,加工成为一个代理类bean(1) 一级缓存模型(2) 二级缓存模型(3) 三级缓存模型2. 循环依赖问题例如下列代码public class A{ private B b;}public class B{ .原创 2021-05-13 22:40:16 · 2003 阅读 · 4 评论 -
try catch和Throws处理异常的区别与自定义异常
try catch用于包含代码块,是指在当前方法中就处理异常而Throws用于方法外部,表示将异常抛给方法的调用者,如果上层没有处理,就继续往上(上一层的调用者)抛,直到处理了异常,或者直到抛给JVM下面用一个例子来说明区别public class Test { public static void main(String[] args) { try { test1(); //调用test1 } catch (Exception e) {原创 2021-05-12 22:38:44 · 466 阅读 · 0 评论 -
一个例子说清valotile关键字的作用
一句话总结volatile:volatile的作用即是让主内存中的数据对线程可见下面就用一个例子来说清valotile的作用我们先来看下例代码public class Test { private static int num=0; // 定义一个静态变量num=0 public static void main(String[] args) { new Thread(()->{ //开启一个线程 while(num==0){ //如果原创 2021-05-11 18:50:31 · 1284 阅读 · 1 评论 -
java线程池总结(ThreadPoolExecutor与Executors特性及使用)
1. 线程池简介线程池是指预先创建好一定数量的线程对象,存入缓冲池中,需要用的时候直接从缓冲池中取出,线程结束之后会再回到缓冲池中线程池在java中用ThreadPoolExecutor实现线程池的优点① 提高线程的利用率② 提高响应速度③ 便于统一管理线程对象④ 可以控制最大的并发数2. 线程池的使用(1) 使用原生的ThreadPoolExecutor(2) 使用Executors 工具类Executor接口的3种实现① newSingleThreadExecutor(); /原创 2021-05-11 11:31:55 · 658 阅读 · 0 评论 -
synchronized、Lock接口、Condition接口、读写锁及ReentrantLock(重入锁) 特性及使用
1. synchronized2. ReentrantLock(重入锁)原创 2021-05-09 20:24:10 · 315 阅读 · 0 评论 -
java多线程总结
1. 多线程简介2. java中多线程的使用(1) java中开启多线程的方法(2) 不同方式开启线程的区别(3) 线程的5种状态1. 多线程简介在了解线程前,要先明白进程进程是计算机正在运行的一个独立的应用程序线程是组成进程的基本单位,可以完成特定的功能,一个进程是由一个或多个线程组成的多线程是指在一个进程中,多个线程同时执行,这里说的同时执行并不是真正意义的同时执行系统会为每个线程分配 CPU 资源,在某个具体的时间段内 CPU 资源会被一个线程占用在不同的时间段内由不同的线程来占用 C.原创 2021-05-08 18:46:10 · 242 阅读 · 1 评论 -
Mysql的BufferPool与Free、Flush、Lru链表
1. BufferPool2. 管理BufferPool的链表(1) Free List(2) Flush List(3) Lru List1. BufferPool操作系统,会有缓冲池 (buffer pool) 机制,避免每次访问磁盘,以加速数据的访问MySQL 作为一个存储系统,同样具有缓冲池 (buffer pool) 机制,以避免每次查询数据都进行磁盘 IO(磁盘读写是按页读取,一次至少读一页数据,一般是4K)BufferPool一般存储的是经常访问的数据,而持久化的数据会放入磁盘B.原创 2021-05-04 19:20:28 · 1524 阅读 · 3 评论 -
SpringMVC总结
1. SpringMVC的执行流程(1) 首先从客户端接收请求,由DispatchServlet(servlet派遣器)接收(2) 然后传递给HandlerMapping(映射处理器),HandlerMapping开始通过url寻找对应的处理器(Handler类)(3) Handler类实例化生成一个具体的handler处理器对象和拦截器(如果有则生成),并封装为一个handlerExecuteChain对象回给DispatchServlet(servlet派遣器)(4) DispatchServl原创 2021-04-29 16:04:12 · 153 阅读 · 0 评论 -
动态代理与SpringAOP
1.动态代理与SpringAOP的关系动态代理其实就是用InvocationHandler接口和Proxy类来实现的一种代理模式SpringAOP即面向切面编程,它对 AOP 进⾏了封装,使用面向对象的思想来实现,所以AOP的底层是用动态代理实现的2. java中的动态代理java中提供了一个InvocationHandler接口,用来继承实现动态代理public interface InvocationHandler { public Object invoke(Object proxy,原创 2021-04-27 17:19:21 · 663 阅读 · 0 评论 -
手写框架,模拟简易的SpringIOC
要实现模拟IOC,要先明白IOC的执行流程 IOC的执行流程来自楠哥视频里的图根据该图,我们可以将步骤分为下列几步:① 扫描包,获取该包下所有加了Component注解的类② 通过反射机制获取该类的Class,即是图中的原材料③ 将获取的类的Class和Component注解中的value值封装成为一个beanDefinitions对象④ 创建一个ioc容器,以存储bean(即是beanName,和对应的实例对象)2.实现(1) 创建以下层级目录及文件说明:MyAnnotationC原创 2021-04-26 16:07:45 · 226 阅读 · 0 评论 -
一个小程序以理解控制反转
此文是我观看了楠哥的IOC视频之后,加以自己的理解写的一篇博文,不是打广告,楠哥讲解的非常详细,建议大家也可以去观看视频来学习https://www.bilibili.com/video/BV1AV411i7VH如何模拟IOC呢,首先要明白IOC的核心是什么?IOC的核心即“控制反转”,即是将创建对象的操作,赋予给程序,而不需要程序员手动去修改代码,以达到解耦的效果,这部分的博文网上有很多,就不过多解释了1. 实现思路使用配置文件的方式,让程序运行时动态读取配置文件,从而得知要创建的对象的名字,然后原创 2021-04-26 16:07:07 · 208 阅读 · 0 评论 -
Java中的注解
1. 注解简介Java注解是为代码提供元数据,注解可以看做标签,可以添加额外的辅助信息2. 注解的使用范围注解可以用在package , class , method , field上面我们可以通过反射实现对这些元数据(注解的额外信息)的访问3. 注解的分类① 内置注解@Override :重写@Deprecated :弃用@SuppressWarnings :抑制警告信息② 元注解元注解的作用是用于给其他注解添加注解元注解分为以下4类:1. @Target :用于描述注解的使用范原创 2021-04-22 12:27:22 · 172 阅读 · 0 评论 -
Java中的反射
此篇博文是我观看了狂神说的《注解与反射》视频后自己总结的一点东西,建议大家可以去观看狂神的视频来学习https://www.bilibili.com/video/BV1p4411P7V31. Java Reflection简介反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息并能直接操作任意对象的内部属性及方法在类加载之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象)这个对象包含了完整的类的结构信息,我们可以利用反射机制,通过这个对原创 2021-04-21 20:44:36 · 261 阅读 · 0 评论 -
Map集合及其实现类
1.Map简介Map是独立于Collection的接口,其是为存储一组键值(Key,value)Map的常用方法方法描述int size()获取集合长度boolean isEmpty()判断集合是否为空boolean containsKey(Object key)判断集合中是否存在该 keyboolean containsValue(Object value)判断集合中是否存在该 valueV get(Object key)取出 key 对应的原创 2021-04-21 14:19:24 · 423 阅读 · 2 评论 -
Collection集合接口及其子接口、实现类
1. Collection 接口简介Collection 接口继承自Iterable接口因此可以通过迭代器迭代元素Collection接口常用方法2. Collection的子接口① List:存放有序、可重复的元素② Set:存放无序、不可重复的元素③ Queue:队列接口2.1 List接口List常用方法:List接口的实现类① ArrayListArrayList 是开发中使用频率最高的 List 实现类,实现了长度可变的数组,在内存中分配连续空间,所以读取快,增删慢。原创 2021-04-20 20:35:01 · 1016 阅读 · 3 评论 -
Java中的集合简要概括
1.集合的接口 集合最顶层的接口:Collection和Mapcollection继承了iterable(迭代器)接口 Collection的子接口包括List、Set、QueueMap的子接口包括HashMap、HashTable、SortMap2.集合的划分及特点转载 2021-04-20 18:44:18 · 78 阅读 · 0 评论 -
==与equals()的区别
对于基本数据类型:(byte,short,char,int,float,double,long,boolean),只有==比较方法,比较的是值他们是作为常量在方法区中的常量池里面以HashSet策略存储起来的,对于这样的字符串 “123” 也是相同的道理,在常量池中,一个常量只会对应一个地址,因此不管是再多的 123,“123” 这样的数据都只会存储一个地址,所以所有他们的引用都是指向的同一块地址,因此基本数据类型和String常量是可以直接通过==来直接比较的。对于类 ,有equals和==两种方法比原创 2021-04-19 21:27:55 · 200 阅读 · 3 评论 -
Java的数据类型及作为方法参数时的区别
java的数据类型分为基本数据类型和引用类型基本数据类型:int、double、float、byte、short、char、long、boolean引用数据类型:类、接口、数组都是原创 2021-04-19 19:09:24 · 440 阅读 · 2 评论