- 博客(55)
- 资源 (1)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 什么是序列化? 如何实现(反)序列化 序列化的应用
1. 什么是序列化与反序列化,什么情况需要序列化1.1 序列化序列化是什么序列化的目的什么情况需要序列化1.2 反序列反序列化是什么反序列化的目的2. Java中的序列化与反序列化2.1 如何实现序列化Java序列化的规定序列化的API实现(反)序列化的示例对象在硬盘上的存储方式2.2 利用序列化,实现深拷贝什么时候不要序列化Java中如何防止序列化1. 什么是序列化与反序列化,什么情况需要序列化1.1 序列化序列化是什么从百度百科中可以得知,序列化 (Serialization)是将对象的状态信.
2021-08-23 15:05:14
18587
3
原创 Synchronized锁升级过程 学习笔记
1. 对象的存储方式对象头Mark Word(标记字段)Klass Pointer(类型指针)实例变量填充数据2. Mark Word与Synchronized锁的关系Mark Word的数据字段锁标志位没有锁 11无锁 001偏向锁 101轻量级锁 00自旋次数达到上限线程C尝试竞争锁对象重量级锁 101. 对象的存储方式要明白Synchronized锁升级过程前,我们要先知道对象在堆内存中的存储模型;堆内存中的对象分为了三块,对象头、实例变量和填充字节;对象头对象头主要包含两个部分 1. .
2021-09-12 23:36:18
652
原创 并发与并行、同步与异步,线程安全的实现
1. 并发与并行2. 同步与异步3. 那么什么情况下适合并发编程呢?CPU密集的情况 ForkJoin与Stream并行流的使用IO密集的情况4. 线程同步线程安全JVM内存模型中 线程私有和线程共有栈、方法区、堆 中存储的数据线程安全的数据线程不安全的数据i++的非原子性Java线程的工作内存与硬件内存的关系5. 实现线程安全对线程进行同步控制对数据进行安全控制6. for循环中为什么不能对集合进行add或remove操作 (补充知识点)1. 并发与并行并发其实是一个宽泛的概念,它代表计算机可以同时.
2021-09-12 12:52:46
551
原创 Tomcat核心原理--学习笔记
1.Tomcat的整体架构1.1 Http服务器与Tomcat在网上的说法有很多种,比如Tomcat内嵌http服务器,或者说Tomcat本质就是一个Http服务器,我比较赞同后者,那Http服务器是什么呢?从百度百科中可以得知,HTTP服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以处理浏览器等Web客户端的请求并返回相应响应。常见的Web服务器有Apache、 Nginx 、IIS、Tomcat。1.2 Http服务器的请求处理过程浏览器给服务器发送的是一个Http格式的请
2021-08-19 16:50:54
548
原创 动态规划 学习笔记
1.动态规划步骤(1)确定dp数组以及下标的含义(2)确定递推公式(3)dp数组初始化(4)确定遍历顺序(5)举例推导dp数组2. 一维dp数组做题记录做题由简到难记录入门题 爬楼梯(1)确定dp[i]含义i表示阶梯层数dp[i]表示到达阶梯i有多少种跳法(2) 确定递推公式dp[i] = dp[i-1]+dp[i-2]说明:因为对于阶梯i,其跳法=上一级跳一阶+上上一级跳两阶所以跳上阶梯i的跳法= 阶梯[i-1]+阶梯[i-2](3)初始化dp[i]dp[0]
2021-08-04 20:21:36
2330
原创 SpringAop使用的到底是JDK动态代理还是Cglib?
1. 从源码分析① optimize标志已设置(也就是为true)② 设置proxyTargetClass(目标代理类)标志更改proxyTargetClass(目标代理类)标志的方法③ 没有指定代理接口2. 错误的推论3. 最终的推论什么时候使用Cglib代理的方式呢?1. 从源码分析之前在看spring面试题的时候,不知道正确答案,网上搜了一阵子,感觉也都说得不明不白的,于是决定自己来分析一波废话不多说,直接贴源码来分析从上面源码中,其实已经可以看出来了,AOP的作者也在上面写了注释,只要满.
2021-07-21 15:46:53
2186
5
原创 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
463
原创 原子类与自旋锁原理初探
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
500
4
原创 多线程下的单例模式详解
1. 单例模式(1) 单例模式简介(2) 实现方式① 饿汉式② 懒汉式2. 多线程下的单例模式(1) Synchronized(2) 双重检查锁(3) 双重检查锁+Volatile1. 单例模式(1) 单例模式简介单例模式的作用单例模式是为了确保一个类只有一个实例,而且能自行的实例化,并向整个整个系统提供这个实例单例模式的特点单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。单例模式的使用场景整个程序的运行中只允许有一个类的实例.
2021-06-03 19:39:35
4107
1
原创 分组函数与分组查询回顾
1. 数据处理函数(单行处理函数)2. 分组函数(多行处理函数)3. 分组查询(group by)普通分组联合分组4. 分组后的过滤(having)1. 数据处理函数(单行处理函数)函数名称描述lower转换小写upper转换大写substr截取字符串length区长度trim去空格str_to_date将字符串转换成日期date_format格式化日期format设置千分位round四舍五入rand()生成.
2021-06-02 15:01:42
269
原创 线程的异步调用 CompletableFuture简介及使用
1. CompletableFuture简介在源码中可以看出,CompletableFuture是一个泛型类,实现了Future接口和CompletionStage接口一个completetableFuture就代表了一个任务,因为继承了上述两个接口的关系,可以完成一些线程的异步调用操作异步调用的简要介绍可以看这位大佬的博客 JAVA的异步调用<a>completionStage接口的作用:支持任务完成时触发的函数和操作Future接口的作用Future 是异步计算结果的容器接口,
2021-06-01 21:49:55
5508
原创 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
1451
原创 多线程下的阻塞队列特性及使用
1. 队列接口的常用子接口和实现类2. BlockingQueue(阻塞队列)四组API(1) ArrayBlockingQueue① 构造函数的源码解析及公平与非公平访问公平访问与非公平访问的说明② 使用示例③ 使用put()和take()的特性,解决生产者与消费者问题(2) LinkedBlockingQueue构造函数的源码分析使用方法3. LinkedBlockingQueue和ArrayBlockingQueue的差别1. 队列接口的常用子接口和实现类2. BlockingQueue(阻塞.
2021-05-31 19:04:03
626
原创 集合的常用线程安全实现类使用及源码分析
1. 并发修改异常问题的产生2. CopyOnWriteArrayList(1) 源码分析① 构造函数② add()方法的实现(2) 使用2. CopyOnWriteArraySet(1) 源码分析① 构造函数② add()方法的实现(2) 使用3. ConcurrentHashMap1. 并发修改异常问题的产生当多个线程同时去操作一个数据/集合的时候,就会产生并发修改异常,因为同一数据不允许同时被多个线程操作代码示例创建一个ArrayList,开启一百个线程,每个都往集合里添加一个a,结束后打印.
2021-05-30 15:58:58
369
原创 多线程下的生产者与消费者模式及(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
1072
原创 leetcode二叉树简单题技巧总结
1. 二叉树的先序、中序、后序遍历(1) 先序(2) 中序(3) 后序2. 二叉树的层次遍历(1) 单List集合存储数据的情况(2) 复合List集合存储数据的情况1. 二叉树的先序、中序、后序遍历使用dfs算法(深度优先)(1) 先序List<Integer> list = new ArrayList();public void preOrder(TreeNode root){ //向集合中添加数据 list.add(root.val); //递归左子树 preOrder.
2021-05-28 22:26:34
234
原创 JUC工具包之加法、减法计数器、信号量
1. CountDownLatch(减法计数器)(1) 用法一(发令枪)(2) 用法二(记录所有线程的开始或结束时刻)2. CyclicBarrier(加法计数器)1. CountDownLatch(减法计数器)CountDownLatch 被人称作减法计数器,实际应用的时候,按照JDK文档的解释,可以有两种场景适用。用法一是作为发令枪,一个线程拿着发令枪,下令使其他多个线程同时开始进行用法二是观察所有线程的开始或结束时刻,比如公交车需要等所有乘客上车才能关门,或者是所有乘客下车才能关门,也就是当.
2021-05-28 12:41:40
764
原创 leetcode简单链表题技巧总结
1. 反转链表系列2. 删除链表节点3. 合并链表4. 求两个链表的公共节点1. 反转链表系列2. 删除链表节点① ListNode pre = head;② javaListNode cur = head.next;③ 删除while(cur!=null){ pre.next = cur.next; cur = pre;}3. 合并链表(1) 创建一个节点记录起始点ListNode start = new ListNode(0);ListNode linked = st.
2021-05-26 22:25:53
225
原创 Andorid前端+SpringBoot后端+MySql一个登录注册小案例的实现
在MySql中创建一个用户表用于测试Andorid前端界面注册按钮的界面跳转SpringBoot后端(1) 创建SpringBoot项目(2) 导入依赖(3) 创建实体累,业务层 (1~3比较简单就没截图了)(4) 使用MyBatis交互数据库(5) Controller4. Andorid与SpringBoot的前后端交互(okHttp)...
2021-05-25 13:09:07
3192
17
原创 ListView的使用
1. 创建LextView2. 给item布局3. 创建一个提供数据的类4. 创建一个myAdpter类继承BaseAdpter5. 设置ListView的Adater6. 设置item的点击事件7. 优化Apdter1. 创建LextViewLextView每一行数据都是一个item2. 给item布局每一个item都包含一个TextView(用于显示文本),也可以包含其他的控件3. 创建一个提供数据的类4. 创建一个myAdpter类继承BaseAdpterBaseAdpter是L.
2021-05-23 13:08:46
127
原创 Android常用UI控件
1. TextView(1) 基础属性(2) 阴影(3) 实现跑马灯效果的TextView 2. Button(1) StateListDrawable(2) 在java中设置button的事件3. EditText (编辑框)(1) 创建EditText(2) 获取EditText的输入内容4. ImageView(1) 设置图片(2) 图片填充方式(3) 设置图片自适应(含最大宽高和view界限)5. progress (进度条)(1) 显示和隐藏进度条(2) 水平进度条使用水平进度条模拟下载6. N.
2021-05-22 17:24:04
960
2
原创 一键退出程序(所有activity)
1. 创建一个ActivityCotroller.class(活动收集器)知识点补充编写活动收集器类2. 创建BaseActivity.class编写BaseActivity.class3. 让创建的活动都继承BaseActivity.class4. 编写一个退出按钮1. 创建一个ActivityCotroller.class(活动收集器)活动收集器,使用集合的方式获取活动和销毁活动知识点补充创建的所有活动都是继承自AppCompatActivityAppCompatActivity的最顶层.
2021-05-22 10:40:37
171
原创 Activity的启动模式
1. 启动模式总结2. 启动模式的位置3. 四种启动模式 (1) standard(标准)模式 (2) singleTop(栈顶复用)模式 (3) singleTask(栈内复用)模式(4) singleInstance模式singleInstance模式下的出栈顺序1. 启动模式总结2. 启动模式的位置3. 四种启动模式 (1) standard(标准)模式standard是默认的启动模式standard模式下,每次跳转都会启动一个新的实例当Activity全部退出时,系统会自.
2021-05-21 19:49:08
137
原创 activity的生命周期
activity的生命周期(1) 创建3个活动(2) 创建两个按钮,改变布局(3) 更改视图为线性布局 (4) 重写活动流程的方法 (5) 给Dialog活动添加一个主题,使其成为一个对话框 (6) 执行观察流程① 活动启动 ② 点击弹出对话框按钮 点击返回按钮 ③ 点击开启普通活动的按钮点击返回按钮activity的生命周期(1) 创建3个活动(2) 创建两个按钮,改变布局(3) 更改视图为线性布局 (4) 重写活动流程的方法忘记加了,还有个重启 (5) 给Dialog活.
2021-05-21 17:13:56
434
原创 Android学习笔记
1. 布局文件2. 活动注册3. 修改字体的默认大写4. 注册控件5. 添加事件6. 添加菜单7. Intent的使用1. 布局文件2. 活动注册3. 修改字体的默认大写4. 注册控件5. 添加事件Toast可以快速添加一个函数,作用是弹出一个文本内容Toast一般用于一些提示性的文本6. 添加菜单(1) 在res目录下创建一个menu文件夹(2) 创建menu资源文件(3) 编写menu控件(4)创建选项菜单(5) 为菜单添加事件7. .
2021-05-21 17:07:19
268
原创 SpringBoot的自动装配原理(含例子和源码分析)
1. SpringBoot的自动装配原理总结以DataSource的自动装配为例 2. 自定义一个自动装配的类3. @Configuration、@Import、@Conditional的作用4. 替换springboot的默认组件5. SpringBoot初始加载的自动配置类流程(源码分析)springboot初始加载的自动配置类流程总结1. SpringBoot的自动装配原理总结① SpringBoot应用在启动后,回先加载所有的自动配置类,也就是xxxxxAutoConfiguration类,并.
2021-05-19 14:29:56
4395
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
1548
原创 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
928
原创 java流总结
1、IO流按照方向分,可以分为输入流和输出流按照单位分,可以分为字节流和字符流按照功能分,可以分为节点流和处理流2、字节流按照方向可以分为输入字节流和输出字节流。InputStream、OutputStream1 byte = 8 位二进制数 01010101InputStream和OutStream可以看作一根管道,用于将一个区域内的数据转移到java程序中或转移出去InputStream常用方法方法描述int read()以字节为单位读取数据int re
2021-05-16 22:22:11
612
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
1944
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
458
原创 IOC执行流程及bean生命周期和作用域总结
IOC执行流程图从源码分析IOC的执行流程refresh方法内的主要步骤bean的生命周期bean生命周期的简要总结IOC主要执行流程总结IOC执行流程图从源码分析IOC的执行流程1.new ClassPathXmlApplicationContext();或new AnnotationConfigApplicationContext();创建 ClassPathXmlApplicationContext或AnnotationConfigApplicationContext,并传入配置文件或包名.
2021-05-12 17:15:41
1232
原创 一个例子说清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
1275
1
原创 java线程池总结(ThreadPoolExecutor与Executors特性及使用)
1. 线程池简介线程池是指预先创建好一定数量的线程对象,存入缓冲池中,需要用的时候直接从缓冲池中取出,线程结束之后会再回到缓冲池中线程池在java中用ThreadPoolExecutor实现线程池的优点① 提高线程的利用率② 提高响应速度③ 便于统一管理线程对象④ 可以控制最大的并发数2. 线程池的使用(1) 使用原生的ThreadPoolExecutor(2) 使用Executors 工具类Executor接口的3种实现① newSingleThreadExecutor(); /
2021-05-11 11:31:55
615
原创 synchronized、Lock接口、Condition接口、读写锁及ReentrantLock(重入锁) 特性及使用
1. synchronized2. ReentrantLock(重入锁)
2021-05-09 20:24:10
303
原创 java多线程总结
1. 多线程简介2. java中多线程的使用(1) java中开启多线程的方法(2) 不同方式开启线程的区别(3) 线程的5种状态1. 多线程简介在了解线程前,要先明白进程进程是计算机正在运行的一个独立的应用程序线程是组成进程的基本单位,可以完成特定的功能,一个进程是由一个或多个线程组成的多线程是指在一个进程中,多个线程同时执行,这里说的同时执行并不是真正意义的同时执行系统会为每个线程分配 CPU 资源,在某个具体的时间段内 CPU 资源会被一个线程占用在不同的时间段内由不同的线程来占用 C.
2021-05-08 18:46:10
226
1
原创 Mysql事务、隔离级别及ACID实现原理
1. MySql事务简介2. 事务的用法(1) 事务涉及的关键字(2) 事务的使用3. 事务四大特征(ACID)4.事务ACID特性的实现原理(1) 原子性的实现 (2) 持久性的实现(3) 隔离级别及隔离性的实现(4) 一致性的实现1. MySql事务简介事务是一个最小的不可再分的工作单元,通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)事务只和DML语句(sql语句中的curd)有关,也可以说DML语句才有事务2. 事务的用法mysql默认开启了自动提交,.
2021-05-05 18:08:58
448
原创 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
1477
3
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人