
源码原理
文章平均质量分 90
明明如月学长
阿里巴巴 资深 Java 研发工程师。《系统掌握大语言模型提示词 - 从理论到实践》小册作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者、《性能优化方法论》技术电子书作者。热爱技术,喜欢思考,乐于分享。
展开
-
为什么 JUnit4 要求 @Test 注解的测试方法必须为 public ?
在使用 JUnit4 进行单元测试时,我们常常需要为待测方法编写对应的测试方法,并使用@Test注解进行标注。然而,在实际使用中,有时我们可能会忘记将测试方法设置为 public,从而导致测试失败。那么,为什么 JUnit4 要求@Test注解方法必须为 public 呢?原创 2023-05-02 08:00:00 · 1392 阅读 · 1 评论 -
我用 ChatGPT 学设计模式之访问者模式
大家在日常开发中见到某种设计模式的影子时,可以去源码中学习该功能是如何使用该设计模式来实现的。主动重温该设计模式的适用场景,该设计模式的优点和缺点。这样才能够对该设计模式理解更加深刻,才更容易在未来遇到相关场景时想到该设计模式并加以致用。欢迎加入我的知识星球,知识星球ID:15165241 一起交流学习。申请时标注来自优快云。欢迎加入我们的 slack 工作区,在里面可以对ai 和我进行提问。原创 2023-04-23 07:30:00 · 622 阅读 · 0 评论 -
同学你根本不懂 Builder 设计模式!
日常开发中有些同学喜欢用@Builder,我们在使用的时候不仅要享受它链式编程的好处,还要特别注意它的副作用。Builder 设计模式的好处不仅是链式编程,更重要的是,可以通过 Builder 模式的构造方法来控制必传参数,还可以在设置参数方法或者在build方法中进行必传参数和参数合法性校验等。当参数较少时,直接使用构造方法可能比 Builder 模式更简洁。原创 2023-03-28 09:19:09 · 1255 阅读 · 2 评论 -
Java Collections.rotate 方法浅析
前面一篇文讲述了 Java 中移动 ArrayList元素的方法。其中涉及到了java.util.Collections#rotate 方法,该方法可以实现 list 元素的旋转,即统一向前或向后移动多少个位置。本文简单对 java.util.Collections#rotate 方法进行分析和学习。原创 2023-03-12 23:10:41 · 772 阅读 · 0 评论 -
小代码大智慧: FilenameUtils.getName 函数分析
很多优秀的开源项目的代码设计都非常严谨,往往简单的代码中也蕴藏着缜密的思考。我们有时间可以看看一些优秀的开源项目,可以从简单的入手,可以先想想如果自己写大概该如何实现,然后和作者的实现思路对比,会有更大收获。平时看源码时,不仅要知道源码长这样,更要了解为什么这么设计。原创 2022-09-24 23:09:31 · 2263 阅读 · 0 评论 -
震惊,99.9% 的同学没有真正理解字符串的不可变性
字符串的不可变性是指通过String的方法来修改字符串都会产出新的字符串队形。但并非指字符串的字符一定无法被修改,我们可以通过反射一样可以对字符串的“状态/值”进行修改。正常情况下不会有人去这么做,否则会产出很多不出乎意料的BUG。通过本文想提醒大家,尽信书不如无书,对于看到的知识要有自己的思考。httpshttps。......原创 2022-07-31 22:33:22 · 891 阅读 · 0 评论 -
【Spring 源码学习系列】BeanNameAware#setBeanName 方法的调用时机
通过本文的分析,我们知道在refresh的环节被执行。而且和也会在执行之后一起调用。在和init方法执行之前被执行。强烈建议大家在整个链路感兴趣的地方断点调试,反复执行,才能对源码有进一步了解。强烈建议先猜想后验证,以便对源码有更深刻地印象。httpshttpshttpshttpshttpshttps。......原创 2022-07-16 22:54:36 · 1385 阅读 · 1 评论 -
【Spring 源码学习系列】ApplicationContextAware#setApplicationContext 方法的调用时机
纸上得来终觉浅,觉知此事需躬行。希望大家可以参考本文的简单Demo,亲自动手调试,理解才能更深刻。学习贵能举一反三。大家能够结合本节所学的方法自行分析方法的调用时机呢?本文并没有对IOC容器启动时的最核心方法中的refresh进行彻底的剖析,只是结合一个具体案例从某个切面去学习其中的某个环节,大家可以通过更多案例讲整个refresh核心方法都串起来,理解会越来越深入。httpshttpshttpshttpshttpshttpshttpshttpshttpshttps。....................原创 2022-07-16 01:49:19 · 1805 阅读 · 0 评论 -
Service 应该定义怎样的方法?
最近在代码审查时,会发现一些校招新同学会把一些步骤当做 Service 的方法,在 Facade 层对这些步骤进行编排来完成一个完整的功能。这显然是不太正常的。Facade 层通常作为前端或者其他服务调用的入口,主要负责参数校验、构造底层服务所需的参数、结果转换等。不应该将单个业务功能拆分到 Service 中,在 Facade 中对这些方法进行编排,最终完成一个业务功能。Facade 作为门面,本身不应该有业务逻辑,业务逻辑应该放在 Service 层。Service 的每个方法应该能够独立完成一原创 2022-01-22 22:00:35 · 899 阅读 · 0 评论 -
单元测试经典三问:是什么,为什么,怎么做?
一、背景编写合格的单元测试可以说是 Java 程序员的基本功。很多公司对但单测覆盖率都会有要求,通常要求在 60% 到 90% 不等。但是很多同学对单元测试或多或少有一些抵触,对如何写出“标准”的单元测试代码存在疑问。有些同学编写单元测试,纯粹是应付工作,完全起不到单测应该起到的作用。本文解答单元测试的三个基本问题,即单元测试是什么,为什么编写单元测试,怎么编写单元测试?二、经典三问2.1 单元测试是什么?单元测试英文单词叫: Unit Test 。什么是 Unit (单元)?单元可以原创 2021-12-04 13:58:55 · 3109 阅读 · 0 评论 -
Lambda 表达式带来的复杂性的破解之道
一、背景几年前和多人会提 “Java 8 的新特性”,现在 Java 8 几乎成了标配。曾经很多人抵触 Lambda 表达式,现在几乎也成了标配。实际开发中最常见的是,很多人使用 Stream 来处理集合类。二、看法对于 Lambda 表达式或者 Stream 的看法不尽一致。2.1 支持使用 Lambda 表达式可以减少类或者方法的常见。使用 Stream 可以享受链式编程的乐趣。有些人看别人都在用,似乎有些高端,或者担心自己被淘汰也跟着大量使用。2.2 反对有些人对 lambda原创 2021-11-27 01:34:56 · 2748 阅读 · 1 评论 -
深入理解 Lambda 表达式
一、背景Java 8 的 Lambda 表达式已经不再是“新特性”。现在很多人工作中会使用 Lambda 表达式。但是,你是否真正理解 Lambda 表达式的底层原理?本文给出自己的理解,希望对大家有帮助。二、分析下面是一段非常简单的代码,其中用到了 Stream 。import java.util.ArrayList;import java.util.List;import java.util.stream.Collectors;public class ListDemo {原创 2021-11-27 01:16:33 · 1955 阅读 · 0 评论 -
深入理解同步和异步、阻塞和非阻塞、并行和串行这几个概念
一、背景晚上技术群里有朋友问,“同步和阻塞色区别是什么?”有不少朋友给出去了自己的看法,部分内容如下:其中有朋友给出了截图,图上给出了比较“生动”的例子。然而,看完之后似乎懂了,似乎又没懂。很多人对这几个常见的概念,似乎熟悉而又陌生。二、理解2.1 前缘如果之前有同学看过我的 《我眼中的Java大牛之孤尽老师》 这篇文章,就会发现里面已经提及一二,遗憾的是大多数同学都是遇到问题的时候才想着去问去看。2.2 视角对于这个问题,我更倾向于大家以视角的思维去看。同步和异步是函数调用视角原创 2021-11-24 23:28:34 · 1555 阅读 · 1 评论 -
Java 范围比较的推荐姿势
一、背景在平时工作开发过程中,很容易遇到判断某个值是否在某个范围的场景。如需要校验某个日期是否在某个范围;需要校验某个版本号是否在某个区间;需要校验某个时间点是否在某个时间段内;判断某个人是否属于某个年龄段;判断某个用户的积分是否属于某个等级的区间等。前一阵子,技术群里有哥们就提了类似的一个问题:判断当前时间是否在周期的时间段里面有什么好的办法吗 比如 当前时间是2021-10-1 5:00:00 ,设置的时间段为 2021-9-30 1:00:00 -2021-9-30 18:00:00周原创 2021-11-12 23:28:29 · 2112 阅读 · 1 评论 -
一个简单的代码风格优化的小案例
一、背景最近 review 了一些代码,其中有一个函数的写法看着别扭,而且对应同学不太清楚还可以怎么优化。由于案例比较典型,值得分享一下。本文给出对应的伪代码和自己的修改建议,并推荐可以提交代码质量的图书,以便能够帮助大家养成良好的编码风格。二、伪代码public void doSomething(){// 构造参数(后无空格)// 调用二方服务(后无空格)if(result.success && result.getXXXMap() != null &&am原创 2021-07-25 22:33:47 · 684 阅读 · 0 评论 -
《编程的原则》重新发明车轮感悟之循序渐进
一、背景前一段时间有朋友说“学习的最好方式就是创造”,即想学某个源码,就自己写一套。果真如此吗?今天读《编程的原则》有讲到,可以为了学习的目的而创造。下面是其中一个节选:二、学习的原则2.1 循序渐进万事万物无非是两个维度,一个是时间维度,一个是空间维度。从时空维度来讲,学习通常需要循序渐进、先易后难、先整体后局部(先局部后整体)。日本剑道有一个非常有名的原则 “守、破、离”守」,一切盡量遵守教條,練習基本功夫直到熟練。這個階段專心學習一種實務,比學習各種理論重要。「破」,開始打破原创 2020-12-27 12:44:55 · 511 阅读 · 2 评论 -
《编写提测文档的正确姿势》GitChat
背景多程序员刚参加工作或者工作一两年,总习惯于按部就班地“搬砖”。不知道你是否认真思考过:如果你想成为一名专业的开发人员,想让测试认可你的专业度,让测试更愿意帮你兜底,应该怎么做?本文将结合自己的工作中的亲身体会,给出一些写提测文档的建议,帮助大家提高代码质量,给测试更好地合作体验,提升自己的专业度。在本场 Chat 中将会讲到如下内容:• 如何正确看待开发和测试测试人员的关系?• 写提测文档的意义?• 如何写出全面的提测文档,让测试为你点赞、更愿意为你兜底?适合..原创 2020-12-21 23:02:17 · 1137 阅读 · 1 评论 -
如何读源码更有效--直播
一、背景很多朋友在读源码收获不是很大,主要原因:缺乏整体思维,迷失在细节中(跳来跳去跳晕了)缺乏思考(学而不思则罔,思而不学则殆!!!)不知道读源码究竟读什么(设计思想)角度单一(解决问题角度、性能优化角度、设计模式角度、每次提交了、单元测试、注释等)方法单一(不懂的高级的调试技巧,不懂的时序图插件)输出最近开了一场直播来讲述以下内容:读源码究竟读什么?读源码的核心思想读源码的常见技巧二、录播内容原创 2020-11-18 22:27:35 · 692 阅读 · 0 评论 -
Java 8 ArrayList hugeCapacity 函数与 MAX_ARRAY_SIZE
1、背景今天有一个朋友问到一个为什么 ArrayList 源码扩容方法中,数组长度最大值是 MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8 的问题(真的是MAX_ARRAY_SIZE? )。并给出下列截图:2、别急,让我们捋一捋我们先搞清楚这里没几个变量的含义:min capacity 是最小容量old capacity 是原始数组容量newCapacity = oldCapacity + (oldCapacity >> 1) 是预计要扩容到的原创 2020-11-14 21:56:08 · 6488 阅读 · 2 评论 -
为什么你看书记不住,记住不会用?-我的技术学习方法论
一、背景最近有些同学遇到一些困惑,比如看书,看了容易忘,记住不会用。这是非常普遍的问题,也是我曾经遇到过的问题。那么如何解决呢?这就是本文重点要讨论的内容。二、原因分析2.1 “看着答案做题”或者称为“背诵 or 记忆”我们读书的时候,书上直接将(可能是最优的)答案告诉你。你并不需要进行深度思考就认为一切顺理成章。但是“看着答案做题”危害很大。试想一下,如果你是一个高中生,如果你每次做数学题都是直接看着答案,你会很轻松,会认为就该这么解。但是一旦脱离答案,你将手足无措,和答案在手时完全不原创 2020-08-15 12:16:44 · 23531 阅读 · 1 评论 -
含有泛型的 JSON 反序列化问题
含有泛型的 JSON 反序列化一、背景二、分析2.1 事出诡异必有妖三、解决之道3.1 猜想验证3.2 举一反三四、总结一、背景今天无聊之园提了一个问题,涉及的示例大致如下: public static void main(String[] args) { String jsonString = "[\"a\",\"b\"]"; List<String> list = JSONObject.parseObject(jsonString, List.c原创 2020-07-14 23:16:39 · 17276 阅读 · 2 评论 -
OSI七层模型与TCP/IP五层模型
一、OSI参考模型 今天我们先学习一下以太网最基本也是重要的知识——OSI参考模型。1、OSI的来源 OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。 ISO为了更好的使网络应用更为普及,推出了OSI参考模型。其含义就是推荐所有公司使用这个规范来控制网络。这样所有公司都有相同的规范,就能互联了。 2、OSI七层模型的划分...转载 2020-07-06 23:10:05 · 958 阅读 · 0 评论 -
深度剖析‘StringBuilder‘ can be replaced with ‘String‘ 提示
一、背景在写代码的时候使用 StringBuilder 进行字符串拼接时,IDEA 很可能会给出下面的提示: ‘StringBuilder’ can be replaced with ‘String’ 。那么为什么会给出这种提示?这种提示意味着什么?二、思考之前有讲过:“每一个疑问背后都隐藏着至少一个盲点和学习的绝佳机会”。因此我们不会轻易放过这个机会。另外很多人这个时候可能就要开始百度...原创 2020-02-15 14:02:57 · 13047 阅读 · 11 评论 -
细微之处见真章之StringUtils的isBlank函数细节解读
一、背景技术群里有一个老铁分享了一段 commons-lang 的 StringUtils 工具类的代码:public static boolean isBlank(final CharSequence cs) { int strLen; if (cs == null || (strLen = cs.length()) == 0) { return true;...原创 2019-12-28 15:20:34 · 5876 阅读 · 1 评论 -
简单源码解读之猜想验证
一、背景最近有一个朋友问,为啥 ArrayList 空参构造方法和有参构造方法的参数为 0 所用的空元素数组不用同一个。空参构造方法:/** * Constructs an empty list with an initial capacity of ten. */public ArrayList() { this.elementData = DEFAULTCAPACITY_E...原创 2019-12-19 00:25:07 · 1352 阅读 · 0 评论 -
为什么要推荐大家学习字节码?
配套视频:为什么推荐大家学习Java字节码https://www.bilibili.com/video/av77600176/一、背景本文主要探讨:为什么要学习 JVM 字节码?可能很多人会觉得没必要,因为平时开发用不到,而且不学这个也没耽误学习。但是这里分享一点感悟,即人总是根据自己已经掌握的知识和技能来解决问题的。这里有个悖论,有时候你觉得有些技术没用恰恰是...原创 2019-11-25 23:17:31 · 17362 阅读 · 26 评论 -
Java foreach中List移除元素抛出ConcurrentModificationException原因全解析
一、背景本文重点探讨 foreach 循环中移除元素造成java.util.ConcurrentModificationException 异常的原因。先看《阿里巴巴 Java开发手册》中的相关规定:那么思考几个问题:反例的运行结果怎样? 造成这种现象的根本原因是什么? 有没有更优雅地的移除元素姿势?本文将为你深度解读该问题。二、解读2.0 反例源代...原创 2019-11-17 16:34:09 · 3027 阅读 · 0 评论 -
《手册》详解 第2节学员提问之 ==150问题解析
一、背景码出规范:《阿里巴巴Java开发手册》详解 专栏刚发布, 其中 “第二节 02 Integer缓存问题分析”讲到:Integer var = ? 形式声明整型,最终会通过 java.lang.Integer#valueOf(int) 来构造整数对象。有一个学员提出了断点时出现 i =255问题,在另外一篇文章作了分析:https://dwz.cn/m1of2kIu...原创 2019-11-10 23:49:37 · 936 阅读 · 0 评论 -
Long的哈希值计算理念和哈希冲突的情况举例
一、背景《阿里巴巴 Java开发手册》的作者孤尽大佬举办的第一期 DIY 班,由最初的几百人,目前仅有60多人坚持到现在。其一,Deeply Inspire Yourself 深度激发自己其二,Do It Yourself 实践出真知其中第 20 期的题目是:自主选择一个类,说明它hashCode方法的设计理念和代码核心逻辑。本人选取...原创 2019-11-10 20:30:09 · 4027 阅读 · 1 评论 -
CompletableFuture 使用介绍
本文安利一个 Java8 的工具CompletableFuture,这是 Java8 带来的一个非常好用的用于异步编程的类。还没使用过的小伙伴,赶紧用起来吧。本文不介绍它的实现源码,仅介绍它的接口使用,本文也不做它和 RxJava 等其他异步编程框架的对比。一、实例化首先,不管我们要做什么,我们第一步是需要构造出 CompletableFuture 实例。最简单的,我们...转载 2019-06-16 19:04:48 · 20203 阅读 · 1 评论 -
ArrayList的toArray()方法为啥不利用泛型返回List的泛型类型的数组探究
一、背景有些同学提出“ArrayList的public <T> T[] toArray(T[] a) 带参数的方法支持泛型可以返回参数类型的数组,public Object[] toArray()方法为啥不利用泛型返回List的泛型类型的数组”?这个问题。那让我们看下源码研究一下吧。另外我将介绍一下通用解决这类问题的方法,方便大家举一反三。二、研究无参源码ja...原创 2019-06-16 01:05:01 · 3043 阅读 · 0 评论 -
谈看源码大法和JDK的精良设计从ArrayList的toArray的一个细节讲起
一、背景今天一个小伙伴提出一个细节问题,即ArrayList的toArray(T[] a)中的最后一个判断没有必要。由于出于对官方JDK代码的莫名的权威性的信任,以及曾经隐约看过注释有点印象,决心排查一下。这个问题虽然看似难度不大,但是本文将介绍一个学习源码的法宝,另外我们看看JDK的API编写者的良苦用心,最后总结一下这种思想。二、源码先看源码java.util.A...原创 2019-06-15 17:09:30 · 559 阅读 · 0 评论 -
谁是代码界3%的王者?- 第五题Lock的简单解读
一、背景阿里技术的公众发了一篇文章《谁是代码界3%的王者?》,提到“在Java代码界,有些陷阱外表看起来是个青铜实际上是王者,据说97%工程师会被“秒杀””给出了5道题,非常考验基础。本文简单解读第五题。二、代码给出的示例代码:public class LockTest { private final static Lock lock = new Ree...原创 2019-06-20 20:59:40 · 1112 阅读 · 1 评论 -
Junit单元测试不支持多线程测试问题全解析
一、背景今天@段段提出了一个很好的问题,她发现单元测试时如果开多个线程,主线程运行结束就结束了,并不会等待子线程结束。如果用main方法就没问题,技术群里展开了激烈的讨论。本文将“复现”这种现象,并给出多种解决方案,并纠正个别文章的错误,并追到源头带大家找出问题的原因。本文会分享几点干货,如调用栈大法、发编译大法等。二、复现场景的源码我们的线程类public clas...原创 2019-06-14 23:39:11 · 5344 阅读 · 4 评论 -
Executors.newCachedThreadPool的底层源码浅析
1、BG(背景)《线程池好处和核心参数等面试必备》对线程池的优点以及核心参数等进行了全面的介绍。从整体角度大致谈谈Executors.newCachedThreadPool这个函数。2、JDK Code关于线程池的核心参数请看背景中提到的那篇文章。首先老规矩,上源码(ps:看美女)。java.util.concurrent.Executors#newCachedThr...原创 2019-06-02 01:44:32 · 8608 阅读 · 1 评论 -
线程池好处和核心参数等面试必备
一、背景线程池的优点,以及核心参数是面试的重点。在工作中也经常用到,大多人就看着之前源码怎么写copy一份就完事,没有深入得思考过为啥这样。还有就是核心线程池参数理解可能不太透彻。本文介绍使用线程池的优势以及相关核心知识点。二、线程池的优势现在不管是Java线程池,还是数据库连接池,redis缓存连接池,包括dubbo的线程池等等都是为了复用线程,避免频繁的创建和销毁线程浪...原创 2019-06-02 00:03:24 · 5661 阅读 · 6 评论 -
谁是代码界3%的王者?- 第三题switch问题简单解读
一、背景阿里技术的公众发了一篇文章《谁是代码界3%的王者?》,提到“在Java代码界,有些陷阱外表看起来是个青铜实际上是王者,据说97%工程师会被“秒杀””给出了五道题,非常考验基础。本文简单解读第3题,并分享通用的学习和研究方法。二、题目这段代码输出的结果是:A: nullB: 抛出异常C: default public static void mai...原创 2019-06-21 00:11:09 · 8264 阅读 · 28 评论 -
通过java.util.concurrent.TimeUnit来学习枚举
一、背景今天无意间看到了java.util.concurrent.TimeUnit枚举类。想通过这个类谈谈枚举,以及编程规范问题。二、源码源码:package java.util.concurrent;/** * A {@code TimeUnit} represents time durations at a given unit of * granulari...原创 2019-06-11 22:28:59 · 1281 阅读 · 2 评论 -
谁是代码界3%的王者?- 第四题BigDecimal问题简单解读
一、背景阿里技术的公众发了一篇文章《谁是代码界3%的王者?》,提到“在Java代码界,有些陷阱外表看起来是个青铜实际上是王者,据说97%工程师会被“秒杀””给出了五道题,非常考验基础。本文简单解读第4题,并分享通用的学习和研究方法。二、题目题目配套代码public class BigDecimalTest { public static void mai...原创 2019-06-21 23:03:10 · 3477 阅读 · 2 评论 -
@Transactional 自调用失效问题解析
一、背景”脏脏包“在技术群里问了一个问题:”大家有在项目中遇到这样的场景吗 在一个service层重写的方法中调用一个私有方法。 service重写的方法不加事务 私有方法想加入事务 他去调用私有方法时 私有方法需要被事务控制“。这个问题比较典型,面试时也经常被问到,在此简单整理一下。二、Spring注解方式的事务实现机制在应用调用声明@Transactional 的目标方法时...原创 2019-06-26 00:12:21 · 9402 阅读 · 3 评论