自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Blocking The Sky

prinf("hello

  • 博客(131)
  • 资源 (2)
  • 收藏
  • 关注

原创 Spring相关面试题汇总

什么是AOP?AOP是面向切面编程,在spring中用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合,一般比如可以做为公共日志保存,事务处理等。你怎么应用的?我们当时在后台系统中,就是使用aop来记录了系统的操作日志。主要思路是这样的,使用aop中的环绕通知+切点表达式,这个表达式就是要找到要记录日志的方法,然后通过环绕通知的参数获取请求方法的参数,比如类信息、方法信息、注解、请求方式等,获取到这些参数以后,保存到数据库。AOP的底层原理?

2024-08-17 18:40:08 1060

原创 Springboot如何实现跨域?

当域名,端口,协议三者存在任意一项不同时就需要解决跨域问题创建一个类实现 javax.servlet.Filter 接口,并在 doFilter 方法中设置响应头以实现跨域。@WebFilter@Override// ...注意:使用 Filter 实现跨域时,Filter 会拦截所有请求,而不仅仅是跨域请求。因此,在设置响应头时需要谨慎,避免影响其他请求的正常处理。如果需要更细粒度的控制,可以考虑使用 @CrossOrigin 注解或拦截器来实现。

2024-08-17 17:45:36 546

原创 三个线程如何交替打印ABC循环100次

每个线程在打印字母之后,需要调用下一个Condition对象的signal方法,唤醒下一个线程。ReentrantLock可以创建多个Condition对象,每个Condition对象可以绑定一个或多个线程,实现对不同线程的精确控制。Semaphore可以创建多个信号量对象,每个信号量对象可以绑定一个或多个线程,实现对不同线程的精确控制。这是一个典型的多线程同步的问题,需要保证每个线程在打印字母之前,能够判断是否轮到自己执行,以及在打印字母之后,能够通知下一个线程执行。

2024-08-15 18:24:34 827

原创 有T1、T2、T3 三个线程,如何保证它们按顺序执行

CompletableFuture.runAsync()方法用于异步执行新的线程,thenRun()方法用于在当前任务正常完成后执行给定的动作。join()方法用于等待所有任务完成。这样就可以保证t1、t2、t3线程的顺序执行。t2线程使用了t1.join(),表示只有t1线程执行完毕以后,再执行该t2线程,t3线程同理。这样就实现了t1在t2之前,t2在t3之前执行的顺序执行。

2024-08-15 17:44:16 419

原创 计算机网络面试题汇总

数字证书是指在互联网通讯中标志通讯各方身份信息的一个数字认证,人们可以在网上用它来识别对方的身份。它的出现,是为了避免身份被篡改冒充的。比如Https的数字证书,就是为了避免公钥被中间人冒充篡改。数字证书构成公钥和个人等信息,经过Hash摘要算法加密,形成消息摘要;将消息摘要拿到拥有公信力的认证中心(CA),用它的私钥对消息摘要加密,形成数字签名。公钥和个人信息、数字签名共同构成数字证书。

2024-08-14 21:17:33 1119

原创 JVM 面试题汇总

字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。注意:程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。

2024-08-14 01:55:20 871

原创 Java并发面试题汇总

进程:进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。线程:线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

2024-08-13 19:31:52 1229

原创 RPC Dubbo面试题汇总

Dubbo是一款高性能、轻量级的开源 WEB 和 RPC 框架。优点:高性能: Dubbo 在设计上注重性能,采用了简单的远程调用方式和高效的序列化机制。服务治理: 提供了丰富的服务治理功能,包括负载均衡、容错机制(如熔断、降级)、服务路由等,适合复杂的分布式场景。支持多协议: Dubbo 支持多种通信协议,如 Dubbo 协议、HTTP、RMI 等,能够灵活适配不同的应用需求。对中小型公司友好: 简单易用,适合中小型公司快速构建微服务架构。

2024-08-09 21:36:42 831

原创 策略模式 + 抽象工厂实现多方式登录验证

这里之所以给type和BeanName建立关系,是因为项目是Spring项目,如果不是,那我也可以给type和策略类的全类名建立映射关系存入Map,以后获取策略类对象,可通过反射,一样可以实现。每种登录就是实现登录这个目的的一种策略,因此先想到的应该是策略模式,所有具体策略类所需要实现的接口就是抽象策略类的login方法。这样写,以后再增加新的登录方式,工厂类还得改,为了解耦,使用配置文件,不同的登录方式的type,对应一个登录方式的具体策略类。如此,繁琐的IF-else且不符合开闭原则。

2024-08-09 19:39:40 843

原创 设计模式面试题汇总

设计模式是解决软件开发某些特定问题而提出的一些解决方案,也可以理解为解决问题的一些固定思路。通过设计模式可以帮助我们增强代码的可复用性、可扩展性、灵活性。我们使用设计模式的最终目的是实现代码的高内聚、低耦合。

2024-08-09 19:09:04 983

原创 RabbitMQ面试题汇总

RabbitMQ 是一个开源的消息代理和队列服务器,用于通过异步消息传递方式在分布式系统或服务之间进行通信。RabbitMQ 实现了高级消息队列协议(AMQP),同时也支持其他消息协议,如 MQTT 和 STOMP。它由 Erlang 语言编写,因此继承了 Erlang 所具有的高并发、高可用和容错特性。RabbitMQ 的基本架构生产者是发送消息的应用程序。它创建消息,并可以将消息发送到交换器。消费者是接收消息的应用程序。它从队列中提取消息并进行处理。

2024-08-09 04:18:07 1339

原创 库存超卖问题解决方式

库存超卖是指多个请求同时减少库存时,库存数量变为负数的情况。例如,某商品库存数量为10,同时有两个请求减少库存数量,假设两个请求同时查询库存数量为1,然后各自减少库存数量,最后库存数量变为-1,这就是超卖问题。悲观锁:认为线程安全问题一定会发生,因此在操作数据之前先获取锁,确保线程串行执行。例如Synchronized、Lock都属于悲观锁。优点:简单粗暴缺点:性能一般乐观锁:认为线程安全问题不一定会发生,因此不加锁,只是在更新数据时去判断有没有其它线程对数据做了修改。

2024-07-31 18:13:16 720

原创 单机登录升级为分布式 Session 登录

服务端收到请求时校验 Cookie 中的 Session / JSESSIONID,在服务端(Tomcat)中查找 Cookie 信息。案例分析:为什么用户在服务器 A 登录后,向服务器 B 发送请求,B 不认识该用户?服务端验证登录用户信息,校验通过设置 Cookie 响应给前端。后续用户每次发送请求都会携带 Cookie。在 8081 尝试不登录直接获取用户信息。在 8080 登录后获取用户信息。需要高频判断用户登录态。Redis 读写性能高。需要高频读取用户信息。

2024-07-23 22:38:56 806

原创 ubuntu给用户增加sudo权限并设置sudo免密

添加链接描述

2024-01-25 14:50:05 514 1

原创 Docker自定义镜像

Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。Dockerfile的第一行必须是FROM,从一个基础镜像来构建。更新详细语法说明,请参考官网文档:案例1:基于Ubuntu镜像构建一个新镜像,运行一个java项目步骤1:新建一个空文件夹docker-demo步骤2:拷贝docker-demo.jar文件到docker-demo这个目录。

2023-09-22 11:12:00 581

原创 Docker基本操作和相关命令

需求说明:上个案例中,我们进入nginx容器内部,已经知道nginx的html目录所在位置/usr/share/nginx/html ,我们需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。步骤二:进入nginx的HTML所在目录 /usr/share/nginx/html。步骤三:修改index.html的内容,这里用不了vi命令,容器中没有。我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器目录。将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全。

2023-09-22 10:44:47 402 1

原创 Docker的相关知识介绍以及mac环境的安装

依赖关系复杂,容易出现兼容性问题开发、测试、生产环境有差异Docker就是来解决这些问题的。Docker是一个快速交付应用、运行应用的技术:可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统。运行时利用沙箱机制形成隔离容器,各个应用互不干扰启动、移除都可以通过一行命令完成,方便快捷。Docker如何解决依赖的兼容问题的?将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包将每个应用放到一个隔离容器去运行,避免互相干扰。

2023-09-22 00:25:52 2882

原创 统一网关Gateway

对用户请求做身份认证、权限校验将用户请求路由到微服务,并对微服务的不同实例实现负载均衡对用户请求做限流gatewayzuulZuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。

2023-09-21 11:19:52 434

原创 http客户端Feign使用

Feign是Spring Cloud提供的声明式的HTTP客户端, 它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可。其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。Spring Cloud集成Feign并对其进行了增强,使Feign支持了Spring MVC注解;Feign默认集成了Ribbon,所以Fegin默认就实现了负载均衡的效果。引入依赖添加@EnableFeignClients注解编写FeignClient接口(客户端)

2023-09-18 16:52:40 158

原创 Nacos配置管理

Nacos能够同时实现注册中心以及配置管理服务。1、在Nacos中添加配置信息:2、在弹出表单中填写配置信息:DateID : 服务名称 - profile.后缀名profile就是指当前运行环境,如dev, test。3、点击发布就添加成功一个配置。4、配置获取的步骤如下:bootstrap.yml 的优先级比application.yml更高,项目启动会先读取bootstrap.yml。5、引入Nacos的配置管理客户端依赖:6、在user-service服务的resourc

2023-09-18 12:09:38 3144

原创 Nacos与Eureka的异同

Nacos可以通过spring-cloud-starter-alibaba-nacos-discovery集成到Spring Cloud应用中,但需要额外引入spring-cloud-starter-alibaba-nacos-config来配置Nacos地址等信息,配置较为繁琐。Nacos采用高可用的P2P设计(无主节点),所有的server节点都是同等作用,支持AP和CP两种模式。总之,Nacos在架构设计、功能特性和Spring Cloud集成方面都超越了Eureka,适用于更大规模的服务治理场景。

2023-09-18 00:41:16 547

原创 Nacos安装和入门

Nacos是一个更易于构建云原生应用的和平台。

2023-09-18 00:37:57 498

原创 黑马点评给店铺类型查询业务添加缓存(List实现)

【代码】黑马点评给店铺类型查询业务添加缓存(List实现)

2023-06-28 00:45:58 265 1

原创 黑马点评给店铺类型查询业务添加缓存(String实现)

【代码】黑马点评给店铺类型查询业务添加缓存(String实现)

2023-06-28 00:11:39 216

原创 黑马点评短信登录功能

流程图如下:1、实现2、在3、前端验证码获取成功。

2023-06-18 19:54:48 447

原创 排序算法汇总

一、插入排序1、直接插入排序时间复杂度:O(n^2),稳定代码:void direct_insert_sort(vector<int>& nums){ int i,j; for(i=1;i<nums.size();i++){ int temp=nums[i]; for(j=i-1;j>=0&&nums[j]>temp;j--){//将前面比他大的元素后移一位

2021-09-25 23:09:06 47

原创 剑指 Offer II 113. 课程顺序

现在总共有 numCourses 门课需要选,记为 0 到 numCourses-1。给定一个数组 prerequisites ,它的每一个元素 prerequisites[i] 表示两门课程之间的先修顺序。 例如 prerequisites[i] = [ai, bi] 表示想要学习课程 ai ,需要先完成课程 bi 。请根据给出的总课程数 numCourses 和表示先修顺序的 prerequisites 得出一个可行的修课序列。可能会有多个正确的顺序,只要任意返回一种就可以了。如果不可能完成所有

2021-09-24 22:15:41 125

原创 LeetCode 1361. 验证二叉树

二叉树上有 n 个节点,按从 0 到 n - 1 编号,其中节点 i 的两个子节点分别是 leftChild[i] 和 rightChild[i]。只有 所有 节点能够形成且 只 形成 一颗 有效的二叉树时,返回 true;否则返回 false。如果节点 i 没有左子节点,那么 leftChild[i] 就等于 -1。右子节点也符合该规则。注意:节点没有值,本问题中仅仅使用节点编号。示例 1:输入:n = 4, leftChild = [1,-1,3,-1], rightChild = [2,-

2021-09-24 20:55:07 182

原创 LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。二分查找class Solution {public: int binary_search_begin(vector<int>& nums, int target){//找到第一个位置 int mid; int low=0; int high=nums

2021-09-23 00:22:27 90

原创 LeetCode 310. 最小高度树

class Solution {public: vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) { vector<int> minvex; if(n==1){ return {0}; } else if(n==2){ return {0,1};

2021-09-22 21:45:05 74

原创 LeetCode 133. 克隆图

给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。深度优先搜索class Solution {public: unordered_map<Node*,Node*> visited; //记录原节点对应的新图中的克隆节点 Node* cloneGraph(Node* node) //递归一定要弄清楚函数的返回值是什么,这儿返回值是node节点对应的克隆图中的节点

2021-09-22 19:06:36 139

原创 LeetCode 743. 网络延迟时间

有 n 个网络节点,标记为 1 到 n。给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] = (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1 。迪杰斯特拉算法class Solution {public: int networkDelayTime(vector<vector<

2021-09-22 13:39:22 191

原创 LeetCode 547. 省份数量

有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。返回矩阵中 省份 的数量。深度优先搜索class Solution

2021-09-22 12:48:57 86

原创 判断是否是平衡二叉树

class Solution {public: int height(TreeNode* root){//求当前结点高度 if(root==NULL){ return 0; } else return max(height(root->left),height(root->right))+1; } bool isBalanced(TreeNode* root) {

2021-09-20 23:53:13 72

原创 输出有向无环图的所有路径

class Solution {public: void findpath(vector<vector<int>>& graph,int start,int end,vector<int>& path,vector<vector<int>>& allpath){ path.push_back(start); if(start==end){ allpath.pu

2021-09-20 22:25:00 700

原创 输出从顶点Vi到Vj的所有简单路径

class Solution {public: bool visited[20]; void init(){ for(int i=0;i<20;i++) visited[i]=false; } int firstarc(vector<vector<int>>& graph,int v){//返回v相邻的第一个结点 int p=-1; if(graph[v].size

2021-09-20 21:59:23 1507

原创 LeetCode 797. 所有可能的路径

给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)二维数组的第 i 个数组中的单元都表示有向图中 i 号节点所能到达的下一些节点,空就是没有下一个结点了。译者注:有向图是有方向的,即规定了 a→b 你就不能从 b→a 。class Solution {public: bool visited[20]; void init(){ for(int i=0;i<20;i++)

2021-09-20 21:58:19 125

原创 LeetCode 617. 合并二叉树

class Solution {public: TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) { if(root1==NULL&&root2==NULL) return NULL; else if(root1==NULL) return root2; else if(root2==NULL) retu

2021-09-19 22:05:30 65

原创 LeetCode 103. 二叉树的锯齿形层序遍历

给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。class Solution {public: vector<vector<int>> zigzagLevelOrder(TreeNode* root) { vector<vector<int>> result; queue<TreeNode*> q; stack<

2021-09-19 21:06:48 69

原创 二叉树自下往上层次遍历

给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其自底向上的层序遍历为:[ [15,7], [9,20], [3]]/** * Definition for a binary tree node. * struct TreeNode { * int val;

2021-09-19 20:55:23 465

操作系统.pdf

操作系统.pdf

2021-04-29

samar天气.zip

超级精美的天气微信小程序+源码,

2020-07-14

空空如也

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

TA关注的人

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