自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【算法题】小红的区间翻转

想了一下不用纯暴力了,先找到左右两个数组不相同的地方,再遍历,这样存在一个问题,回文区间左右两个数相同时,同样也是一个方案,因此加上左右的情况。验证翻转的函数是这样写的,先克隆,再翻转对应区间,最后用equals判断。后来考虑到可能是验证翻转函数的问题,改为原地判断,提前返回。第一个想法就是写一个验证翻转的函数,然后暴力遍历两遍。结论:时间是短了,可是还是超时。

2024-07-12 16:24:08 327

原创 【Spring】循环依赖

循环依赖(Circular Dependency),也称为循环引用,是指两个或多个对象(在Spring框架中通常指的是Bean)之间相互依赖,最终形成了一个依赖的闭环。具体来说,如果对象A依赖于对象B,而对象B又依赖于对象A,或者通过其他对象间接形成依赖闭环,那么这种情况就被称为循环依赖。

2024-07-11 21:39:33 546

原创 SpringAOP的坑

与Spring4类似,如果配置了环绕通知(@Around),则环绕通知的执行顺序仍然是最先执行其前置处理,然后是目标方法执行,接着是环绕通知的后置处理,最后是其他通知(@AfterReturning、@AfterThrowing、@After)根据是否发生异常来决定执行顺序。如果配置了环绕通知(@Around),则环绕通知的前置处理会先于@Before执行,环绕通知的后置处理也会先于@After、@AfterReturning、@AfterThrowing执行。

2024-07-08 09:25:18 439 1

原创 【深入理解JVM】关于Object o = new Object()

具体来说,如果JVM在分配了对象的内存空间后,尚未完成构造方法的执行(即对象还未完全初始化),而另一个线程已经获得了这个对象的引用,那么这个对象就处于“半初始化”状态。此外,如果对象是一个数组的实例,那么对象头中还需要记录数组的长度。在Java中,虽然JVM的规范和设计努力避免对象处于这种不稳定的状态,但在多线程环境下,由于指令重排序等并发问题,仍有可能出现对象半初始化的现象。中,对象按照其生命周期被划分为不同的代(如年轻代、老年代等),但这主要影响垃圾收集的策略,而非对象本身的存储布局。

2024-07-07 17:17:00 727

原创 纤程和协程理解

进程是系统分配资源的最小单位,一个进程包含多个线程,那么纤程和协程又是啥呢?

2024-07-06 23:27:42 361

原创 线程池理解及7个参数

线程池其实是一种池化的技术实现,池化技术的核心思想就是实现资源的复用,避免资源的重复创建和销毁带来的性能开销。线程池可以管理一堆线程,让线程执行完任务之后不进行销毁,而是继续去处理其它线程已经提交的任务。使用线程池的好处降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

2024-07-06 21:56:02 635

原创 【锁】各种锁的概念

互斥锁和自旋锁都是最基本的锁,读写锁可以根据场景来选择这两种锁其中的一个进行实现。另外,互斥锁、自旋锁、读写锁都属于悲观锁,悲观锁认为并发访问共享资源时,冲突概率可能非常高,所以在访问共享资源前,都需要先加锁。乐观锁、悲观锁是从锁的心态出发,和业务场景高度相关。统一锁、分段锁是从锁的粒度出发,全局和局部锁的划分。

2024-07-06 17:30:57 689

原创 【并发编程JUC】AQS详解

AQS,全称为AbstractQueuedSynchronizer,是Java并发包(java.util.concurrent)中的一个框架级别的工具类,用于构建锁和同步器。它是许多同步类的基础,如ReentrantLock、Semaphore、CountDownLatch等,都是通过实现AQS的模板方法来实现其内部同步逻辑的。同步状态:AQS使用一个volatile int类型的变量来表示同步状态,通过内置的FIFO(先进先出)队列(也称为CLH队列,一个虚拟的双向队列)来完成获取资源线程的排队工作。

2024-07-05 17:09:53 957

原创 【深入理解Java虚拟机】判断垃圾-引用计数法及其缺陷

引用计数法用来判断对象是否存活给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值加一;当引用失效时,计数器的值就减一,任何时刻计数器为0的对象是不可能在被使用的。(存在问题)优点:实现简单,效率高但是为什么Java虚拟机中没有使用引用计数法来判断对象是否存活呢?

2024-07-04 21:19:54 188

原创 【JUC】LockSupport理解

