自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(171)
  • 资源 (1)
  • 收藏
  • 关注

原创 解决txt在浏览器直接打开,不能下载的问题

解决txt在浏览器直接打开,不能下载的问题

2023-01-03 16:07:27 2776

原创 堆结构及堆排序

堆排序及堆结构

2022-12-16 13:18:53 498

原创 反射介绍及使用

java反射的介绍及使用

2022-12-15 14:23:35 272

原创 表格中复制粘贴到其他位置的数据会携带引号等不可见字符

表格中复制粘贴到其他位置的数据会携带引号等不可见字符

2022-11-02 15:51:15 2534

原创 java List截取

java List截取

2022-10-28 14:55:55 6763

原创 mybatis批量更新

mybtais批量更新

2022-09-27 14:51:33 133

原创 java.lang.UnsupportedOperationException: null

Collections.singletonList

2022-09-13 17:31:37 3749 1

转载 List 根据指定字段去重

List 根据指定字段去重。

2022-08-10 14:05:00 2425

原创 idea设置热启动

idea设置热启动1.pom 中加依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>tru

2022-03-14 11:11:48 2632

原创 Springboot集成knife4j

Springboot集成knife4j注:本文是 srpingboot + OCLA + knife4j1. 添加依赖 1.1 父工程parent 的pom 文件中引入依赖 <knife4j.version>2.0.2</knife4j.version> <dependency> <groupId>com.github.xiaoymin</groupId> <a

2022-02-26 10:29:18 1195

原创 利用mybatis-generator自动生成代码

利用mybatis-generator自动生成代码1. 在pom.xml中添加plugin2. generatorConfig.xml配置文件3. 双击mybatis-generator:generate 插件即可生成4. 插件项目1. 在pom.xml中添加plugin<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://

2022-02-15 14:11:07 238

原创 zookeeper的ZAB协议

ZAB协议崩溃恢复zxid选举数据同步数据同步的四种策略消息广播zab协议的有序性保证zab(Zookepper Actomic Broadcast) 是专为zk 设计的支持崩溃恢复的原子广播协议。是保证数据一致性的核心算法。ZAB协议有两种模式:崩溃恢复和消息广播当集群启动时,或者leader服务器出现网络中断,崩溃推出或者重启等异常时,zab协议会进入崩溃恢复模式,选举产生新leader,选举成功后,进入消息广播模式。崩溃恢复zxidleader服务器在接收到事务请求后,会为每个事务请求生

2021-12-23 17:22:55 1030

原创 MySQL唯一索引和普通索引的区别

Mysql唯一索引和普通索引的区别查询和更新上的区别查询操作更新操作查询和更新上的区别查询操作这两类索引在查询上差别不大,主要是更新上的差别。查询的时候普通索引:查找到第一条满足条件的记录后,继续向后遍历,直到第一个不满足条件的记录。唯一索引:由于索引定义了唯一性,查找到第一条满足条件的记录后,直接停止继续检索。普通索引会多检索一次,几乎没什么影响。因为InnDB是按照数据页为单位去读取数据的, 需要读取数据时,并不是直接去磁盘中读取的数据,而是读取数据页到内存,然后再从数据页中检索数据

2021-12-23 14:40:58 2077

原创 Volatile 关键字如何实现 线程间的可见性和 禁止指令重排

Volatile关键字Volatile的特性内存屏障的作用Volatile的特性Volatile 的特性:保证可见性禁止指令重排不保证原子性内存屏障的作用1. 保证特定操作的顺序2. 保证某些变量的内存可见性(利用该特性实现volatile的内存可见性)保证可见性:对volatile 变量进行写操作时,会在写操作后加入一条store屏障指令,将工作内存中的共享变量刷新回到主存对volatile 变量进行读操作时,会在写操作后加入一条load屏障指令,从主存中读取共享变量禁

2021-12-16 13:14:44 423

转载 MQ消息丢失、重复、顺序、一致性

消息队列的应用场景异步处理。将一个请求链路中的非核心流程,拆分出来,异步处理,减少主流程链路的处理逻辑,缩短RT,提升吞吐量。如:注册新用户发短信通知。削峰填谷。避免流量暴涨,打垮下游系统,前面会加个消息队列,平滑流量冲击。比如:秒杀活动。生活中像电源适配器也是这个原理。应用解耦。两个应用,通过消息系统间接建立关系,避免一个系统宕机后对另一个系统的影响,提升系统的可用性。如:下单异步扣减库存消息通讯。内置了高效的通信机制,可用于消息通讯。如:点对点消息队列、聊天室如何保证 MQ 消息不丢失

