自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(214)
  • 收藏
  • 关注

原创 git 常用命令

git reset HEAD 丢弃暂存区的修改,重新放到工作区,可以理解为撤销了git add,类似于 git restore --staged ,包括文件的操作,添加文件、删除文件。git restore 撤销修改,也就是撤销了git add 之前的内容 相当于撤销git checkout。git restore --staged 将文件从暂存区撤出,但不会撤销文件的更改。4、--soft 不会删除工作空间修改的内容。

2023-11-27 17:13:57 336

原创 设计模式总览

设计模式-未完待续

2023-11-27 17:05:10 312

原创 算法练习-冒泡排序

冒泡排序

2022-11-21 23:03:56 179 1

原创 算法练习-选择排序

选择排序

2022-11-21 23:02:38 125

原创 SpringBoot 过滤器和拦截器

一、拦截器与过滤器  在讲Spring boot之前,我们先了解一下过滤器和拦截器。这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的。在分析两者的区别之前,我们先理解一下AOP的概念,AOP不是一种具体的技术,而是一种编程思想。在面向对象编程的过程中,我们很容易通过继承、多态来解决纵向扩展。 但是对于横向的功能,比如,在所有的service方法中开启事务,或者统一记录日志等功能,面向对象的是无法解决的。所以AOP——面向切面编程其实是面向对象编程思想的一个补充。而我们今天讲的过滤器和拦截

2022-11-21 23:01:22 124

原创 建造者模式