await(), signal(), 和 signalAll() 的调用必须在持有相关 Lock 的同步代码块中进行。LockSupport使用了一种名为permit(许可)的概念来做到阻塞和唤醒线程的功能,每个线程都有一个许可,permit只有两个值0和1,默认是0。await(), signal(), 和 signalAll() 是 java.util.concurrent.locks.Condition 接口中的方法。中实现线程间的等待和唤醒。关键字一起使用,用于在。Unsafe类的本地方法。

2024-07-03 14:20:25 599

原创 【JUC】可重入锁理解

因此,synchronized (this) 实际上是在锁定这个 Runnable 的匿名内部类的实例。这意味着只要这个线程在执行,它就可以无限次地重新进入这个 synchronized 块,因为它总是持有同一个锁(即这个 Runnable 实例的锁)。在 Runnable 的匿名内部类中,this 关键字指的是该匿名内部类的实例,而不是 WhatReentrant 类的实例或任何外部类的实例。可重入锁(Reentrant Lock),也称作递归锁,是一种特殊的锁机制,它允许同一个线程多次获取同一个锁。

2024-07-03 09:58:42 226

原创 【经典算法题】两数之和

两层for循环,O(n*n)

2024-07-03 09:30:36 122

原创 【场景题】数据库优化和接口优化——优化深分页问题

就是标记一下上次查询到哪一条了,下次再来查的时候,从该条开始往下扫描。就好像看书一样,上次看到哪里了,你就折叠一下或者夹个书签,下次来看的时候,直接就翻到了。在MySQL等关系型数据库中,深分页查询通常使用LIMIT offset, limit语句来实现,但这种方式在处理大量数据时存在效率问题。延迟关联法,就是把条件转移到主键索引树,然后减少回表。深分页问题指的是在数据库查询中,当请求的页码数非常大,即OFFSET(偏移量)数值非常大时,查询性能会急剧下降的问题。

2024-07-02 20:06:59 277

原创 【场景题】数据库优化和接口优化——异步思想

Spring Boot 中使用异步方法优化 Service 逻辑,提高接口响应速度:https://cloud.tencent.com/developer/article/1904921。对于耗时的操作,可以考虑使用异步处理方式来提升接口的响应速度。用户可以在不阻塞当前操作的情况下,等待异步操作的结果。虽然数据库操作本身(如查询、插入、更新等)通常是同步的,但我们可以在应用程序层面采用异步策略来优化数据库的使用。

2024-07-02 19:50:31 235

原创 【场景题】数据库优化和接口优化——批量操作数据库

批量操作数据库是一种高效处理大量数据的方法,其核心思想在于通过一次性执行多个数据库操作来减少与数据库的交互次数,从而提高数据处理效率和性能。

2024-07-02 16:44:05 220

原创 字符串-详解 String.intern() 方法

如果存在,就返回常量池中该字符串的引用;第二行代码,对 s1 执行 intern() 方法,该方法会从字符串常量池中查找“二哥三妹”这个对象是否存在,此时不存在的,但堆中已经存在了,所以字符串常量池中保存的是堆中这个“二哥三妹”对象的引用,也就是说,s2 和 s1 的引用地址是相同的,所以输出的结果为 true。第一行代码,会在字符串常量池中创建两个对象,一个是“二哥”,一个是“三妹”,然后在堆中会创建两个匿名对象“二哥”和“三妹”,最后还有一个“二哥三妹”的对象,s1 引用的是堆中“二哥三妹”这个对象。

2024-07-02 10:16:52 611

原创 设计模式-策略模式

策略模式(Strategy Pattern)是一种行为型设计模式,旨在定义一系列算法,并将每个算法封装起来,使它们可以相互替换。这种模式的主要优点在于算法可以独立于使用它的客户端而变化,使得算法的定义和使用分离开来。核心思想:将算法的使用与算法的实现分离开来,使得算法可以独立地变化。结构组成策略接口(Strategy):定义了所有具体策略类所需要实现的方法,是所有具体策略类的公共接口。具体策略(ConcreteStrategy):实现了策略接口的具体类,每个策略都封装了一个特定的行为。

2024-07-01 14:31:28 605

原创 设计模式-模板方法模式

模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,并将一些步骤延迟到子类中实现。这样,模板方法可以让子类在不改变算法结构的前提下,重新定义算法的某些特定步骤。定义一个抽象类AbstractBank,这个类包含了银行业务办理流程的骨架,即模板方法。

2024-06-30 10:26:59 783 1

原创 redis实战-缓存雪崩问题及解决方案

缓存雪崩是指在同一时间段,大量缓存的key同时失效,或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力缓存雪崩是由于缓存中的大量数据同时失效或缓存服务器故障引起的;而缓存击穿则是由于某个特定的热点数据失效且有大量并发请求访问引起的。缓存雪崩会影响到缓存中大量数据,导致整个系统的性能下降;而缓存击穿通常只涉及到某个特定的热点数据。