2021-11-26 17:13:45 927

原创 快速排序-插入排序-归并排序

随机快排-插入排序,递归排序/** * 快速排序 * 思路 1 找到一个中间值,一般找最后或最前的位置 2 将数组以中间值为界分列两边 将中间值的位置和分界位置对调 * 3 前提 左指针不能越过右指针 将分界两边的数组再递归 1 2 步骤 * @author wyw * @date 2021/11/8 */public class Code06_quicklySort { public static void main(String

2021-11-24 07:58:22 133

原创 给定两个数,用位运算实现加减乘除(不适用加减乘除号)

package com.demo.algorithm.bitmap位图;/** * 用位运算实现 加减乘除 */public class Code02_BitAddSubtractMultDiv { /** * 加法 * ^ 异或运算(都为1时 结果为0,且没有进位) 是 无符号相加 例如 0011^1010 = 0010 * (a & b) << 1 得到 a + b 的 进位信息 * * a = a^b ,

2021-11-23 15:28:39 341

原创 对多个list求交集

对多个list 求交集例如 list1 : 1,3,5list2: 2,3,6list3: 3,4得到list交集为: 3public static List<Integer> retainElementList(List<List<Integer>> elementLists) { Optional<List<Integer>> result = elementLists.parallelStream()

2021-11-22 15:05:01 489

原创 将List分成多组

将 list分组,每组不超过1000条List<String> fenglist = policyCorrelationMapper.selectWebuser("4"); int toIndex = 1000; List<String> groupList = new ArrayList<>(); for (int i = 0; i < fenglist.size(); i+=1000) {

2021-11-22 15:01:38 740

转载 HashMap在多线程下访问下导致死循环问题

HashMap在jdk1.8之前,会因为多线程put元素操作共享hashmap会出现,原因是向链表添加元素时采用的是头插法,多线程操作链表会发生环化,此时产生死循环HashMap 的死循环问题 是多线程 扩容的时候有可能会产生,下面来看下扩容方法的源码:resize() 函数void resize(int newCapacity) { Entry[] oldTable = table; int oldCapacity = oldTable.length; .

2021-11-18 15:13:32 1744

原创 缓存穿透、击穿、雪崩,如何避免?

穿透 : redis 中没有这笔数据,数据库中也没有击穿:redis 中没有这笔数据,数据库中有雪崩:数据中有,大量并发,Redis 中没有缓存(多个key , 同时过期,或者被淘汰了,或者redis中压根就没缓存这些key)解决办法:设置空 key(如果是恶意攻击那种,有大批量不同的key, 如果没有key 都设null, 那reids 中就 放太多无效数据了,此时使用布隆过滤器)使用布隆过滤器过滤无效请求(不能保证100%)过期时间设置不一致(多个key同时过期造成雪崩的情况)加锁。就.

2021-11-16 22:16:38 660

原创 Redis中的fork()、写时复制

linux中,父子进程的关系父进程的数据,子进程是否可以看到?1. 常规思想,进程是数据隔离的,看不到;2. 进阶思想,父进程也可以让子进程看到数据。例如:使用 export 的 环境变量,紫禁城的修改不会破坏父进程,父进程的修改也不会破坏子进程(子进程的数据是父进程数据的一个副本)但是 ,创建 子进程 时,如果全部 拷贝父进程的 数据,则 会很慢 且,占用内存太大,所以有了 fork() ,fork() 创建速度特别快,且占用空间少。fork()怎么实现的呢?创建子进程时,它不复制父进程

2021-11-12 23:49:05 1017

原创 Redis中AKF原则的应用

Redis 单机 、单节点、单实例缺点:1. 单点故障(一台服务如果挂了,整个系统不可用了) 2. 容量有限 3. 压力 为了解决 单机的 问题 ,引入了AKF 原则AKF X轴:直接水平复制应用进程来扩展系统(全量,镜像)Y轴 : 将业务、功能拆分出来扩展系统Z轴:基于用户信息扩展系统(根据 优先级、逻辑拆分)通过上面的AKF 拆分 一遍多后,带来了数据一致性问题解决方案:1. 同步阻塞方式(所有阶段阻塞直到数据全部一致),强一致性 ,但是强一致性 会破坏可用

2021-11-12 23:12:54 2710 3

原创 两个有序链表的合并

package com.demo.algorithm.code04链表;/** * 两个有序链表的合并 * 给定两个有序链表的头节点head1和head2,返回合并之后的大链表,要求依然有序 * 示例: 1->3->3->5->7 2->2->3->3->7 * 返回: 1->2->2->3->3->3->5->7->7 */public class CodeMergeTowSortedLink

2021-11-11 15:38:08 299

原创 两个链表相加

package com.demo.algorithm.code04链表;/** * 题目: * 两个链表相加 * 给定两个链表的头节点head1和head2, * 认为从左到右是某个数字从低位到高位,返回相加之后的链表* * 例如: 4->3->6 2->5->3 * 返回 6->8->9 * 解释 634 + 352 = 986 */public class Code05_AddTwoNumbers { public class List

2021-11-11 15:35:27 389

原创 线上OOM异常案例及排查过程

线上OOM异常案例及排查过程1.导出堆转储文件分析由于 启动脚本里面加了 -XX:HeapDumpPath=./gcLog/java_%p_%t.hprof -XX:+HeapDumpOnOutOfMemoryError ,所以 发生OOM异常的时候 会自动生成 堆转储文件放到配置的指定位置。启动脚本如下:从服务器 把 堆转储文件 down下来之后 ,用jvisualvm来分析dump文件。 jvisualvm是JDK自带的Java性能分析工具,在JDK的bin目录下,文件名就叫jv

2021-11-11 14:39:07 849

原创 k个节点的组内逆序调整

package com.demo.algorithm.code04链表;/** * k个节点的组内逆序调整 * * 把一个链表分成 多组,每组K个节点,每组组内链表反转,最后一组若不够k个节点,则不调整 * 例如: a->b->c->d->e->f->g->h ,假如 k =3 ,则调整后的链表 为:c->b->a->f->e->d->g->h */public class Code04_ReverseNod

2021-11-09 16:19:44 109

原创 用双向链表实现双端队列

/** * 用双向链表实现双端队列 * 双端队列 可以从头进 也可以从尾进,可以从头出,也可以从尾出 */public class Code03_DoubleLinkedListToDeque { public static class Node<V>{ public V value; public Node<V> last; public Node<V> next; public Nod

2021-11-08 17:10:46 367

原创 用单链表实现队列和栈

/** * 用单链表实现队列和栈 * 队列 先进先出 每次加节点,head 不用移动,往 next 上放(在链表尾部加节点), * 栈 先进后出 每次加节点,head 需要 往前移动 (在链表头部加节点) */public class Code02_LinkedListToQueueAndStack { public static class Node<V>{ public V value; private Node<V> next

2021-11-08 17:09:29 255

原创 单链表和双链表的反转

public class Code01_ReverseList { public static class Node{ public int value; public Node next; public Node(int value) { this.value = value; } } public static class DoubleNode{ public int v

2021-11-08 17:07:03 144

原创 ArrayList扩容机制

ArrayList继承了AbstractList,实现了List接口,底层实现基于数组,因此可以认为是一个可变长度的数组。ArrayList扩容的本质就是计算出新的扩容数组的size后实例化,并将原有数组内容复制到新数组中去ArrayList 部分源码 /** * 默认初始容量 */ private static final int DEFAULT_CAPACITY = 10; /** * 定义一个空数组以供使用 */ private

2021-10-31 14:15:29 2277

转载 Hashmap链表长度为8时转换成红黑树

1. 为什么要转红黑树每次遍历一个链表,平均查找的时间复杂度是 O(n),n 是链表的长度。红黑树有和链表不一样的查找性能,由于红黑树有自平衡的特点,可以防止不平衡情况的发生,所以可以始终将查找的时间复杂度控制在 O(log(n))。最初链表还不是很长,所以可能 O(n) 和 O(log(n)) 的区别不大,但是如果链表越来越长,那么这种区别便会有所体现。所以为了提升查找性能,需要把链表转化为红黑树的形式。2. 为什么不直接用红黑树那为什么不一开始就用红黑树,反而要经历一个转换的过程呢?其实

2021-10-28 17:22:07 1320

转载 HashMap的长度为什么是2的N次幂,如何实现的?

问题:看过HashMap源码的人可能都用印象,就是hashMap的哈希表长度可以由自己指定也可以不指定使用默认长度,但是如果在了解或者发现tableSizeFor方法的话,你就会知道此方法会改变我们的输入长度 (如果我们输入15,他会改为16),那么他为什么要修改我们设置的长度,以及修改后有什么作用?带着这个疑问我们往下看;HashMap的长度为什么是2的N次幂?为了能让hashMap存取高效,尽量减少碰撞,也就是要尽量把数据分配均匀。Hash值的取值范围-2147483648到2147483

2021-10-28 17:09:03 549

转载 HashMap底层原理

常见的数据结构及特点1.数组结构 特点:存储区间连续、内存占用严重、空间复杂度大 优点:随机读取和修改效率高,原因是数组是连续的(随机访问性强,查找速度快,可以直接根据下标取出) 确定:插入和删除数据效率低,因插入数据,这个位置后面的数据在内存中都要往后移动,且大小固定不易动态扩展。2.链表结构 特点:存储区间离散、占用内存宽松、空间复杂度小 优点:插入删除速度快,内存利用率高,没有固定大小,扩展灵活 缺点:不能随机查找,每次都是从第一个开始遍历(查询效

2021-10-28 16:47:42 1331

转载 设计模式之建造者模式

建造者模式Builder在Java中一种简化的使用方式当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。当一个类的构造函数参数超过4个,而且这些参数有些是可选的时,我们通常有两种办法来构建它的对象。 例如我们现在有如下一个类计算机类Computer,其中cpu与ram是必填参数,而其他3个是可选参数,那么我们如何构造这个类的实例呢,以前,通常有两种常用的方式:public class Computer { private String cpu;//必须

2021-10-26 10:37:09 70

转载 设计模式之工厂模式三部曲

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

2021-10-25 15:14:08 77

原创 集合_用List实现栈和队列

1、栈的实现 栈的功能:进栈、出栈、返回栈口元素……import java.util.*; //1借助LinkedList 类中的方法实现栈public class MyStack { private LinkedList<Object> li=new LinkedList<Object>(); //1构造方法 public MyStack(){ } //2出栈 public Object pop(){ if(isEmpty()){

2021-10-21 17:12:12 313

原创 JVM调优

GC常用参数1. 常用垃圾回收器组合设定参数(1.8) 1. -XX:+UseSerialGC = Serial New(DefNew)+Serial Old 小型程序。默认情况下不会是这种选项,HotSpot会根据计算及配置和JDK版本自动选择收集器 JDK1.8及以前:PS + PO;JDK1.9:G1 2. -XX:+UseParNewGC = ParNew + SerialOld 这个组合已经很少用(在某些版本中已经废弃) 3. -XX:+UseConc(

2021-10-21 17:08:18 215

原创 JVM常见垃圾回收器及算法

1.什么是垃圾?没有任何引用指向的一个对象或者多个对象(循环引用)2.如何定位垃圾? 1.引用计数(ReferenceCount) 对象上存放引用它的引用数量,每当有地方引用它时,计数+1,去掉引用时,计数-1,当计数为0时,则认为是垃圾。但这种方案找不到循环引用的垃圾 2.根可达算法(RootSearching) 以静态变量、线程栈中变量、常量池(指向Class对象)、JNI指针(指向native方法用到的类或对象),作为根引用,顺着根引用能找到的对象都不是垃圾,其他的都是垃圾,Hot

2021-10-21 11:15:32 274

原创 Java内存区域(运行时数据区域 JVM内存模型)

Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分。Java 运行时数据区域程序计数器(Program Counter Register)存放指令位置,虚拟机的运行,类似于这样的循环:while(not end){ 1.取PC中的位置,找到对应位置的指令; 2.执行该指令; 3.pc++;}Java虚拟机栈(Java Virtual Machine Stacks)Java虚拟机栈 里面是一个一个的栈帧(Stack

2021-10-19 16:44:21 80

空空如也

空空如也

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

TA关注的人

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