public class Phone { private String cpu; private String screen; private String memory; private String mainboard; private Phone(Builder builder) { this.cpu = builder.cpu; this.screen = builder.screen; this.memo.

2022-11-21 23:00:36 46

原创 Java 执行执行控制台命令

public static void main(String[] args) throws IOException { // 获取Runtime对象 Runtime runtime = Runtime.getRuntime(); // 通过Runtime对象执行ls命令 Process ifconfig = runtime.exec("ls"); // 通过Process获取输入流对象 InputStream .

2022-05-02 16:57:06 1025

原创 20221121

1、为什么不使用AVL树而使用红黑树?2、Redis的内存淘汰策略? 2.1、过期策略定期删除:Redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定期遍历这个字典来删除到期的 key。Redis 默认会每秒进行十次过期扫描(100ms一次),过期扫描不会遍历过期字典中所有的 key,而是采用了一种简单的贪心策略。1.从过期字典中随机 20 个 key;2.删除这 20 个 key 中已经过期的 key;3...

2022-02-20 23:30:00 352

原创 泛型使用过程中不要在新代码中使用原生态类型

public class Generic { public static void main(String[] args) { // 原生态类型 List list = new ArrayList<>(); list.add(1); list.add(2L); System.out.println(list.get(0)); // System.out.println((Integer.

2022-02-20 15:00:00 378

原创 优先考虑静态成员类

内部类种类:静态成员类、非静态成员类、匿名类、局部类,相当于内部类的辅助类。public class StaticOrNoClass { // 静态成员类 static class A { public static String a = "123"; } // 非静态成员类 class B { public String b = "789"; } private static String a = "456";.

2022-02-20 10:35:08 133

原创 Java中处理null的方式

1、Java8或者guava lib中,提供了Optional类,这是一个元素容器,通过它来封装对象,可以减少判空,不过代码量还是不少,不是很爽。2、Collections返回空的时候,可以直接返回空集合,调用方可以省略判空,但是前提是有一个良好的编程习惯。3、接口入参如果判断参数为null的化,可以抛出一异常。4、接口入参可以通过Assert语句来处理null。5、可以通过以下基于工厂模式的方式来处理null的问题。具体的操作public interface Action {..

2022-02-13 11:00:00 2724

原创 AQS 学习笔记

1、第一天ReentrantLock AQS 程序 = 思想 + 代码 思想 = 解决问题的思路 银行办业务 1、看办理的人多不多,不多就直接去柜台,多就排队 2、排队的时候有等待去 3、如果行长小舅子来办业务,肯定不需要排队,直接去办理业务。 非公平 4、过号了,重新排 if (failed) cancelAcquire(node); 5、简答的运算 A&&B .

2022-02-12 19:07:31 199

原创 SpringBoot 学习知识点

1、SpringBoot异步调用@EnableAsync @Async2、SpringBoot全局异常使用@ControllerAdvice 定义全局异常处理类 @ExceptionHandler 用于定义函数针对的异常类型3、SpringBoot重试机制@EnableRetry @Retryable4、SpringBoot拦截器自定义实现HandlerInterceptor类的注入Spring容器中,preHand...

2022-02-11 11:06:19 513

原创 Java锁与并发

1、偏向锁Java虚拟机中的实现中每个对象都有一个对象头,用于保存对象的系统信息,对象头中有一个成为MarkWord的部分,是实现锁的关键。当某一个线程获取锁以后,就会进入偏向锁,当线程再次请求这个锁的时候,无须在进行相关同步操作,从而节省了操场时间。如果在此期间其他线程进行了锁请求,则退出偏向锁。--XX:UseBasicedLocking可以设置启用偏向锁。当锁对象处于偏向模式的时候,对象头会记录获取锁的线程。JavaThe...

2022-01-17 01:00:00 308

原创 JVM内存溢出

1、堆溢出绝大部分的内存溢出属于堆溢出,原因是大量对象占用了堆空间,而这些对象持有强引用,无法回收。-Xmx参数指定堆空间大小小于对象大小时候,溢出自然而然的就发生了。 报错信息:java.lang.OutOfMemoryError: Java heap space 为了减少堆溢出错误,一方面可以使用-Xmx指定一个更大的堆空间。另外可以通过MAT或者VisualVM等工具,找到大量占用堆空间的对象,并在代码上合理优化。2、直接内存溢出在Ja...

2022-01-16 17:45:00 4026

原创 Java-Lock锁

1、JDK1.5以后,Java提供了Lock同步锁,相对与需要JVM隐士获取和释放锁Synchronized 同步锁,Lock同步锁需要显示获取和释放锁,这就为获取和释放锁提供了更多的灵活性。2、Lock锁的基本操作通过乐观锁来实现,但是由于Lock锁也会在阻塞的时候被挂起,因此它依然属于悲观锁。对比Synchronized和Lock如下图 Synchronized Lock 实现方式 ...

2022-01-10 02:30:00 2281

原创 Synchronized

1、JVM在JDK1.6中引入了分级锁机制来优化Synchronized,一个线程获取锁的时候,首先对象锁将成为一个偏向锁,这样做是为了优化同一线程重复获取锁导致的用户态和内核态的切换问题,其次如果有多个线程竞争锁资源,锁将升级为轻量级锁,轻量级锁适用与在短时间内持有锁,且锁有交替切换的场景,轻量级锁使用了自旋锁来避免线程用户态和内核态的频繁切换,提高了系统性能,如果竞争激烈的化,同步锁会升级为重量级锁。2、减少锁竞争,减小锁粒度,减少锁的持有时间,Synchronized同步锁在自旋时...

2022-01-09 16:19:47 361

原创 设计模式-继承和组合

1、组合优于继承,日常开发中多用组合少用继承。2、为什么不推荐使用继承?继承是面向对象的四大特性之一,用来表示类之间的is-a关系,可以解决代码复用的问题。虽然继承有诸多作用,但当继承层次过深、过于复杂的时候,也会影响到代码的可维护性。在这种情况下,应该尽量少用,甚至不用继承。3、组合相比继承有哪些优势? 继承主要有三个作用:表示is-a关系,支持多态特性,代码复用。而这三个作用都可以通过组合、接口、委托三个技术手段来达成。除此之外,利用组合还能解决层次过深、...

2022-01-03 19:13:45 504

原创 OOM 如何排查

1、启动的时候加上-XX:+HeapDumpOnOutOfMemoryError以上为本地idea配置启动参数 设置堆最大128m,并且设置如果发生oom的化,打印自动打印进程快照通过上述配置然后执行如下代码后的控制台结果public static void main(String[] args) throws InterruptedException { Map<Integer, byte[]> map = new HashMap<>()..

2021-12-07 23:28:18 1387

原创 位数组排序

1、可以使用位数组排序的前提是数组中的元素不能有重复数字,而且这个数组可以无序,但数组中元素出现有最大范围限制。2、遍历元数组,将原数组的中的元素存放到事先创建好的位数组的指定位上。3、重新遍历位数组中的每个位如果为true的化,则附加到最终结果上。// 使用BitSet进行排序 private static String sortNums(Integer[] integers) { long start = System.currentTimeMillis();

2021-12-05 17:19:18 795

原创 分布式事务

1、2PC 1、单点故障 2、效率不高 3、强一致性,但容易导致死锁2、TCC 1、效率高 2、开发复杂 3、代码可侵入 4、最终一致性3、可靠消息服务 1、rabbitmq 响应机制 最终一致性 2、rocketmq 事务消息能力 最终一致性4、SEATA ...

2021-11-28 15:10:19 1140

原创 Java 创建单例模式

首先创建单例模式要符合三个条件:1、一个类只能创建一个对象;2、该类自己创建这个对象;3、提供全局对外生成对象的方法。1、饿汉模式public final class Singleton { private static Singleton instance=new Singleton();//该类自己创建实例 private Singleton(){}//构造函数私有 public static Singleton getInstance(){//通过...

2021-11-22 23:20:13 590

原创 减少Java多线程上下文切换的方式

1、减少锁的持有时间2、降低锁的粒度 锁分离 锁分段 Java 1.8 中 ConcurrentHashMap 使用了分段锁。3、乐观锁代替竞争锁 CAS 代替 Synchronized4、Condition await 替换 Object wait ,Condition signal 替换Object notify,Condition signalAll 替换Object notifyAll,整体上解决提前唤醒和无法做到区分唤醒的问题。5、合理的设置...

2021-11-21 22:19:01 741

原创 哪些操作可能导致线程上下文切换?

多线程

2021-11-21 17:24:17 1137

原创 MySQL分库分表

1、首先说明一下能不分库分表就不分库分表。因为分库分表会以后会面临很多问题,例如多表的分页查询,多表的join查询,跨库事务的问题,分布式ID,扩容问题等,势必会提高系统的复杂读。2、基于此后续研究的学习的内容就有了,比如分布式事务、分布式id、数据库分库分表开源中间件、数据库扩容原理等。3、当然了,为了业务正常的发展还是需要分库分表的,以此来提高io读写、数据库链接、网络吞吐等瓶颈。单表单库的情况下,单表5000W或100G以上,操作数据库性能会出现明显下降。4、数据库分库分表分位垂直和水平两

2021-11-21 12:38:39 1020

原创 Mysq索引优化、如何避免死锁

1、使用覆盖索引来避免回表。2、使用自增字段作为主键优化查询。3、前缀索引,减少索引存在页,进而在查询是减少io,提高效率。 order by 无法使用前缀索引,无法把前缀索引作为覆盖索引。4、如果查询条件中使用or,且or的前后条件中有一个列没有索引,那么涉及索引都不会被使用到。5、可以尝试通过force index 来强制使用索引。6、mysql事务的隔离性通过 锁来实现,事务的原子性和一致性通过undolog和mvcc实现。事务的持久性通过redolog + ...

2021-11-20 17:06:52 832

原创 如何写出高性能SQL语句?

1、慢SQL语句的几种常见原因 1)、无索引 2)、索引失效索引会失效原因:未遵循左前缀原则;在索引列上做操作比如计算、函数、自动或者手动类型转化;范围检索也会让索引失效比如联合索引 (a,b,c) 在sql查询的时候 where a = x and b > y and c = z 这样会导致索引c失效,原因是索引在b处已经开始排序了;使用!= or <> 无法使用索引; is null 和 is not null 也...

2021-11-20 13:38:42 758

原创 Java 字符串性能优化

1. 如何构建超大字符串?public class Main { public static void main(String[] args) { String str= "ab" + "cd" + "ef"; System.out.println(str == "abcdef"); // true }} 上述代码会不会生成String对象 ab,然后生成String对象 abcd ,然后再生成String对象abcdef呢?其实不是。通过反编译.

2021-11-14 22:39:05 453

原创 Java 初始化顺序说明

1、针对普通类的初始化顺序如下:1)、静态属性 static 修饰。2)、静态代码块 static {} 修饰。 3)、普通属性 4)、普通代码块 5)、构造方法2、针对包含继承关系的子类初始化顺序如下: 1)、父类静态变量 2)、父类静态代码块 3)、子类静态变量 4)、子类静态代码块 5)、父类普通变量 ...