2024-06-29 21:16:12 224

原创 redis实战-缓存击穿问题及解决思路

缓存击穿也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,那么无数请求访问就会在瞬间给数据库带来巨大的冲击举个不太恰当的例子:一件秒杀中的商品的key突然失效了,大家都在疯狂抢购,那么这个瞬间就会有无数的请求访问去直接抵达数据库,从而造成缓存击穿。

2024-06-29 21:09:21 872

原创 redis实战-缓存穿透问题及解决方案

缓存穿透:缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远都不会生效(只有数据库查到了,才会让redis缓存,但现在的问题是查不到),会频繁的去访问数据库。

2024-06-29 19:19:56 317

原创 redis实战-添加商户缓存

线程1在查询缓存的时候,缓存TTL刚好失效,需要查询数据库并写入缓存,这个操作耗时相对较短(相比较于上图来说),但是就在这么短的时间内,线程2进来了,更新数据库,删除缓存,但是线程1虽然查询完了数据(更新前的旧数据),但是还没来得及写入缓存,所以线程2的更新数据库与删除缓存,并没有影响到线程1的查询旧数据,写入缓存,造成线程安全问题。由于我们的缓存数据源来自数据库,而数据库的数据是会发生变化的,因此,如果当数据库中数据发生变化,而缓存却没有同步,此时就会有一致性问题存在,其后果是。那么如何解决这个问题呢?

2024-06-29 19:07:41 788

原创 redis实战-短信登录

我们依赖于拦截器做登录校验,需求是只要用户一直访问,token有效期就一直刷新,不会过期,但是我们拦截器拦截的路径只是需要做登录校验的路径,并不是所有路径,一个服务中存在不需要登录校验的操作(如首页等),如果用户进行不需要登录校验的请求,token的有效期不会刷新。

2024-06-29 14:17:58 1183 1

原创 设计模式-抽象工厂模式

抽象工厂模式是一种为访问一系列相互关联的产品对象提供统一接口,而无需指定它们具体的类。抽象工厂模式可以创建多个不同类型的产品,这些产品构成一个产品族。简单来说,当抽象工厂模式如果只有一个产品体系的话就会退化为工厂方法模式。

2024-06-29 12:54:34 550

原创 设计模式-工厂方法模式

工厂方法模式定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。简单来说,简单工厂模式隐藏了创建对象的过程,将对象的使用和创建进行解耦,但是但我们需求变更,新增具体产品时,需要改动简单工厂类的逻辑,违反了“开放-封闭原则”(OCP),即软件实体应该对扩展开放,对修改关闭。因此出现了工厂方法模式。

2024-06-28 22:54:34 624

原创 设计模式-简单工厂模式

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它提供了一个用于创建对象的类(通常被称为“工厂类”),这个类会根据传入的参数来决定创建并返回哪一个类的实例。简单工厂模式将对象的创建与使用解耦,使得代码结构更加清晰,并且具有良好的扩展性。

2024-06-28 22:29:36 433

原创 设计模式-责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许将多个对象连接成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。这种模式的主要目的是避免请求发送者与多个接收者之间的耦合关系,将请求的发送者和接收者解耦。责任链模式使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

2024-06-28 22:14:22 756

原创 金融IT中BigDecimal相关

在java语言中,double和float用于二进制浮点型计算,无法得到精确的结果。而BigDecimal则用于精确的计算。不超过16位有效数字(最好是不超过13位)的科学和工程计算,可以使用double和float,但要求精确计或者超过了16位有效数字(超过13位也建议如此)的商业运算则需要使用BigDecimal进行运行,比如金融行业。

2024-06-04 10:50:20 734

原创 Java项目中 实体类(ENTITY,VO,DTO)

VO:值对象(Value Object),通常用于业务层之间的数据传递,和Entity一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要。VO:表现层对象(View Object),主要对应展示界面显示的数据对象,用一个VO对象来封装整个界面展示所需要的对象数据。

2024-03-06 19:28:09 822

原创 GDAL安装(离线安装)

