
问题积累
文章平均质量分 80
明明如月学长
阿里巴巴 资深 Java 研发工程师。《系统掌握大语言模型提示词 - 从理论到实践》小册作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者、《性能优化方法论》技术电子书作者。热爱技术,喜欢思考,乐于分享。
展开
-
连接公共网络不弹出验证页面问题的杀手锏
有些公共网络需要连接网络之后,弹出验证页面,输入手机号获取验证码才能登录。有时候下面几个方法也有效:忽略此网络情况 Safari 浏览器缓存重启电脑这些方法有时候奏效,有时候都没用。此时可以参考下面的“杀手锏”。原创 2024-03-30 16:41:46 · 6488 阅读 · 1 评论 -
浅谈 Guava 中的 ImmutableMap.of 方法的坑
虽然这个问题并不难,但很多人并不知道会有那么多“坑”,很多人都需要重复思考如何解决这些限制。因此,本文总结在这里,希望对大家有帮助。原创 2023-11-24 00:44:37 · 1678 阅读 · 0 评论 -
希望你不要经历的那些坑:你确定资源正确释放了?
虽然这个问题并不难,但工作中还是会见到很多类似的错误。希望加大能够养成良好的编码习惯,希望能够真正做到知行合一、学以致用。欢迎加入我的知识星球,知识星球ID:15165241 (已经营五年多,会持续经营)一起交流学习。申请时标注来自优快云。原创 2023-09-20 08:00:00 · 6025 阅读 · 5 评论 -
诡异,明明更新成功了状态,查不出来了
本文讲解事务未提交时异步查询不到数据导致代码效果不符合预期的情况,并给出了解决办法。大家在事务中使用异步线程执行任务时要特别注意你这个问题。大家要加强代码审查,有很大概率可以避免一些问题。同时,大家查问题时,一定要以“证据为依据”,“大胆猜想,小心求证”。欢迎加入我的知识星球,知识星球ID:15165241 (已经营 5 年,会持续经营)一起交流学习。申请时标注来自优快云。原创 2023-09-19 08:00:00 · 4486 阅读 · 2 评论 -
悲催,放到 Map 中的元素取不出来了!!
一天程序员小明跑到师兄面前说 :“师兄,我看到一个很诡异的现象,百思不得其解”。师兄说:“莫慌,你且慢慢说来”程序员小明说道:“我放到 Map 中的数据还在,但是怎么也取不出来了…”师兄,于是帮小明看了他的代码,发现了很多不为人知的秘密…/***/当自定义对象作 Map 的键时,一定要根据实际的场景慎重考虑是否要重写 equals 和 hashCode 方法。不恰当重写 equals 和 hashCode 方法可能会导致一些奇奇怪怪的问题,以后用另外一篇来讨论。原创 2023-09-15 00:57:22 · 806 阅读 · 5 评论 -
不要再使用 @Builder 注解了!
曾经,我在《千万不要再随便使用 lombok 的 @Builder 了!一文中提到 @Builder 注解的其中一个大坑会导致默认值失效!最近阅读了《Oh!!发现@Builder的问题还不止一个,@Builder会让人误以为是遵循构建器模式,实则不然,后面会介绍。总的来说,不推荐再使用@Builder注解,接下来讲重点介绍其原因和替代方案。原创 2023-08-22 08:15:00 · 736 阅读 · 2 评论 -
见微知著: StringUtils.split
明明如月学长, 优快云 博客专家,蚂蚁集团高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。原创 2023-08-15 08:30:00 · 894 阅读 · 2 评论 -
使用 fastjson 又又又出现了问题,“莫名其妙”多了属性
我认为**对于 Java 程序员而言,《阿里巴巴 Java 开发手册》至少读 3 遍。**工作中发现太多常见低级问题都是 《阿里巴巴 Java 开发手册》已经存在的问题。然而推荐很多次《阿里巴巴 Java 开发手册》虽然很薄,但是很多人还是不会认真阅读几遍,导致在相同的地方跌倒很多遍。哪怕遇到类似的问题,也很容易快速想出原因。我们遇到问题时,一定不要止步于解决问题,而是应该寻找最合理的解决方案。原创 2023-06-19 08:00:00 · 811 阅读 · 4 评论 -
又被 fastjson 坑了?它调用了我自定义的 get 方法!
最近看到又有同学被 fastjson 坑了。该同学在类中自定义了 get 方法,在该 get 方法中引用了一个对象,由于某段代码中 “没有用到”该方法就没注入,最后出现了空指针。由于自己确定没有主动调用这个方法,排查了半天,借助 arthas 看 trace 才发现这个坑。原创 2023-05-18 07:30:00 · 1563 阅读 · 0 评论 -
AI 帮我避免了 Map 计算哈希值的一个大坑
大家在对 Map 计算其哈希值作为缓存 key 时,需要特别注意这个问题。建议大家在日常开发中一些简单的代码示例,一些验证性的代码,推荐大家优先让 AI 帮我们编写,有时候会有意外收获。欢迎加入我的知识星球,知识星球ID:15165241 一起交流学习。申请时标注来自优快云。原创 2023-05-16 07:00:00 · 345 阅读 · 1 评论 -
为什么 JUnit4 要求 @Test 注解的测试方法必须为 public ?
在使用 JUnit4 进行单元测试时,我们常常需要为待测方法编写对应的测试方法,并使用@Test注解进行标注。然而,在实际使用中,有时我们可能会忘记将测试方法设置为 public,从而导致测试失败。那么,为什么 JUnit4 要求@Test注解方法必须为 public 呢?原创 2023-05-02 08:00:00 · 1392 阅读 · 1 评论 -
分布式缓存长 key 影响性能怎么办?一文讲透如何优化!
本文提供一些解决 Key 过长的思路,希望对遇到相似问题的同学有启发。欢迎加入我的知识星球,知识星球ID:15165241 一起交流学习。申请时标注来自优快云。欢迎加入我们的 slack 工作区,在里面可以对ai 和我进行提问。原创 2023-04-25 06:00:00 · 566 阅读 · 1 评论 -
什么?left join 的 on 条件失效了?查出了不符合条件的数据?
最近发现很多人对 left join 的 on 条件的作用有误解,导致出现 Bug。由于很多人都不太注意这问题,很容易造成故障。下面我们简单复现这个问题,并解释为什么会这样,希望大家日常开发中万分小心。原创 2023-04-21 00:51:26 · 2670 阅读 · 3 评论 -
千万不要再随便使用 lombok 的 @Builder 了!
虽然很多人吐槽,“面试造轮子,入职拧螺丝”,实际上一定的理论基础是有必要的。很多知识点只有懂原理才能少趟坑。建议大家使用 lombok 的注解时,工作之余偶尔看下编译后的类长什么样子,这样有助于避坑。lombok 的@Builder注解虽然好用,但不要“贪杯”。使用@Builder一定要注意它的副作用,避免出现潜在的 BUG。欢迎加入我的知识星球,知识星球ID:15165241 一起交流学习。申请时标注来自优快云。欢迎加入我们的 slack 工作区,在里面可以对ai 和我进行提问。原创 2023-04-17 00:03:55 · 2999 阅读 · 3 评论 -
同事一小时没解决的问题,被 New Bing 秒解了
看完问题之后,很多同学或许会认为这也不难啊。其实很多奇奇怪怪的问题都是这样,当你解决之后的确不难,但遇到问题时,可能会受到其他线索干扰,很可能没有第一时间想到这个问题。人工智能时代已经来临,但是我们不自觉的还是会使用传统的方式来解决问题。做一个真正 AI 时代的程序员,我们在遇到一些奇奇怪怪的,一些不容易解决的问题,没有明确的思路时,可以优先考虑问 AI 工具,解决不了时再考虑请教别人。原创 2023-04-10 08:00:00 · 918 阅读 · 2 评论 -
Mac 生成 SSH 密钥
昨天试用 cursor 时想推送代码到 github ,遇到问题,该用 ssh 方式推送,提示没有配置公钥。原创 2023-04-09 09:49:51 · 11233 阅读 · 1 评论 -
什么?你不知道 ConcurrentHashMap 的 kv 不能为 null?
最近设计某个类库时使用了 ConcurrentHashMap 最后遇到了 value 为 null 时报了空指针异常的坑。本文想探讨下以下几个问题:(1) Map接口的常见子类的 kv 对 null 的支持情况。(2)为什么 ConcurrentHashMap 不支持 key 和 value 为 null?(3)如果 value 可能为 null ,该如何处理?(4)有哪些线程安全的 Java Map 类?(5)常见的 Map 接口的子类的使用场景。原创 2023-03-10 23:38:45 · 2285 阅读 · 0 评论 -
使用 BeanUtils.getProperty 获取属性时出现 NoSuchMethodException: Unknown property 问题分析
下面给出一个自定义工具方法来获取对象的私有属性的参考代码。/*** 获取对象的私有属性* @param instance 实例* @param name 属性名* @param 值类型* @return 属性值Objects . requireNonNull(instance , "instance 不能为空");Objects . requireNonNull(name , "name 不能为空");// 获取目标对象的字节码对象 Class原创 2023-03-10 01:31:34 · 2803 阅读 · 0 评论 -
将非数字的用户ID映射到位图的方案探讨
今天技术群里有同学提出想讲非数字的用户 ID 映射到位图中,计划采用 murmur 3 哈希算法,询问冲撞率是多少。借着这个机会简单聊下非数字用户ID 如何更好地避免冲突,是否有更好的思路。原创 2023-03-09 00:52:03 · 696 阅读 · 0 评论 -
什么?同步代码块失效了?-- 自定义类加载器引起的问题
继承类,实现一个自己的类加载器。重写findClass方法,实现自己的类查找逻辑。例如,从指定的路径或者网络上加载类的字节码,然后调用方法将字节码转换为 Class 对象。重写loadClass方法,遵循类加载的顺序或方式。例如,优先使用父加载器加载,如果加载不到,再交使用本类加载器加载。具体代码,参考上文中的// 先委托父类加载器加载类 Class原创 2023-03-08 13:24:52 · 727 阅读 · 1 评论 -
PlantUML 高版本 IDEA 插件默认主题修改
很多人会选择在 IDEA 中安装 PlantUML Integration 插件。但是高版本的 IDEA PlantUML Integration 插件默认的主题和之前的完全不一样, 颜色偏暗,不同的组件很难区分开。其实不仅是插件里,在官网上写同样的脚本,默认的主题也是一样的情况。那么如何解决?原创 2022-09-10 00:40:50 · 2274 阅读 · 1 评论 -
一分钟解决 The server selected protocol version TLS10 is not accepted 问题
要利用好搜索引擎。大家解决问题时要学会变通,别人文章里给的路径和自己不一样,自己可以参考类似的路径去查找。建议积累常见的 linux 指令,可以快速查找某个文件名的文件、快速查找包含某个关键字的文件。原创 2022-09-07 23:21:55 · 22384 阅读 · 4 评论 -
重写线程池 execute 方法导致线程池“失效” 问题
今天群里有个同学遇到一个看似很奇怪的问题,自定义通过 execute 方法来执行任务,似乎仍然用的是主线程执行任务,似乎线程池失效了。原创 2022-08-13 23:42:50 · 1922 阅读 · 0 评论 -
巨坑系列:Java Bean 转 Map 的那些坑
有些业务场景下需要将 Java Bean 转成 Map 再使用。本以为很简单场景,但是坑很多。父类2.1 JSON 反序列化了类型丢失2.1.1 问题复现将 Java Bean 转 Map 最常见的手段就是使用 JSON 框架,如 fastjson 、 gson、jackson 等。但使用 JSON 将 Java Bean 转 Map 会导致部分数据类型丢失。如使用 fastjson ,当属性为 Long 类型但数字小于 Integer 最大值时,反序列成 Map 之后,将变为 Inte原创 2022-07-09 03:15:35 · 811 阅读 · 0 评论 -
如何避免忘记清理 ThreadLocal ?
一、背景ThreadLocal 可以解决“线程安全问题”。也可以作为上下文暂存数据以备后续步骤获取。但是 ThreadLocal 用不好的确容易产生故障,因而有些团队不允许使用 ThreadLocal。最核心的一个原因是很容易忘记 clear 数据。那么,有什么优雅的解法没有?二、解法package basic.thread;import com.alibaba.ttl.TransmittableThreadLocal;import java.util.HashMap;impor原创 2022-03-28 22:57:30 · 2398 阅读 · 0 评论 -
细微之处见真章之是否要给某些类型的属性赋默认值?
一、背景今天技术群里有朋友问:“是否需要为对象里的集合赋默认值?会不会有问题?默认空集合是不是上游就可以不用 CollectionUtils 判空,代码更简洁?”二、结论2.1 给默认值,会不会有问题要结合这个业务看比如有些对象没有值时,给一个没有任何属性空对象,很容易导致一些副作用如果是集合,没有值给空集合通常如果没有副作用,尤其是在当前类中使用,可以给默认集合。2.2 编程习惯很重要不管底层是否给了默认值,建议上游统一使用 CollectionUtils 对集合判空。我们无法确定所有返原创 2022-03-23 21:15:27 · 775 阅读 · 1 评论 -
Domain Primitive 使用推荐
一、前言最近对团队的很多同学代码进行了 Code Review ,发现存在很多问题。其中一个问题就是普遍代码内聚不够,将原本需要对象提供的方法外泄给使用者。如一个对象里包括状态字段,使用方需要根据状态判断是否为成功:public class SomeResult{ // 值 为 0 表示成功 private String status; // 标签,其中 HOT 表示热门 private String tage; private Map<String, Object原创 2022-03-09 21:43:08 · 1387 阅读 · 3 评论 -
git The requested URL returned error: 429 问题解决
一、问题描述今天从 github 上 clone 代码遇到了报错:The requested URL returned error: 429截图如下:二、解决办法搜索说仓库文件过大,可以调大文件大小git config --global http.postBuffer 524288000原创 2022-03-09 20:14:29 · 7772 阅读 · 1 评论 -
unable to execute xxx.sh : Operation not permitted 问题
一、背景之前在本地创建了 shell 脚本,在 iterm 中可以通过 ./xxxx.sh 的方式去执行。今天突然发现报了如下错误:unable to execute xxx.sh : Operation not permitted或者-bash: ./xxx.sh: /usr/bin/env: bad interpreter: Operation not permitted最近把系统升级为 Monterey 版本,怀疑和系统升级有关系。二、解决办法ls -l 查看权限发现有执原创 2021-12-02 23:56:37 · 3589 阅读 · 2 评论 -
Java 接口的所有子类都需要执行相同处理逻辑的推荐姿势
一、背景在实际开发过程中,有些时候我们可能会遇到这样的场景,即实现某个功能时,需要“强制”子类型都要执行相同的一段代码。二、描述下面都是伪代码,大家不必纠结于具体细节,理解意思即可。我们需要提供给上游这样一个接口, type 是指当前服务能够处理的类型,something 代表实际执行的业务功能。public interface SomeInterface { String type(); ResultDTO something(Param param);}原创 2021-12-02 00:22:06 · 2961 阅读 · 0 评论 -
“禁止用 select * 作为查询字段列表”落地指南
一、背景《阿里巴巴 Java 开发手册》 MySQL 数据库部分,ORM 映射部分,谈到:【强制】 在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。说明:1)增加查询分析器解析成本。2)增减字段容易与 resultMap 配置不一致。3)无用字段增加网络消耗,尤其是 text 类型的字段。甚至有些公司还会对代码进行扫描,当发现代码或者 MyBatis 配置中出现 select * 时会给出告警要求修改。规范中将这么规定的原因给出了解释,但是落地时又会遇到一些原创 2021-12-01 00:18:02 · 4868 阅读 · 4 评论 -
Java 单元测试获取目标日志内容进行断言的推荐姿势
一、背景我们写单元测试的时候,偶尔需要获取被测试对象的 logger 输出的内容,用于断言或者通过单元测试辅助自己排查问题。有什么好的解决方案吗?二、 介绍原创 2021-11-22 23:59:49 · 3468 阅读 · 0 评论 -
Java 实现有限状态机的推荐方案
一、背景平时工作开发过程中,难免会用到状态机,即状态的流转。下面是一个简单的模拟状态机:有些同学会定义为常量,使用 if else 来流转状态,不太优雅。有些同学会定义为枚举,大多数同学会选择使用 switch 来流转状态:import lombok.Getter;public enum State { STATE_A("A"), STATE_B("B"), STATE_C("C"), STATE_D("D"); @Getter priv原创 2021-11-16 00:57:59 · 4628 阅读 · 4 评论 -
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 评论 -
巧用 Spring 自动注入实现策略模式升级版
一、背景在工作过程中,有时候需要根据不同的枚举(常量)执行不同的逻辑。如,不同的用户类型有不同的处理方式,接口为 Handler ,示例代码如下:public interface Handler { void someThing();}有些同学会选择在 Bean 中定义一个 Map<String,Handler> 的 type2BeanMap,然后使用 xml 的方式,将常量和对应 bean 注入进来。<bean id="someService" class="原创 2021-11-12 00:05:04 · 3610 阅读 · 5 评论 -
mac Big Sur系统 mvn打包报错:No compiler is provided in this environment. Perhaps you are running on a JRE
一、背景最近将mac 升级到 Big Sur 版本,出现了个别奇奇怪怪的小问题。系统升级后执行 mvn 命令,总是出现以下错误:No compiler is provided in this environment. Perhaps you are runningon a JRE截图如下:网上搜索了很多答案,基本都是说环境变量的问题,通过 java -version 检查了环境变量没啥问题。折腾老半天没搞定,最终找到了解决方案,在这里将这个坑分享出来。二、解决办法2.1 下载并安装原创 2020-12-26 22:30:40 · 10956 阅读 · 35 评论 -
mysql 5.6 order by limit 排序分页数据重复问题
0 问题描述在MySQL中我们通常会采用limit来进行翻页查询,比如limit(0,10)表示列出第一页的10条数据,limit(10,10)表示列出第二页。但是,当limit遇到order by的时候,可能会出现翻到第二页的时候,竟然又出现了第一页的记录。具体如下:SELECT `post_title`,`post_date` FROM post WHERE `post_status`='publish' ORDER BY view_count desc LIMIT 5,5使用...转载 2020-07-18 22:31:29 · 1419 阅读 · 0 评论 -
为什么不推荐使用BeanUtils属性转换工具
1 背景之前在专栏中讲过“不推荐使用属性拷贝工具”,推荐直接定义转换类和方法使用 IDEA 插件自动填充 get / set 函数。不推荐的主要理由是:有些属性拷贝工具性能有点差有些属性拷贝工具有“BUG”使用属性拷贝工具容易存在一些隐患(后面例子会讲到)2 示例首先公司内部就遇到过 commons 包的 BeanUtils 进行属性拷贝性能较差的真实案例,然后该同事换成了 Spring 的 BeanUtils 性能好了很多,感兴趣大家可以使用性能测试框架或者基准测试框架去对比,这里就不对原创 2020-07-15 22:05:44 · 30622 阅读 · 9 评论 -
将一个接口响应时间从2s优化到 200ms以内的一个案例
一、背景在开发联调阶段发现一个接口的响应时间特别长,经常超时,囧…本文讲讲是如何定位到性能瓶颈以及修改的思路,将该接口从 2 s 左右优化到 200ms 以内 。二、步骤2.1 定位定位性能瓶颈有两个思路,一个是通过工具去监控,一个是通过经验去猜想。2.1.1 工具监控就工具而言,推荐使用 arthas ,用到的是 trace 命令具体安装步骤很简单,大家自行研究。我的使用步骤是...原创 2020-03-01 14:49:11 · 43846 阅读 · 19 评论 -
尽信书不如无书之获取枚举值代码优化
1 背景实际开发中根据枚举的某个属性获取枚举值非常常见。如定义一个枚举:@Getterpublic enum CoinEnum { PENNY(1), NICKEL(5), DIME(10), QUARTER(25); CoinEnum(int value) { this.value = value; } private fi...原创 2019-12-13 00:55:20 · 4424 阅读 · 0 评论