自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Yasin的博客

后端开发和编程

  • 博客(47)
  • 收藏
  • 关注

原创 K8S 1.22集群 NOT READY的解决办法 错误信息:cni config uninitialized

错误现象:untime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized解决办法:手动添加 flannel 镜像和 cni 配置docker pull quay.io/coreos/flannel:v0.11.0-amd64mkdir -p /etc/cni/net.d/

2021-10-22 17:39:12 979

原创 解决 kubernetes 部署镜像拉取问题

通过以下命令先拉取镜像核心:将镜像仓库地址k8s.gcr.io改成registry.aliyuncs.com/google_containerskubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers

2021-10-22 16:21:02 1194

原创 Spring JDBC 源码解析 —— save / update 的实现

基本思路分析Spring JDBC 对数据库的操作大部分都通过 jdbcTemplete 实现,这也是我们分析 Spring JDBC 的切入点。一个简单的 update 函数的调用例程如下:public void save(User user) { jdbcTemplate.update("insert into user(name, age, sex) values(?, ?, ?)", new Object[] {user.getName(), user.getAge(), user.ge

2021-01-23 20:21:25 797

原创 Sping AOP 源码解析(二、创建 AOP 代理——创建代理)

之前说明了创建 AOP 代理的第一步:获取增强器,下面我们要基于获取的增强器创建对应的代理。创建代理在获取了增强器之后,就可以创建代理了。protected Object createProxy(Class<?> beanClass, @Nullable String beanName, @Nullable Object[] specificInterceptors, TargetSource targetSource) { if (this.beanFactory ins

2021-01-06 23:42:52 141

原创 Sping AOP 源码解析(二、创建 AOP 代理——获取增强器)

基本思路分析AspectJAwareAdvisorAutoProxyCreator 实现了 BeanPostProcessor 接口,可以在其父类 AbstractAutoProxyCreator 中找到 postProcessAfterInitialization 方法。public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) { if (bean != null) { // 根据给点

2021-01-05 18:57:53 269

原创 Sping AOP 源码解析(一、动态 AOP 自定义标签 aop:aspectj-autoproxy)

XML 中 AOP 标签的使用<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLoc

2020-12-29 22:05:29 293

原创 ApplicationContext —— 功能扩展的容器加载(一、ApplicationContext 概述)

在 Spring 中,有两种方式加载配置文件:1、使用 BeanFactory 方式加载 XML;2、使用 ApplicationContext 加载 XML。第一种方式已经在之前的文章分析了,并深入了解了其内部机制。现在我们聊聊第二种方式,也是我们最为常用的一种方式 —— ApplicationContext。下面是 ApplicationContext 的启动部分。public ClassPathXmlApplicationContext(String configLocation) throws B

2020-12-23 20:48:45 155

原创 Spring容器 —— 深入 bean 的加载(五、初始化 bean)

上篇分析了 bean 中属性注入的方式,在注入了属性之后,就需要初始化 bean 了,这部分工作完成了 bean 配置中 init-methos 属性指定方法的内容,由 initializeBean 函数完成。初始化流程protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) { if (System.getSecurityManager() != null) {

2020-12-17 22:53:41 214

原创 Spring容器 —— 深入 bean 的加载(四、属性注入)

在完成 bean 的初始实例化之后,我们获得了一个空的 bean 或者说是 bean 的 reference。这种分离式创建也是为了解决循环依赖。现在我们就看看接下来的属性注入部分。源码分析属性注入是由 populateBean 函数完成的。protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) { if (bw == null) { if (mbd.hasPro

2020-12-17 22:17:20 168

原创 Spring容器 —— 深入 bean 的加载(三、创建 bean 实例 —— createBeanInstance)

之前分析了 bean 创建的基本思路,现在我们看看第一步,如何获取一个初步的 bean 框架 BeanWrapper。createBeanInstance 源码概述protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) { // 解析 class // Make sure bean class is actually resolved at

2020-11-28 22:36:11 226

原创 Spring容器 —— 深入 bean 的加载(二、bean 创建基本思路分析)

本文解析了 Spring 的通常创建方法,即 doCreateBean()。

2020-11-28 17:46:14 155

原创 Spring容器 —— 深入 bean 的加载(一、加载前的准备工作)

之前谈了有关[bean 加载的大致过程](bean 的加载过程概述)。现在要仔细研究一下其中使用到的各个部分的内部原理。FactoryBean通常来说,Spring 通过反射机制利用 bean 的 class 属性实现类的加载实例化 bean。但在某些情况下,bean 的实例化比较复杂,需要更为灵活的配置方式,通过自定义编码会更好一些,FactoryBean 就是这样一个工厂类接口,用户可以通过实现 org.springframework.beans.factory.FactoryBean 接口定制实例

2020-11-17 18:53:06 584

原创 Spring 容器 —— bean 的加载过程概述

源码protected <T> T doGetBean( String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly) throws BeansException { // 1、转换对应的 beanName String beanName = transformedBeanName(name); Object bean; //

2020-11-15 22:37:35 451

原创 Spring容器基础 —— bean xml 配置文件标签的解析和注册

解析 Bean 标签的基本步骤protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) { // step 1 BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele); if (bdHolder != null) { // step 2 bdHolder = delegate

2020-11-11 18:19:57 336

原创 Spring容器基础 —— BeanFactory 加载 Bean

本文对 Bean 容器的加载过程进行分析。首先我们看一个简单的例子。// MyTestBean.javapublic class MyTestBean { private String testStr = "testStr"; public String getTestStr() { return testStr; } public void setTestStr(String testStr) { this.testStr = testStr; }}// BeanFacto

2020-11-11 00:23:23 269

原创 DevStack(rocky版)安装问题记录

问题1报错:pip not found in /opt/stack/.vnc/bin/解决办法:cd /opt/stack/.vnc/bin/sudo ln -sf /usr/local/bin/pip pip问题2报错:/opt/stack/devstack/inc/python: line 540: /opt/stack/requirements/.venv/bin/edit-constraints: No such file or directory解决方法:edit-c

2020-05-31 19:01:05 595

原创 进程同步经典问题(生产者-消费者、读写、哲学家)

目录读写问题要求基本思路代码哲学家问题要求基本思路代码读写问题要求读写,写写不能同时发生;读读之间可以同时发生。基本思路引入资源锁,当首次读出现时,加资源锁,当读全部结束时,解资源锁;引入读数量,确定什么时候加(解)资源锁,对于读数量的改变也要在临界区中进行。写数据直接,获取资源锁 -> 写操作 -> 释放资源锁。代码#define int semaphor...

2020-04-05 16:46:49 370

原创 【剑指offer】不用加减乘除做加法(Java解答)

题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。基本思路四则运算不能使用,那么就只能回归更本质的做:二进制运算。在分析二进制的运算前,我们先分析一下十进制的运算。例如,5+17=22,可以分三步进行,第一步只做加法,不进位,即5+17->12;第二步,做进位,5+7有一个进位,是10;第三步,将前两步的结果做一次加法,可得22,此时已经没有进位,...

2020-03-18 13:30:03 124

原创 【剑指offer】左旋转字符串(Java解答)

题目描述对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。基本思路首先定义“翻转字符串”为整个字符串从后往前读取。例如,“abcdef”翻转后为“fedcba”。对于字符串有特性:翻转两次之后,回到原顺序。利用这一特性,我们首先将字符串分为两部分:要放在后面的“abc”为第一部分...

2020-03-09 22:17:58 101

原创 【剑指offer】和为S的连续正数序列(Java解答)

题目描述输入一个正数 s,打印出所有和为 s 的连续正数序列(至少含有两个数)。基本思路由于是连续数字序列,那么我们只需要知道序列的头和为就知道序列中所有的数字。基于这一点,考虑用 start 和 end 表示序列的头和尾。此时通过以下方式移动两个指针:将 start 初始化为1,end 初始化为 2,curSum 初始化为3;当 curSum 小于 s 时,end 向前移动一位,然后...

2020-03-06 12:56:55 136

原创 【剑指offer】数组中只出现一次的数字(Java解答)

题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。基本思路首先我们考虑数组中只有一个出现一次的数字,其他的都出现两次,那么可以通过异或的方法,异或全数组结果就是那个只出现一次的数。现在数组中有两个只出现一次的数,自然就想到把数组分为两个部分,分别有一个数字就可以用上面的方法了。考虑异或全数组出现两次的数都已经被抵消了,剩下的两个数不一样,...

2020-03-01 15:48:05 143

原创 【剑指offer】平衡二叉树(Java解答)

题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。基本思路通常来说,我们会想到从根节点开始向下,获取左右子树的深度(获取方法)进行比较。但这样做会重复计算底层节点,造成时间上的浪费。既然从上往下不行,那么就可以选择从下往上的递归方法,把深度信息交给底层计算,返回到上面来。在获取了深度信息之后,再比较左右子树深度的大小。该过程类似于后序遍历。具体解答过程如下:public boole...

2020-03-01 13:39:35 97

原创 【剑指offer】二叉树的深度(Java解答)

题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。基本思路基于后序遍历的方法,分别获取左右子树的深度,在回到父节点,从两个深度中选择大的一个加一返回。具体解法如下:public int TreeDepth(TreeNode root) { if (root == null) { retu...

2020-02-29 13:08:54 186

原创 【剑指offer】数字在排序数组中出现的次数(Java解答)

题目描述统计一个数字k在排序数组中出现的次数。基本思路由于是已排序的数组,所以可以通过二分法寻找到 k。而所有的 k 都是聚集在一起的,那么找到一个 k 就可以分别向左和向右搜索,就可以获取到 k 的范围了。以下为具体解答:public int GetNumberOfK(int [] array , int k) { int index = binarySearch(array,...

2020-02-29 12:53:41 127

原创 【剑指offer】第一个只出现一次的字符(Java解答)

题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).基本思路为了确定每个字符出现的次数和位置,我们是肯定需要遍历一次字符串的。现在的问题就是如何实现快速更新次数和位置数据。可以想到用HashMap的方式来保存数据,这样我们就可以在 O(1) 时间内更新了。由于全部是由字母...

2020-02-26 12:08:16 106

原创 【剑指offer】丑数(Java解答)

题目描述把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。例如 6、8 都是丑数,但 14 不是,因为它包含质因子 7。 习惯上我们把 1 当做是第一个丑数。求按从小到大的顺序的第 N 个丑数。基本思路所谓只有质因子 2、3、5,就是说所有的数都是由 2、3、5 乘出来的。那么我们可以通过空间换时间的方法,建立一个数组,把之前的数存下来,然后分别乘上 2、3、5 取最小...

2020-02-26 11:45:07 158

原创 【剑指offer】从1到n整数中1出现的次数(Java解答)

题目描述输入一个整数n,求1 ~ n这n个整数的十进制表示中1出现的次数。例如,输入12, 1~12这些整数中包含1的数字有1、10、11和12, 1一共出现了5次分析想要找到解答方法,必须先找到规律,不妨以21345为例进行分析。首先,把21345分为两段,1 ~ 1345和1345 ~ 21345。对于第二部分1345 ~ 21345,1 出现的次数的分析分为两种情况。首先分...

2020-02-25 14:49:54 178

原创 【剑指offer】连续子数组的最大和(Java解答,两种解释方案,一种解答过程)

题目描述输入一个整型数组,数组里有正数也有负数。数组中的一个或者连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。解法1:分析数组规律以数组{1, -2, 3, 10, -4, 7, 2, -5}为例,分析过程如下表。步骤操作累加子数组和最大的子数组和1加1112加-2-113抛弃-1,加3334加...

2020-02-24 13:52:53 114

原创 【剑指offer】最小的K个数(Java解答,O(n)和O(nlogk)两种解答)

题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。O(n)算法,需要修改输入的数组基本思路通过随机快排算法,将数组随机分为两个部分,若分割点在第 k 个数的左边,则继续随机分割比分割点大的部分,反之,随机分割较小的那部分。循环以上步骤,直至分割点就是第k个数。具体解答如下:public ArrayList&l...

2020-02-24 12:17:21 246

原创 【剑指offer】数组中出现次数超过一半的数字(Java解答)

题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。一般解法 —— 以空间换时间基本思想通过HashMap存储每一个数组值出现的次数,直到找到超过一半的数字。具体解法如下:public int MoreThanHalfNu...

2020-02-22 17:23:41 150

原创 【剑指offer】字符串的排列(Java解答)

题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。基本思路按照排列组合的思想,所有的字符串的种类为Ann=n∗n−1∗...∗2∗1,其中n为字符串的长度A^n_n = n*n-1*...*2*1, 其中n为字符串的长度 Ann​=n∗n−1∗...∗2∗1,...

2020-02-22 16:22:00 176

原创 【剑指offer】二叉搜索树与双向链表(Java解答)

题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。基本思路二叉搜索树的左右子树指针类似于双向链表的前后指针,而左子树就是都小于根节点,右子树都大于根节点。因此核心点就是找到子树转换后链表的最后一个节点然后与根节点进行对接。基本步骤为:处理左子树,获取左子树中链表的最后一个节点lastNode;将lastNode连...

2020-02-21 13:12:11 123

原创 【剑指offer】二叉树中和为某一值的路径(Java解答)

题目描述输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。基本思路通过遍历树的方式找到对应的路径,由于要先加入根节点,所以选用前序遍历。通过一个 stack 保存当前访问的路径,每次访问便压入栈中,访问结束(回到父节点)便将自己(栈顶)弹出。注意每次保存当前路径需要保存一个副本,否则会在运行...

2020-02-20 15:22:10 77

原创 【剑指offer】二叉搜索树的后序遍历序列(Java解答)

题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。基本思路题干中有两个关键信息:二叉搜索树和后序遍历。二叉搜索树表示序列可以根据根节点的值分为两个部分:大于根节点和小于根节点。后序遍历表示序列的最后一个为根节点。结合上述两点即可判断序列是否是合法的。基本步骤为:根据根节点,将序列分出...

2020-02-20 13:16:31 129

原创 【剑指offer】从上往下打印二叉树(Java解答)

题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。基本思路本题考查了对数据结构的熟悉程度。通过队列我们可以很方便地实现本题。具体操作:如果对列不为空,则获取并打印队列头,然后将队列头的左右非空子节点放入队列。重复该操作即可。以下为具体解答:public ArrayList<Integer> PrintFromTopToBottom(TreeNode roo...

2020-02-19 13:20:20 82

原创 【剑指offer】栈的压入、弹出序列(Java解答)

题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)基本思路首先按照压入顺序把数字压入栈中,同时比较弹出序列。如果下一个弹出的数字为...

2020-02-19 12:56:59 79

原创 【剑指offer】包含min函数的栈(Java解答,单栈和双栈解法)

题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。分析本题的时间复杂度已经确定,那么算法优化就只能从空间复杂度下手,一般来说采用辅助栈保存当前最小值是一个通用解法,这样就需要两个栈。同样我们可以改变栈中保存值,来实现单栈解法。辅助栈解法思路很简单,采用一个数据栈保存数据,一个辅助栈保存当前状态下的最小值。步骤操作数...

2020-02-18 15:41:43 167

原创 【剑指offer】顺时针打印矩阵(Java解答)

题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.解答0思路对于这种一下看不出解答的复杂问题,但却是某种具体过程,可以通过图形来帮助思考。首先我们定义一个坐标系,...

2020-02-18 15:08:08 177

原创 【剑指offer】二叉树的镜像(Java的递归和循环解法)

题目描述操作给定的二叉树,将其变换为源二叉树的镜像。核心本题的核心点就是想办法遍历所有的节点,同时反转各个节点的左右子节点。递归解法基本思路通过递归到达叶节点,然后从下往上将每个节点的左右子节点互换。递归解法代码简洁,是通常给出的解法。但递归解法会消耗更多的堆栈,因此在此也给出了对应的循环解法。以下为解答:public void Mirror(TreeNode root) {...

2020-02-17 12:41:49 118

原创 【剑指offer】数的子结构(Java解答)

题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)基本思路1、在A中查找与B树根节点值相同的节点M。若相同,则判断以M节点为根的树与B树是否相同。若相同,则递归返回true;若不相同,则继续判断M节点左右子树中是否有相同的根节点。若不相同,则继续在左右子树中递归寻找。2、判断树是否相同的方法:通过递归法,子树相同,根节点相同,则树相同。以下为...

2020-02-17 12:10:47 127

空空如也

空空如也

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

TA关注的人

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