- 博客(69)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 面试高频点:讲一讲Spring中的循环依赖
1. 什么是循环依赖?一般场景是一个Bean A依赖Bean B,而Bean B也依赖Bean A :Bean A → Bean B → Bean A当然我们也可以添加更多的依赖层次,比如:Bean A → Bean B → Bean C → Bean D → Bean E → Bean A2. Spring中的循环依赖当Spring上下文在加载所有的bean时,他会尝试按照他们他们关联关系的顺序进行创建。比如,如果不存在循环依赖时,例如:Bean A → Bean B → Bean CSpring
2021-07-22 22:12:57
1529
2
原创 为什么有了HTTP,还需要WebSocket协议?
在 HTTP/1.1 里,只要客户端不问,服务端就不答。基于这样的特点,对于登录页面这样的简单场景,可以使用定时轮询或者长轮询的方式实现服务器推送(comet)的效果。对于客户端和服务端之间需要频繁交互的复杂场景,比如网页游戏,都可以考虑使用 WebSocket 协议。
2023-09-11 08:03:23
144
原创 既然有 HTTP 协议,为什么还要有 RPC
HTTP协议(HyperTextTransferProtocol),又叫做超文本传输协议。平时上网在浏览器上敲个网址就能访问网页,这里用到的就是HTTP协议。RPCRemoteProcedureCall),又叫做远程过程调用。它并不是一个具体的协议,而是一种调用方式。像之前的单体时代,我们的 service 调用就是自己实现的方法,是本地进程内的调用。// 这叫本地调用现在都是微服务了,根据业务模块做了不同的拆分,像用户的服务不用我这个小组负责,我这小组只要写订单服务就行了。
2023-09-07 11:03:44
1017
原创 CPU 伪共享是如何发生的?又该如何避免?
之后,2 号核心需要修改变量 B,此时 2 号核心的 Cache 中对应的 Cache Line 是已失效状态,另外由于 1 号核心的 Cache 也有此相同的数据,且状态为「已修改」状态,所以要先把 1 号核心的 Cache 对应的 Cache Line 写回到内存,然后 2 号核心再从内存读取 Cache Line 大小的数据到 Cache 中,最后把变量 B 修改到 2 号核心的 Cache 中,并将状态标记为「已修改」状态。感兴趣的同学可以自己去学习了解一下。
2023-09-05 14:20:44
395
原创 4G的机器上申请8G的内存,是否可以成功?
4G的机器上申请8G的内存,是否可以成功?操作系统是 32 位的,还是 64 位的?申请完 8G 内存后会不会被使用?操作系统有没有使用 Swap 机制?在 32 位操作系统,因为进程最大只能申请 3 GB 大小的虚拟内存,所以直接申请 8G 内存,会申请失败。在 64 位操作系统,因为进程最大只能申请 128 TB 大小的虚拟内存,即使物理内存只有 4GB,申请 8G 内存也是没问题,因为申请的内存是虚拟内存。
2023-08-28 12:31:02
209
原创 Java 一文讲清楚 CompletableFuture
当需要批量提交异步任务的时候建议使用CompletionService。CompletionService将线程池Executor和阻塞队列BlockingQueue的功能融合在了一起,能够让批量异步任务的管理更简单。CompletionService能够让异步任务的执行结果有序化。先执行完的先进入阻塞队列,利用这个特性,你可以轻松实现后续处理的有序性,避免无谓的等待,同时还可以快速实现诸如Forking Cluster这样的需求。线程池隔离。
2023-08-02 11:16:54
273
原创 mysql “order by”是怎么工作的?
开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求。还是以我们 前面举例用过的市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回 前1000个人的姓名、年龄。假设这个表的部分定义是这样的:这时,你的SQL语句可以这么写:select city,name,age from t where city='杭州' order by name limit 1000;这个语句看上去逻辑很清晰,但是你了解它的执行流程吗?今天,我就和你聊聊这个语句是怎么。
2023-04-23 09:14:39
445
原创 Mysql “order by”是怎么工作的?
开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求。还是以我们 前面举例用过的市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回 前1000个人的姓名、年龄。这个语句看上去逻辑很清晰,但是你了解它的执行流程吗?今天,我就和你聊聊这个语句是怎么执行的,以及有什么参数会影响执行的行为。
2023-03-13 17:43:46
200
原创 一条SQL查询语句是如何执行的?
平时我们使用数据库,看到的通常都是一个整体。我们看到的只是输入一条语句,返回一个结果,却不知道这条语句在MySQL内部的执行过程。所以今天我想和你一起把MySQL拆解一下,看看里面都有哪些“零件”。下面是MySQL的基本架构示意图,从中你可以清楚地看到SQL语句在MySQL的各个功 能模块中的执行过程。MySQL的逻辑架构图也就是说,你执行create table建表的时候,如果不指定引擎类型,默认使用的就是InnoDB。不。
2023-03-07 11:13:04
510
原创 Spring容器启动流程
Spring会将所有交由Spring管理的类,扫描其class文件,将其解析成BeanDefinition,在BeanDefinition中会描述类的信息,例如:这个类是否是单例的,Bean的类型,是否是懒加载,依赖哪些类,自动装配的模型。Spring创建对象时,就是根据BeanDefinition中的信息来创建Bean。
2022-09-07 13:51:34
694
原创 web3.0 nft 是什么? nft的意义是什么?
简单来说,就是使用区块链技术进行签名的数字产品。举个例子:在传统社会中, 一个画家或者诗人在完成自己的作品之后会签上自己的名字,然后盖上自己的印章。这就代表这个作品他具有所有权。那么在数字时代里呢?比如将一个图片制作成nft,就相当于盖上了所有权的印章,赋予了这张图片唯一的身份证明。nft的全称是 Non-Fungible Tokens 的缩写,意思是不可互换的代币,它是相对于可互换的代币而言的。不可互换的代币也称为非同质代币。什么是可互换的代币?......
2022-08-16 12:57:06
3350
原创 Redis Sentinel 与 Redis Cluster
本文主要介绍Redis Sentinel 及 Redis Cluster的区别Redis-Sentinel(哨兵模式)是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自懂切换。不时地监控redis是否按照预期良好地运行;.........
2022-08-11 10:37:33
1859
原创 redis过期策略和内存淘汰机制
Redis过期删除采用的是定期删除,默认是每100ms检测一次,遇到过期的key则进行删除,这里的检测并不是顺序检测,而是随机检测。显然Redis也考虑到了这一点,当我们去读/写一个已经过期的key时,会触发Redis的惰性删除策略,直接回干掉过期的key。单链表可以实现头部插入新节点、尾部删除旧节点的时间复杂度都是O(1),但是对于中间节点时间复杂度是O(n),因为对于中间节点c,我们需要将该节点c移动到头部,此时只知道它的下一个节点,要知道其上一个节点需要遍历整个链表,时间复杂度为O(n)。......
2022-08-09 10:43:46
2944
原创 ⚡️算法练习 ~数组-最大连续1的个数~⚡️
1 题目给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。返回仅包含 1 的最长(连续)子数组的长度。示例 1:输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2输出:6解释:[1,1,1,0,0,1,1,1,1,1,1]粗体数字从 0 翻转到 1,最长的子数组长度为 6。2 示例代码public int longestOnes(int[] A, int K) { int left = 0;//窗口左边的位置
2021-10-08 15:25:57
188
原创 ⚡️算法练习 ~数组-数组的度~⚡️
一、题目描述给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。示例 1:输入:[1, 2, 2, 3, 1]输出:2解释:输入数组的度是2,因为元素1和2的出现频数最大,均为2.示例 2:输入:[1,2,2,3,1,4,2]输出:6二、思路及解法记原数组中出现次数最多的数为 xx,那么和原数组的度相同的最短连续子数组
2021-09-28 14:40:28
125
原创 ✨设计模式~工厂模式✨
一、简述工厂模式是最常用的一类创建型设计模式,工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建。下面我们我们来简单介绍一下三种工厂模式,以及在实际项目中的应用。二、简单工厂模式角色:Factory(工厂角色):工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑;工厂类可以被外界直接调用,创建所需的产品对象;Product(抽象产品角色):它是工厂类
2021-09-26 13:58:15
269
原创 ⚡️算法练习 ~字符串-左旋转字符串~⚡️
描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列 S,请你把其循环左移 K 位后的序列输出(保证 K 小于等于 S 的长度)。例如,字符序列S=”abcXYZdef”,要求输出循环左移 3 位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!示例输入:“abcXYZdef”,3返回值:“XYZdefabc”题解有一种不是最优解,却是比较简单的一个方法,字符串反转public class Soluti
2021-09-23 15:48:27
155
原创 ⚡️算法练习 ~栈-获取栈内的最小值~⚡️
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。import java.util.Stack;/** * 定义栈的数据结构,请在该类型中实现一个能够得到栈中 * 所含最小元素的min函数(时间复杂度应为O(1))。 * Created by haoll on 2021/5/25 */public class Solution { private Stack<Integer> stack = new Stack<
2021-09-22 13:42:42
255
原创 ⚡️算法练习 ~栈-栈的压入和弹出序列~⚡️
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)示例1输入[1,2,3,4,5],[4,3,5,1,2]返回值false解题思路借助一个栈来做栈的特点是先进后出表。栈是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进
2021-09-18 09:35:58
251
原创 ⚡️算法练习 ~数组-转置矩阵~⚡️
题目给你一个二维整数数组 matrix, 返回 matrix 的 转置矩阵 。矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[1,4,7],[2,5,8],[3,6,9]]示例 2:输入:matrix = [[1,2,3],[4,5,6]]输出:[[1,4],[2,5],[3,6]]解题思路原数组的行和列,正好就是新数组的列和行。对换即可示例代码public int
2021-09-17 09:29:58
460
原创 ⚡️算法练习 ~数组-最小的k个数~⚡️
题目描述给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组题解对于n个整数中最小的K个数的查找,可以使用各种排序算法:冒泡/堆排/快排/希尔排序等等。将此n个整数从小到大排序之后,前k个数就是所求的结果。但是当原数组中的数据顺序不可修改,并且n的值过于大的时候,各种排序算法要将n个数加载到内存中,即:如果是海量数据中查找出最小的k个数,那么这种办法是效率很低的。可以通过另一
2021-09-16 09:43:32
531
原创 ⚡️算法练习 ~数组-两数之和~⚡️
题目描述给出一个整数数组,请在数组中找出两个加起来等于目标值的数,你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足index1 小于index2.。注意:下标是从1开始的假设给出的数组中只存在唯一解例如:给出的数组为 {20, 70, 110, 150},目标值为90输出 index1=1, index2=2题解一简单粗暴,双层循环相加进行比较。这是最容易想到的方法,枚举数组中的每一个数 x,寻找数组中是否存在 target - ximport java
2021-09-15 11:14:27
378
原创 ⚡️算法练习 ~数组-顺时针打印矩阵~⚡️
描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵:则依次打印出数字[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]][1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]示例1输入:[[1,2],[3,4]]返回值:[1,2,4,3]解析简单来说,就是不断地收缩矩阵的边界:定义四个变量代表范围,up、down、left、right1、向右走存入整行的值,当
2021-09-15 09:54:20
278
原创 ⚡️算法练习 ~回文数字~⚡️
1 题目描述给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。2 示例代码/** * (方法一)字符串反转 */ public static boolean isPalindrome(int x) { if(x < 0){ return false; }
2021-09-14 09:48:57
615
原创 mybatis
mybatis的主要成员1、ConfigurationMyBatis所有的配置信息都保存在Configuration对象之中,配置文件的大部分配置都会存储到该类中。2、SqlSession作为MyBatis工作的主要顶层API,表示和数据库交互时的会话,完成必要数据库增删改查功能。3、ExecutorMyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护StatementHandler 封装了JDBC Statement操作,负责对JDBC statement 的操作
2021-09-13 10:21:56
638
原创 Spring ~~ 常见面试题
@Component 和 @Bean 的区别是什么?1、作用对象不同: @Component 注解作用于类,而@Bean注解作用于方法。2、@Component通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中(我们可以使用 @ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean告诉了Spring这是某个类的示例,当我需要用它的时候还给我。
2021-09-01 09:42:49
338
原创 同学~你了解@Transactional注解吗?
你在项目中是如何使用事物的?我们项目的框架都是使用的Spring,spring分为 编程式事务,在代码中硬编码。声明式事务,在配置文件中配置(推荐使用)声明式事务又分为两种:基于XML的声明式事务基于注解的声明式事务。我一般都是通过注解来进行的事务控制。也就是@Transactional能先简单介绍一下@Transactional注解吗?项目中如何使用的?有哪些注意点吗?我们都是把注解加到需要使用事务控制的方法上,也可以加到类上,加到类上是给类里的所有的方法都加了事务,不建议这样做,.
2021-08-27 11:08:10
930
原创 面试官问~如何对一个对象数组进行去重
背景介绍题目:现在有一个student类,有三个属性:分别是 String 类型的name, int类型的age、Date类型的birthy。创建一个student类型的数组,对这个数组进行去重。要求:只要是数组中的student对象的name值一样,birthy一样就代表是一个重复元素。这里主要考察我们的是1、如何重写equals和hashcode ?2、为什么要重写 equals和hashcode ?3、什么情况下必须重写 equals和hashcode 等一系列的问题。接下来的我们
2021-08-25 16:03:07
1214
原创 redis面试~~有这一篇就够了
redis介绍1、redis 是什么?redis可以理解就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向。另外,redis 也经常用来做分布式锁。redis 提供了多种数据类型来支持不同的业务场景。除此之外,redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。2、为什么要用 redis?/为什么要用缓存?因为传统的关系型数据库如Mysql已经不能适用所有的场景了,比如秒杀的库存扣减,APP首页
2021-08-21 10:29:07
1610
原创 Java基础面试~~多线程
1. 并行和并发有什么区别?并行:就是多个任务真实的同时执行。并发:偏重于多个任务交替执行,而多个任务之间有可能还是串行的。2. 线程和进程的区别?简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行。3. 守护线程是什么?守护线程(
2021-08-19 09:54:35
1813
原创 Java 基础面试题整理~持续更新
1、JAVA中的几种基本数据类型是什么,各自占用多少字节。java中8种基本数据类型:byte , short , int , long , float , double , char , boolean2、String类能被继承吗,为什么?String被关键字final修饰,所以不能被继承。1、修饰类当用final去修饰一个类的时候,表示这个类不能被继承。在JDK中,被设计为final类的有String、System等。2、修饰方法:被final修饰的方法不能被重写。3、修饰成员变量:必须初
2021-08-16 17:31:47
2247
原创 JUC ~~ ReentrantLock 详解
1 介绍重入锁ReentrantLock,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。除此之外,该锁的还支持获取锁时的公平和非公平性选择。1.1 重入锁的原理每一个锁关联一个线程持有者和计数器,当计数器为 0 时表示该锁没有被任何线程持有,那么任何线程都可能获得该锁而调用相应的方法;当某一线程请求成功后,JVM会记下锁的持有线程,并且将计数器置为 1;此时其它线程请求该锁,则必须等待;而该持有锁的线程如果再次请求这个锁,就可以再次拿到这个锁,同时计数器会递增;当线程退出同
2021-08-13 10:06:24
360
原创 JUC ~~ CyclicBarrier 详解
1 介绍CountDownLatch 在解决多个线程同步方面相对于join方法己经有了不少优化,但是CountDownLatch的计数器是一次性的,也就是等到计数器值变为0后,再调用CountDownLatch的await 和countdown 方法都会立刻返回,这就起不到线程同步的效果了。所以为了满足计数器可以重置的需要,JDK开发组提供了CyclicBarrier类。可以让一组线程全部达到一个状态后再全部同时执行,执行完毕之后重置CyclicBarrier的状态可以被重用。之所以叫做屏障是因为线程调用
2021-08-11 09:53:01
588
原创 JUC ~~ CountDownLatch 详解
1 案例介绍在日常开发中经常会遇到需要在主线程中开启多个线程去并行执行任务, 并且主线程需要等待所有子线程执行完毕后再进行汇总的场景。在CountDownLatch 出现之前一般都使用线程的join( )方法来实现这一点,但是join 方法不够灵活, 不能够满足不同场景的需要,所以JDK 开发组提供了CountDownLatch 这个类。1.1 Java中join()方法的理解thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的J
2021-08-10 09:42:48
306
原创 记一次线程池的故障,使用线程池该如何处理异常?
1 业务背景点赞业务:之前公司各个业务线的的点赞记录只存一条记录到数据库,并没有汇总每个资源的点赞总数,这样的话等到缓存失效时候,就需要去数据库中进行count()查询。随着数据量越来越大,count()的成本肯定会越来越高。所以想通过程序计算总数写入数据库的一张新表。等到缓存失效之后,用这张表的数据进行兜底做被动缓存。由于目前的数据量在9800多万,如果一条一条的进行同步计算,耗费的时间比较长,所以就用异步的方式,同时去处理不同业务线的数据。采用for循环的方式一次从数据库中查出500条数据进行处理
2021-08-06 09:58:10
773
原创 项目中如何合理的使用线程池~
1、使用线程池的好处?1、降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。2、提高响应速度:当任务到达时,可以不需要等待线程创建就能立即执行。3、提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性。2、创建线程池的方式2.1 ExecutorsnewSingleThreadPoll() 创建一个只有一个线程的线程池。newFixedThreadPool(int numOfThreads)来创建固定线程数的线程池。newCache
2021-08-04 14:10:04
1487
原创 ~mysql 面试、复习知识点汇总~
1、存储引擎InnoDB支持事务安全的引擎,支持外键、行锁、事务是他的最大特点。如果有大量的update和insert,建议使用InnoDB,特别是针对多个并发和QPS较高的情况。MyISAM它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法。不支持事务,而且不支持外键,如果执行大量的select,insert MyISAM比较适合。InnoDB 和 MyISAM 的比较1、事务:
2021-08-03 11:01:57
462
2
原创 垃圾回收篇~~面试题集
1、大厂面试题蚂蚁金服你知道哪几种垃圾回收器,各自的优缺点,重点讲一下cms和G1?JVM GC算法有哪些,目前的JDK版本采用什么回收算法?G1回收器讲下回收过程GC是什么?为什么要有GC?GC的两种判定方法?CMS收集器与G1收集器的特点百度说一下GC算法,分代回收说下垃圾收集策略和算法天猫JVM GC原理,JVM怎么回收内存CMS特点,垃圾回收算法有哪些?各自的优缺点,他们共同的缺点是什么?滴滴Java的垃圾回收器都有哪些,说下g1的应用场景,平时你是如何搭配使用垃圾回收器的
2021-07-30 09:58:39
968
原创 垃圾回收篇~~垃圾回收器
1 GC分类与性能指标垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。1.1 垃圾收集器分类1.1.1 按线程数分按线程数分(垃圾回收线程数),可以分为串行垃圾回收器和并行垃圾回收器。串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。在诸如单CPU处理器或者较小的应用
2021-07-28 17:41:28
402
1
原创 垃圾回收篇~~垃圾回收算法
一、垃圾回收算法分类1、标记-清除算法最基础的算法,分为标记和清除两个阶段:首先标记出所有需要回收的对象,完成后统一回收掉所有被标记的对象。后续的算法都是基于此算法来改进的。主要有两个缺点:效率问题:标记和清除的过程效率都不高。空间问题:标记清除之后会产生大量不连续的内存碎片,这样可能会导致以后再运行过程中需要分配大对象时无法找到足够的连续内存而不得不触发新的一次垃圾回收。标记-清除算法图示-12、复制算法为了解决效率问题,复制算法出现了。将内存按容量划分为大小相等的两块,每次只使用其
2021-07-27 17:40:06
2521
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人