在Windows中一般采用whl格式的安装包在conda环境下pip install 安装即可,最近创建新环境发现安装包链接失效(https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal)换成新链接即可(https://github.com/cgohlke/geospatial-wheels/releases/tag/v2023.1.4)记录防丢失。

2024-02-23 20:14:35 582

原创 剑指offer-查找专题

首先试了下简单的双层for循环,超时。利用哈希表存储,遍历一次用contains函数查找,时间复杂度为O1,最后排序+一遍遍历,sort用的应该是快排,时间复杂度为logn。题比较简单,方法比较多,可以用哈希表记录,操作的时候最好用toCharArray()转为数组,以上代码查找字符出现的一个位置和最后一个位置,判断是否相同,其时间复杂度较高。两种方法,一是暴力,但是没有利用到递增信息,二是二分查找,时间复杂度更优,为O(logn)此题的要求应该是用二分查找解题,只需比较中间与右边的数的大小来控制区间。

2023-10-09 09:53:31 159

原创 剑指offer-模拟专题

出栈操作: 每次入栈后,循环判断 “栈顶元素 === 弹出序列的当前元素” 是否成立,将符合弹出序列顺序的栈顶元素全部弹出。入栈操作: 按照压栈序列的顺序执行。设定好边界,注意细节。

2023-09-21 16:02:42 97

原创 剑指offer-栈与队列专题

Java 代码中,由于 Stack 中存储的是 int 的包装类 Integer ,因此需要使用 equals() 代替 == 来比较值是否相等。链表在头部插入和删除元素的操作非常高效,这正是栈的核心操作(压栈和弹栈)。因此,使用链表模拟栈能够以常数时间复杂度(O(1))执行这些操作,而不会像数组那样需要移动大量元素。链表允许栈的大小动态增长或缩小,而不需要预先分配固定大小的存储空间。使用链表模拟栈(Stack)是一种常见的数据结构设计选择,因为链表的结构特点与栈的行为非常相似。

2023-09-20 15:00:27 102 1

原创 剑指offer-双指针专题

trim()的作用是去掉字符串两端的多余的空格,注意,是两端的空格,且无论两端的空格有多少个都会去掉。建一个头节点,写两个指针,把小的节点连接在后即可,需要注意的是,当某个链表遍历到尾后,另一个链表可以直接加入,返回即可。利用双指针,初始化pre为null,cur为head,此时注意下删除head的头节点时的情况即可。倒数第k个节点,只需要快指针先走k-1步,然后快慢指针一起走到链表尾即可。分别遍历取快慢指针,同时前进判断即可。遍历一遍,左右双指针,奇数放左边,偶数放右边。

2023-09-19 18:31:19 52

原创 剑指offer-链表专题

剑指offer-链表专题06.从尾到头打印链表** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { ArrayList<Integer> tmp=new ArrayList<Integer>(

2023-09-18 21:25:51 42

原创 剑指offer-字符串专题

的含义:就是将数组array中 索引值从0开始 长度为index 的部分截取出来然后建立一个新的字符串newStr。利用自动机解题思路很清晰,但是代码写的复杂,值得注意的是:1.可以直接使用Character.isDigit()函数判断是否为数字;(-1)会发生溢出,可以写成ans>-(long)Integer.MIN_VALUE 或 ans*sign<Integer.MIN_VALUE。空格替换为三个字符,长度不对等,转化为数组进行判断,最后数组转化为字符串。

2023-09-12 16:04:44 48

原创 动态规划基础模型学习

思路:假设n个节点存在二叉排序树的个数是G(n),1为根节点,2为根节点,…,n为根节点,当1为根节点时,其左子树节点个数为0,右子树节点个数为n-1,同理当2为根节点时,其左子树节点个数为1,右子树节点为n-2,所以可得G(n) = G(0)G(n-1)+G(1)(n-2)+…+G(n-1)*G(0)

2023-09-08 18:59:05 56 1

原创 哈希表学习(设计哈希集合和哈希映射)

HashMap的键必须是唯一的,但值可以重复。//定义//添加键值对//获取值// 返回5//检测包含某个键// 返回false//遍历哈希表的键或值//删除键值对//清空哈希表//获取大小哈希集合(HashSet)是一种集合数据结构,它用于存储一组唯一的元素,即集合中不允许重复的元素。哈希集合的实现通常基于哈希表,这使得插入、查找和删除元素的操作非常高效。注意,哈希集合不保证元素的顺序,元素的顺序通常是不确定的。//定义//添加元素//移除元素。

2023-08-30 22:48:25 116 1

原创 贪心算法(分发饼干、无重叠区间、买卖股票的最佳时机)

记录并学习贪心策略。

2023-08-29 21:51:52 68 1

原创 word设置不同节的页眉(奇偶不同)、页码(奇偶相同)

最近写文档需要设置第三节正文部分奇偶页眉不同,查资料比较少,记录问题。

2023-08-27 10:29:55 8911 4

空空如也

空空如也

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

TA关注的人

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