自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 手撕二叉树遍历之后序遍历

本文旨在描述如何用迭代的方式一步一步实现二叉树后序遍历的过程!我们先定义一个方法,参数为二叉树的根节点。方法内包含一个while循环。还需要一个变量记录当前访问的节点,第一个访问的节点是根节点while循环的条件是什么呢?答案是还有需要访问的节点,也就是说当前访问的节点不为空。先不考虑,我们如何得到每次循环需要访问的节点。后序遍历是先后序遍历左子树,所以我们可以在每次主循环的开始,循环判断当前节点的左节点是否为空,如果不为空,则访问当前节点的左节点。通过当前代码,我们最终会找到二叉树的最左节点。

2024-05-15 09:22:08 333

原创 手撕二叉树遍历之中序遍历

本文旨在描述如何用迭代的方式一步一步实现二叉树中序遍历的过程!我们先定义一个方法,参数为二叉树的根节点。方法内包含一个while循环。还需要一个变量记录当前访问的节点,第一个访问的节点是根节点while循环的条件是什么呢?答案是还有需要访问的节点,也就是说当前访问的节点不为空。先不考虑,我们如何得到每次循环需要访问的节点。中序遍历是先中序遍历左子树,所以我们可以在每次主循环的开始,循环判断当前节点的左节点是否为空,如果不为空,则访问当前节点的左节点。

2024-05-15 09:19:22 150

原创 手撕二叉树遍历之前序遍历

本文旨在描述如何用迭代的方式一步一步实现二叉树前序遍历的过程!我们先定义一个方法,参数为二叉树的根节点。方法内包含一个while循环。还需要一个变量记录当前访问的节点,第一个访问的节点是根节点while循环的条件是什么呢?答案是还有需要访问的节点,也就是说当前访问的节点不为空。先不考虑,我们如何得到每次循环需要访问的节点。前序遍历是先访问根节点,所以我们可以在每次循环的开始,直接打印当前节点的值,代表已经访问过该节点如果当前节点的左节点不为空,再访问当前节点的左节点。此时,当前节点的左节点变成当前节点。

2024-05-15 09:00:20 291

原创 dubbo RandomLoadBalance的一点优化

在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为基于权重的随机负载均衡策略。并且,默认权重相同。当权重相同和不同时,随机逻辑不同。这样就需要判断权重是否相同。

2024-03-19 13:34:44 700

原创 计算机科学领域的一些名言

1、premature optimization is the root of all evil. 过早优化是万恶之源2、If you were plowing a field, which would you rather use: two strong oxen or 1024 chickens? 如果你要耕一块地,你愿意用 2 头牛还是 1024 只鸡呢?3、Don’t Reinvent the Wheel. 不要重复制造轮子;4、Any problem in computer scie.

2023-06-07 11:03:01 227

原创 Spring动态代理选择逻辑代码是如何实现的