2021-11-14 21:27:12 217

原创 怎样确保消息的可靠性投递?

1、生产阶段: 通过请求确认机制来保证,即生产者发送消息的Broker以后,Broker在成功收到消息以后,回发送ACK确认到生产者,生成者收到Broker发送的ACK确认以后,则认为消费发送成功了。如果迟迟收不到ACK,生产者会重试,或者抛出异常给用户。2、存储阶段:存储阶段只要 Broker 在正常运行,就不会出现丢失消息。但如果 Broker 出现了故障,比如进程死掉了或者服务器宕机了,还是可能会丢失消息。 如果是单实例Broker的化,可以设置...

2021-11-14 10:32:58 1332

原创 RocketMQ 中的分布式事务实现

1、生成者发送半消息到Broker。2、Broker在收到半消息以后向生产者发送半消息发送成功确认。3、执行本地事务。4、本地事务执行成功则生产者发送提交消息事务请求向Broker,上述半消息会被订阅消费者消费,本地事务执行失败则生产者发送回滚消息事务请求向Broker,上述半消息会被删除。5、Broker迟迟得不到提交或者回滚消息。RocketMQ中的事务实现中,增加了反查机制来解决事务消息提交失败的情况。 如果Producer在提交或者回滚事务的时候网络发生异常,Rock...

2021-11-13 18:08:44 1539

原创 数据库唯一索引和普通索引的区别?

1、如果业务字段更新频繁的化,选择唯一索引还是普通索引? 如果业务上能保证唯一性的化尽量使用普通索引而不是唯一索引。2、针对查询而言普通索引的查询是在查询到符合条件的内容以后,继续进行下一项内容查询,如果下一项不符合则返回;但是唯一索引的查询是查询到满足条件的内容直接返回,整体上少一次查询比较,但是整体效率相差不大。3、针对更新操作来说两者就有很大的差距了。 要在更新操作上理解两者之间的差距首先理解一下change buffer。 change buffer...

2021-11-13 16:09:30 967

原创 出栈序列是否是入栈序列

public static boolean isPopOrder01(int[] pushA, int[] popA) { if (pushA.length == 0 || popA.length == 0) { return false; } int popIndex = 0; Stack<Integer> stack = new Stack<>(); for (int num : pushA) { st.

2021-08-28 16:45:54 56

原创 二叉树最小最低公共祖先

public class Main { private static TreeNode<Integer> ans; private static boolean dfs(TreeNode<Integer> root, TreeNode<Integer> p, TreeNode<Integer> q) { if (root == null) { return false; } .

2021-08-21 09:29:40 91

原创 数组全全排列

public static List<List<Integer>> permute(int[] nums) { List<List<Integer>> res = new ArrayList<>(); int len = nums.length; if (len == 0) { return res; } Stack<Integer> path = new Stack<&.

2021-08-21 09:28:22 49

原创 有序单链表合并递归实现

package LinkedListDemo;public class Main { public static Node mergeSortLinkedList(Node head1, Node head2) { if (head1 == null) { return head2; } if (head2 == null) { return head1; } .

2020-12-06 20:49:28 127

原创 最长递增子序列

package LongestIncrSub;import java.util.Arrays;import java.util.HashSet;/** * 功能描述 * 最长递增子序列 */public class Main { public static void getLongestIncrSub(int[] arr) { int len = arr.length; int[] dp = new int[len]; int[].

2020-12-06 10:24:44 57

原创 反射三种方式

public class ReflectionDemo { public static void main(String[] args) { Class <?> cls = String.class; //仅适合在编译前就已经明确要操作的 Class try{ //已明确类的全路径名 Class <?> c= C...

2019-06-12 11:16:04 1466

原创 Java 工厂设计模式

interface Fruit{ public void eat();}class Apple implements Fruit{ public void eat(){ System.out.println("*** 吃苹果"); }}class Orange implements Fruit{ public void eat(){...

2019-06-12 10:36:03 98

原创 Java 基本数据类型

public class Demo01{ public static void main(String[] args) { // float to double float f1 = 10; Float ff = new Float(f1); Double dd = ff.doubleValue(); Sys...

2019-03-31 19:44:26 174

空空如也

空空如也

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

TA关注的人

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