Spring的动态代理支持cglib和jdk两种代理模式。对于两种动态代理的选择我们通常会说,当一个类实现了接口,Spring会使用jdk代理模式,否则使用cglib的代理模式。因为jdk代理要求一个类必须实现接口,而cglib代理可以将目标类当做父类来实现代理逻辑。但Spring具体在代码层级上是如何实现选择逻辑的呢?我们来看一下,先看一个类public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {

2020-08-05 23:41:46 445

原创 梳理Spring获取Bean的流程

Spring获取Bean的方法在接口BeanFactory中定义public interface BeanFactory { Object getBean(String name) throws BeansException; <T> T getBean(String name, Class<T> requiredType) throws BeansException; Object getBean(String name, Object... args) thro

2020-08-03 18:34:00 574

原创 Replication副本在各平台上的使用

本文主要分析Replication副本在mysql,redis,zookeeper,kafka和mongoDB这些平台上的使用副本的优势1、水平扩展:提高性能,读写分离。kafka的副本只是用来备份和故障转移2、备份和故障转移副本的同步类型mysql:异步,半同步,延迟同步redis:异步(部分重同步,全量重同步)zookeeper:半同步(半数以上)kafka:半同步(ISR)mongoDB:异步复制格式mysql:binlog(基于语句或基于行),偏移量r

2020-08-02 12:21:00 189

原创 聊聊广告系统里的匀速投放

为什么要匀速投放?广告计划预算有限 匀速投放可以在一定程度上确保广告计划触及范围更广的人群如何实现匀速投放?按小时平均。根据日预算和投放时段算出小时预算:小时预算=日预算/投放时段匀速投放的问题?预算消耗不完。流量有高峰有低谷,如果某个时段的流量无法承载日预算就可能出现预算无法消耗掉的情况如何解决按剩余平均。我们修改计算小时预算的公式:小时预算=(日预算-已投放时段消耗)/未投放时段匀速投放中涉及的几个计算值日预算 投放时段 已投放时段消耗 小时预算 小时消耗代码实现

2020-07-31 20:38:33 651

原创 如何快速构造两个hashCode相同的字符串

这要从hashCode的源码说起,String类hashCode的代码如下所示 public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31

2020-07-30 15:30:40 2091 1

原创 如果NBA也像JAVA一样面试

面试官:先做个自我介绍吧!詹姆斯:我叫詹姆斯,03年以状元的身份进入联盟,已经在联盟中征战了17年。先后待过骑士,热火,湖人三家比较大的俱乐部,积累了丰富的实战经验。司职小前锋,对于小前锋位置上的各项技术都比较熟悉,像三分啊,助攻啊,低位背打啊,都有实际的比赛经历。对于现在流行的战术也有自己的理解,像三角进攻啊,炮轰啊,挡拆啊,都深入的研究过。有宝贵的季后赛和总决赛的经验,亲身体验过,尝试过解决在比赛中遇到的各种问题。个人方面的话,当过俱乐部老大,善于沟通,做决定,有一定的管理经验。就是这样。面试官

2020-07-30 15:15:15 180

原创 当一个男人编码的时候

场景1:调用方法还是定义局部变量风格1Object param = getSomeParameter();useParamFirstTime(param);...useParamSecondTime(param);风格2useParamFirstTime(getSomeParameter());...useParamSecondTime(getSomeParameter());场景2:传一个对象还是一个对象+一个属性风格1methodOne(Object obj)

2020-07-27 19:54:39 97

原创 剖析Spring AOP的全貌

版本说明:Spring Boot 2.2.8.RELEASE,Spring 5.2.7.RELEASE我们首先来看一下,我们如何实现自定义的切面逻辑第一步,引入aop依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency>

2020-07-19 14:44:51 72

原创 SpringBoot项目中默认动态代理是jdk proxy还是cglib

在SpringBoot项目中,当我们想使用Spring AOP的功能,我们首先要做的是引入aop的依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency>我们无需自定义aop相关的配置类,因为在autoconfigure包中已经

2020-07-18 23:49:14 3417 3

原创 @ImportSelector示例

如果你看Spring的源码,对@ImportSelector注解一定不陌生。原本想写一篇原理性的文章,但研究了一天发现还是不能完全理顺。于是,先尝试编写了一个示例,也不知道这样用正不正确……@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(TestImportSelector.class)public @interface TestImport { boolean test()

2020-07-12 20:30:25 677

原创 单接口统计每个用户请求数

下面的内容主要是个人的理解及对相应理解结果的验证。理解可能有误,验证示例涵盖范围可能不全面。有不同意见,欢迎讨论。什么是原子性?无奈,笔者并没有找到一个明确的、统一的定义,所以只能按照字面的意思进行理解和描述(非定义。笔者在此多说几句,有些事物,我们没办法明确去定义,所以通过归纳其现象描述其性质,以此来代替定义。比如时间的定义,我们没办法去定义什么是时间,但是我们可以说时间是不可逆转的来描述时间应该有的行为或性质)。原子性自然就是原子的性质,而原子的性质就是原子的不可分割性(这里笔者再多说几句,当我

2020-07-11 12:38:55 618

原创 LeetCode:接雨水上台阶解法

给定n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。感谢 Marcos 贡献此图。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/trapping-rain-water..

2020-07-09 23:16:33 220

原创 关于if else你不知道的事儿

先看一段伪代码if (condition) { do if logic;} else { do else logic;}if else大家一定经常写,也很容易说出if else的执行逻辑:如果条件为真,执行if逻辑;如果条件为假,执行else逻辑。换句话说,要么执行if分支,要么执行else分支。但是,你有没有想过,if和else分支的执行概率都是50%吗?答案当然是不是。看一个例子int i = 0, j = 0;for(int k=0;k<10000;k++)

2020-07-09 23:08:40 715

原创 记一次字节跳动面试的失败经历:算法题旋转数组

算法,是真心弱。我一直认为,做算法的或者说能轻松解答算法题的,一种人是脑子特别灵光。因为算法真的很烧脑;另一种就是刷题,要么能刷到全记住,要么能刷到孰能生巧。可惜,以上我都不是。因为很重视这次面试,所以从CSDN众多网友的博客上了解到字节跳动面试的一般流程,最后基本就是一道算法题。无奈,自己算法基础太差,所以就准备按照网友的面试经历刷几道题。但算法这种东西真的是日积月累的事儿,临时抱佛脚真心没啥用。面试安排在下午五点,我在五点之前也只看了三道题:快排、树的非递归前序遍历和反转链表。当时的心情,就跟买彩票

2020-07-08 18:57:14 2422

原创 BeanFactoryAware BeanPostProcessor InitializingBean

这三个接口,你在你的项目里大概都实现过,但你有了解过这三个接口的执行顺序吗?我们先看一下这三个接口的接口方法public interface BeanFactoryAware extends Aware { void setBeanFactory(BeanFactory beanFactory) throws BeansException;}public interface BeanPostProcessor { @Nullable default Object postProcess

2020-06-18 20:31:48 161

原创 ScheduledThreadPoolExecutor实现周期调度的过程

本文研究ScheduledThreadPoolExecutor调度任务的过程,先看下面这段代码ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);executorService.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println(System.c

2020-06-17 21:38:40 987

原创 Spring Boot 内置Tomcat启动流程

觉得无从下手?一步一步来。有些路,走不通了,就先放一放。去其它路上转转,可能一会儿回来又可以走通了。我们先走第一条路。Spring Boot应用启动是在main方法里调用SpringApplication的run方法,所以内置Tomcat启动流程一定在包含在其中。我们可以debug,但在我们不知道任何有用信息的情况下,尤其是Spring的调用链一般都很深,所以一步一步的debug非常难。这条路走不通,我们先走其他条路。如果你认真观察,你会发现Spring Boot应用启动日志里有这么几句,看下图

2020-06-15 21:09:24 494

原创 当我们说阻塞时,我们在讨论什么

1、进程阻塞还是线程阻塞?2、JAVA里的阻塞还是操作系统里的阻塞?3、阻塞是一种主动行为还是被动行为?如果是主动行为,通过系统调用实现还是阻塞原语实现?如果是被动行为,操作系统为什么要将调用方阻塞?4、有哪些可能引起阻塞的行为?哪些是主动行为,哪些是被动行为?5、非阻塞是实现IO多路复用的基础吗?6、阻塞可以分为可中断的阻塞和不可中断的阻塞吗?7、如果我们只讨论线程概念,不管它如何实现的。那么线程阻塞对我们的程序有什么影响?欢迎补充,欢迎讨论...

2020-06-14 19:29:59 296

原创 你是否也曾有过被c=a a=b b=c支配的恐惧

先看下面这段代码c = a;a = b;b = c;刚学编程那会儿,完全不知道这段代码到底在干嘛?!现在大家应该都能看懂这段代码的意义,就是实现了a和b值的互换,c作为一个过渡变量而存在。用人的思维去理解这段代码就是:第一步,将a的值给到c。此时c就等于是a的一个备份。因为a有了备份,就可以对a进行操作,所以有第二步,将b的值给到a。此时a的值已经是b。我们完成了互换的一半。因为b的值已经给到a了,所以我们可以对b进行操作,所以有第三步,将c的值给到b。因为c的值就是a,所以此时b的值就是a。

2020-06-13 22:41:02 891 1

原创 JAVA程序员应该知道的一些默认值

1、HashMap的默认容量为16,加载因子默认为0.75。2、ArrayList的默认容量为10,扩容后容量是原容量的1.5倍。3、Tomcat默认最大线程数为200。4、Mysql Innodb存储引擎页的大小为16KB。5、操作系统磁盘扇区的大小一般为512B~4KB。6、Integer类型默认缓存大小为-128~127欢迎补充...

2020-06-12 20:06:01 166

原创 HashMap容量是2的幂次方有什么用

一、将取模运算转成按位与运算HashMap需要计算散列位置,通常的做法是取模,即X % 2^n(X即为准备放入HashMap中的key)。取模运算的逻辑一般为两步,第一步求商,即c = a/b;第二步求余数,即r = a-c*b。这两步包含了除法,乘法和减法运算。有一种情况,当容量为2的幂次方时,可以将取模运算转成按位与运算。该转换满足这样的等式:X % 2^n= X & (2^n- 1)。计算机中,除法、乘法和减法都可以转换成加法运算,而加法运算可以通过与或非门实现。从而可以看出取模运算到..

2020-06-10 21:01:54 514

原创 FeignClient注解配置url属性实现指定服务方

某天,跟同学聊天,同学说起之前面试的时候面试官提的一个问题:使用spring cloud,现在某个服务有一个新的接口需要验证。该接口目前只上线了一台机器,如何指定调用方只调用这台机器。问题大致如此,可能有些出入。总结起来,就是希望能够指定访问某台机器。这样的情况,在我们平时也可能经常遇到。比如甲乙两人需要调试新接口,但注册中心只有一个。可能上面有丙丁戊己庚辛注册的服务。如果我们按照默认的轮询的负载均衡规则去调用,七次调用才能轮到乙的服务,根本没有办法调试。所以这时候就需要我们能够指定调用的服务方。Fei

2020-06-09 22:03:03 13389 1

原创 想知道为什么,看看代码就行了

小楚最近有件烦心事儿……小楚的女朋友况小姐前几天过生日。小楚一直记着,提前一周就备好了礼物。况小姐生日当天,小楚跟她一块吃了饭。吃完饭后,把礼物送给了她。当时还挺好的,可是这几天况小姐一直没理小楚,发微信不回,打电话不接。昨天终于回了条微信却是告诉小楚他们不适合。小楚很喜欢况小姐,不想就这么放弃。但自己也不知道做错了什么?是不是因为生日的事儿?明明自己也送礼物了啊,为什么况小姐还会分手呢?于是,小楚找到了自己的好朋友大高,向他咨询。大高听他说完,说了一句话,想知道为什么,看看代码就行了。于是领着小楚

2020-06-06 16:08:38 192 1

原创 springboot @Async 是如何把方法变成异步调用的

在springboot中,想把一个方法变成异步方法。首先需要加上EnableAsync注解,其次在你想要变成异步方法的方法上加上Async注解。当外部类调用该方法时,该方法将变成异步调用。但是具体的实现流程是怎样的呢?我们今天就来探究一下。我们首先加上了EnableAsync注解,这个注解做了什么呢?因为我们没有配置该注解的任何属性,所以属性全部取的默认值。重要的一个属性是AdviceMode也就是通知模式,默认值是PROXY。该配置表明使用动态代理的模式去拦截调用。知道了这一点,我们接着再看。该注

2020-06-06 16:07:25 785

原创 springboot 定时任务 坑 探究

在基于springboot创建的项目中,定义定时任务的操作很简单。首先,在启动类(加了注解SpringBootApplication,其实任意加了注解Configuration的类上都可以)上加注解EnableScheduling。该注解会通过SchedulingConfiguration引入ScheduledAnnotationBeanPostProcessor后置处理器,在bean初始化后对加了Scheduled注解的方法进行处理,使之可以有周期执行的能力。其次,就是在某个spring管理的bean的

2020-06-06 16:06:42 446

原创 蹲坑和锁升级为什么是一样的

上厕所真的是一个很平民的例子,适用于各个方面。废话不多说,说回本文的主题--蹲坑和锁升级为什么是一样的?先说锁升级的过程,简单来说就是从无锁到偏向锁到轻量级锁,最后到重量级锁。锁只能升级,不能降级。你现在一定很疑惑,这个跟蹲坑有毛线关系。别急,且看我慢慢道来。大家都知道北京的房租特别贵,所以合租成为了很多人的选择。小程,小前和小滴三人就合租了一间房子。到有个问题,这间房子只有一个卫生间。小程,小前和小滴三人男女有别,所以不能同时使用这个卫生间。三个人平时都是在自己的房间里,刷剧的刷剧,打

2020-06-06 16:03:14 210

原创 线程池里有什么

线程池里有什么?这个问题需要问吗?线程池里当然是线程啦!是,但是不准确。准确的说线程池里是工人,即Worker!Worker是什么?Worker是一个实现了Runnable的类。实现了Runnable就意味着这个类有run方法,并且可以被线程执行。执行Worker的线程从哪儿来?答案是从自身来。在创建一个Worker的时候会生成一个线程分配给它的thread属性。这就好比你去公司上班,公司...

2019-12-25 16:54:44 242

原创 公平锁公平在哪儿

主要在两方面一方面是针对不在队列里的线程。对于这一类线程在尝试获取锁时,会判断当前队列是否为空或者当前线程是否为头结点的后继节点。如果是,才尝试获取锁。另一方面是针对已入队里的线程。对于这一类线程在尝试获取锁时,会判断当前线程的前置节点是否为头结点。如果是,才尝试获取锁。...

2019-12-25 15:47:16 79

原创 RedisTemplate executePipelined 第二个参数

使用管道的方式存储数据时,会直接保存字节数组,不需要用到序列化的功能redisTemplate.executePipelined(new RedisCallback<Object>() { @Override public Object doInRedis(RedisConnection connection) { keys.forEach(key...

2019-12-25 11:42:22 3693

原创 spring data jpa将@ManyToOne查询从cross join变成left outer join

在多对一关系中,当多端的表作为主表,并且需要连接一端的表时,默认的连接方式为cross join。在某些业务场景下,查询的数据是不完整的。因为cross join会过滤掉关联字段为null的行数据。所以需要将连接方式从cross join变成其他方式,如left outer join。

2017-08-28 19:45:06 7382 4

原创 spring boot viewResolver

spring mvc允许注册多个viewResolver。spring mvc通过循环调用viewResolver解析View。View不为空则直接返回。相应代码在DispatcherServlet中protected View resolveViewName(String viewName, Map model, Locale locale, HttpServletRequest re

2017-08-04 16:38:17 3119

原创 @SessionAttributes 清除Session

spring提供注解@SessionAttributes将Model中的数据同步到HttpSession中。在清除Session中的数据时不能调用HttpSession中的removeAttribute("attributeName")方法,需要调用接口SessionStatus中的setComplete方法。接口SessionStatus的唯一实现是类SimpleSessionStatus,调用

2017-07-27 12:53:32 3029

原创 随便写写

1、jquery的ajax方法当设置dataType是json时,要求返回值必须是严格的json格式(json的键必须以双引号包住),否则只会走error,不会走success。并且当用springmvc做后台,使用@ResponseBody返回String时,StringHttpMessageConvert转换返回值的时候并没有使用双引号包住。你可以调用json框架的方法或者手动将String用

2017-03-23 14:54:38 179

原创 jQuery fileupload 一次上传多个文件

当使用jQuery fileupload上传文件时,设置type=“file”的input的multiple="multiple"属性,可以选择多个文件。但默认上传方式是采用循环提交的方式,一次上传一个文件。如果我们希望多个文件一次性上传,需要修改singleFileUpload为false。

2015-10-26 18:41:20 7418 1

原创 从一到万

代码从一行开始。

2013-04-10 14:27:23 548 1

空空如也

空空如也

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

TA关注的人

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