目录

程序员子悠 · 好记性不如烂笔头

技术人生 X 人生技术

IntelliJ IDEA 的这个 BUG 存在三年了!

Java 程序员使用最多的 IDE 那一定是 IntelliJ IDEA(如果你还在用 Eclipse 或者 MyEclipse 我建议你换换),阿粉作为一名Java 程序员日常工作中几乎天天使用,不知道你有没有遇到过这种场景,那就是如果远程仓库中多了新的分支,每次通过右下角的分支管理 fetch 了远程分支过后,在搜索框中找不到获取到的分支,而是要关闭窗口,重新再打开搜索一下才能进行 checkout 操作,而且移除了分支也是一样,不会动态更新。 虽然说问题不大,但是当分支多了操作的次数多了以后,还是很烦心的,一开始遇到的时候总觉得是自己使用的不对,或者软件的版本有问题,但是最近升级到最新版本过后,发现这个问题还是存在,无奈的 Google 了一下,不搜不知道一搜索才发现,原来这个 Bug 已经存在了三年了,而且还一直处于 Open 的状态。 这个 BUG 的描述跟我们的问题是完全一样的,说的是 fetch 结束过后,分支列表并没有更新。而且通过右边的面板我们可以看到,这还是一个未关闭的高优先级的 BUG。BUG 的完整链接地址我放在文末了,感兴趣的小伙伴可以去看看。而且在这个 BU....

Java 中一个你绝对没用过,但是很好用的数据结构

Java 中常规的集合工具,相比大家都熟练于胸,但是如果说有一个集合类你不一定知道或者说肯定没用过,你相不相信呢?今天跟大家介绍的就是java.util.EnumMap,也是 java.util 包下面的一个集合类,同样的也有对应的的 java.util.EnumSet,下面我们看一下吧。 用过的小伙伴在评论扣 1,没用过扣个 0,让阿粉看看有多少小伙伴用过 Map 和 Set 结构在我们日常工作的使用的特别多,经常会用来存放数据或者参数传递,不过有些场景在使用 Map 的时候,不知道大家会不会感受到一丝丝的不安,毕竟 Map 的数据设置我们没办法控制,完全不知道别人会 put 一些什么样的数据进去,或者说如果某些场景我们 Map 的数据 Key 的类型和个数是固定,那在这种情况的下,我们如何提升系统的安全性和性能呢? 这个时候我们就可以考虑使用 EnumMap,EnumMap 顾名思义首先是一个 Map,其次它的key 只能是枚举,大家都知道枚举中的实例个数是固定的,而且还是预编译的,所以在很大程度上保证了数据的安全性,同时也可以提升一定的性能。 EnumMap 下面我们来看下如何使....

Java 代码基于开源组件生成带头像的二维码,推荐收藏!

二维码在我们目前的生活工作中,随处可见,日常开发中难免会遇到需要生成二维码的场景,网上也有很多开源的平台可以使用,不过这里我们可以通过几个开源组件,自己来实现一下。 在动手之前我们先思考一下需要进行的操作,首先我们需要生成一个二维码,其次我们需要在这里二维码中间添加一个头像。 这里我们生成二维码使用工具 zxing,合成图片我们采用 thumbnailator,接下来我们实操一下吧。 生成二维码 首先我们先根据目标地址,生成一个二维码,这里我们使用的是组件 zxing,在 SpringBoot 的pom依赖中,我们加入下面的依赖。 <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>com.google.zxing</groupId&am....

SpringBoot 自动装配的原理分析

关于 SpringBoot 的自动装配功能,相信是每一个 Java 程序员天天都会用到的一个功能,但是它究竟是如何实现的呢?今天阿粉来带大家看一下。 自动装配案例 首先我们通过一个案例来看一下自动装配的效果,创建一个 SpringBoot 的项目,在 pom 文件中加入下面的依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 其中 web 的依赖表示我们这是一个 web 项目,redis 的依赖就是......

Java 中九种 Map 的遍历方式,你一般用的是哪种呢?

日常工作中 Map 绝对是我们 Java 程序员高频使用的一种数据结构,那 Map 都有哪些遍历方式呢?这篇文章阿粉就带大家看一下,看看你经常使用的是哪一种。 通过 entrySet 来遍历 1、通过 for 和 map.entrySet() 来遍历 第一种方式是采用 for 和 Map.Entry 的形式来遍历,通过遍历 map.entrySet() 获取每个 entry 的 key 和 value,代码如下。这种方式一般也是阿粉使用的比较多的一种方式,没有什么花里胡哨的用法,就是很朴素的获取 map 的 key 和 value。 public static void testMap1(Map<Integer, Integer> map) { long sum = 0; for (Map.Entry<Integer, Integer> entry : map.entrySet()) { sum += entry.getKey() + entry.getValue(); } System.out.println(sum); } 看过 HashMap 源码的同学.....

关于 Java 的可变参数你真的了解吗?

我们都知道 Java 支持可变参数的形式定义方法,这种语法糖在某些时候可以简化我们的代码,但是关于可变参数是如何实现的以及其他的更多细节,你真的知道吗?今天阿粉就带你来了解一下。 ![image-20220212232737739](/Users/silence/Library/Application Support/typora-user-images/image-20220212232737739.png)

微软宣布正式关闭 IE浏览器,历时 28 年的 IE 浏览器走向了终点

提到 IE 浏览器大家能想到是什么呢?慢,慢,还是慢!近日有消息称微软将在 2022 年 6月 15 日正式关闭 IE 浏览器,届时更新了最新 Windows 系统的用户将无法在新系统上启用 IE 浏览器,只能说该来的总会来。 说真的阿粉从接触电脑以来除了在学校机房里面用 IE 浏览器之外,其他时候用的最多的就是通过 IE 浏览器下载 Chrome 浏览器,而它的价值也就停留在这里了,下载了 Chrome 浏览器以后,IE 再也没有被打开过,桌面上的快捷方式也被删掉了。 今天 IE 也终于迎来了它的末日,虽然 IE 比不了当下的 Chrome,Firefox 等浏览器,但是毕竟也是曾经的一哥,靠着强大的微软爸爸的系统强绑定,一度市场份额占据第一,而且很多政府单位的官网或者系统都还只支持 IE 访问。 之前微软就对 IE 浏览器停止了更新,现在是真正的准备放弃了,毕竟 IE 的名声已经就不回来了,索性推出 Edge,用一个新的产品来替代旧的。 熟悉的朋友可能知道,其实最开始的浏览器并不是 IE ,而是网景公司开发的 Netscape 浏览器,Netscape 浏览器定义了许多关于浏览器的....

远程调用失败?如何优雅的进行重试?

在日常开发的过程中我们经常会需要调用第三方组件或者数据库,有的时候可能会因为网络抖动或者下游服务抖动,导致我们某次查询失败,这种时候我们往往就会进行重试,当重试几次后依旧还是失败的话才会向上抛出异常进行失败。接下来阿粉就给大家演示一下通常是如何做的,以及如何更优雅的进行重试。 常规做法 我们先来看一下常规做法,常规做法首先会设置一个重试次数,然后通过 while 循环的方式进行遍历,当循环次数没有达到重试次数的时候,直到有正确结果后就返回,如果重试依旧失败则会进行睡眠一段时间,再次重试,直到正常返回或者达到重试次数返回。 package com.example.demo.service; import org.springframework.retry.annotation.Backoff; import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Service; import java.util.Random; import java.util.concu....

我敢打赌你一定没用过 Java 中的这个类!

在 Java 中有这样的一个类,平时可能都用不到,但是需要的时候还是会很方便的,它就是 Java 中的javafx.util.Pair。在介绍 Pair 的使用之前我们先看看下面的例子。 如果对 Python 或者 GO 这两个语言有了解的,应该知道这两种语言是有下面这样的特性,那就是一个函数可以返回多个值,如下所示: Python 示例: #! /usr/bin/env python3 # -- coding: utf-8 -- """ 日期:2022-07-09 12:14 描述:a test module """ author = 'ziyou' def mul_result(a, b): key = "key" value = a + b return key, value if name == 'main': key, mul = mul_result(3, 4) print(key) print(mul) GO 示例: package main import "fmt" func mul_result(a, b int) (key string....

Java 中如何实现一个像 String 一样不可变的类?

如果问你在日常开发中用到的最多的一个 Java 类是什么,阿粉敢打赌绝对是 String.class。说到 String 大家都知道 String 是一个不可变的类;虽然用的很多,那不知道小伙伴们有没有想过怎么样创建一个自己的不可变的类呢?这篇文章阿粉就带大家来实践一下,创建一个自己的不可变的类。 特性 在手动编写代码之前,我们先了解一下不可变类都有哪些特性, 定义类的时候需要使用 final 关键字进行修饰:之所以使用 final 进行修饰是因为这样可以避免被其他类继承,一旦有了子类继承就会破坏父类的不可变性机制; 成员变量需要使用 final 关键词修饰,并且需要是 private 的:避免属性被外部修改; 成员变量不可提供 setter 方法,只能提供 getter 方法:避免被外部修改,并且避免返回成员变量本身; 提供所有字段的构造函数; 实操 知道了不可变类的一些基本特性之后,我们来实际写代码操作一下,以及我们会验证一下,如果不按照上面的要求来编写的话,会出现什么样的问题。 这里我们定义一个 Teacher 类来测试一下,按照我们上面提到的几点,我们给类和属性的定义都加上 f....

后端程序员对于 Docker 要掌握多少才行?阿粉的答案是

阿粉的答案是会部署服务就行了。 关于 Docker 阿粉相信作为后端程序员小伙伴们多多少少都听过或者用过,而且很多时候也都是因为要使用的时候才会去学习,毕竟学了用不上还不如不学。 对于后端程序员来说,如果不是专门运维或者喜欢研究运维的同学,对于 Docker 的使用只要能熟练的部署服务基本上就够用了。毕竟说实话作为后端程序员要学习的东西真的太多了,一名合格的后端程序员不仅要能看得懂改得了前端代码,也要能懂运维部署和数据库设计,而且每个领域还动不动就有很多新东西要学习,只能说太难了,毕竟每个人的精力是有限的。 为了掌握一下 Docker 再加上阿粉最近搞了一台轻量服务器,想折腾点东西,但是不知道搞什么好,所以就想起来了搭建一个网站来玩玩,可以用来写一些文章和分享啥的。 搭建网站有很多种方式,不过最强大的还是要数 WordPress,但是如果要完全靠自己搭建环境还是比较复杂,所以就想着还是使用 docker 来搭建,简单快速。 0. 安装 Docker 在 Linux 服务器中安装 docker 非常简单,直接执行yum install docker 命令即可,阿粉这边已经安装过了,所以就....

一文教你如何通过 Stream API 批量 Mock 数据

在日常开发的过程中我们经常会遇到需要 mock 一些数据的场景,比如说 mock 一些接口的返回或者说 mock 一些测试消息用于队列生产者发送消息,可能很多时候我们都是使用一些固定的 case 或者一条相同的数据重复使用。今天阿粉就教大家用 Stream 去构造一些伪真实的一些数据。 Mock 任意个 UUID 首先我们通过普通写法来构造 100 个 UUID,代码如下相信大家都会写,就不多说了。 public static List<UUID> listUUID(int size) { List<UUID> list = new ArrayList<>(); for (int i = 0; i < size; i++) { UUID uuid = UUID.randomUUID(); list.add(uuid); } return list; } 下面再提供 Stream 的写法,代码如下,一行搞定 public static List<UUID> listUUID2(int size) { return Stream........

成为程序员之后你明白了什么?

如果问你成为程序员以来,你明白了哪些道理,你的回答会是什么呢? 知乎上面有个提问,问题是成为程序员后你都明白什么?获取的几十万的浏览量。 首赞的一个回答是引用了阮一峰老师的一个博文,是翻译美国最大的论坛 Reddit 之前的一个热帖,是一个喝醉了的十年工作经验的程序员写下来的,堪称是程序员的酒后真言。 职业发展的最好方法是换公司。 技术栈不重要。技术领域有大约 10-20 条核心原则,重要的是这些原则,技术栈只是落实它们的方法。你如果不熟悉某个技术栈,不需要过度担心。 工作和人际关系是两回事。有一些公司,我交到了好朋友,但是工作得并不开心;另一些公司,我没有与任何同事建立友谊,但是工作得很开心。 我总是对经理实话实说。怕什么?他开除我?我会在两周内找到一份新工作。 如果一家公司的工程师超过 100 人,它的期权可能在未来十年内变得很有价值。对于工程师人数很少的公司,期权一般都是毫无价值。 好的代码是初级工程师可以理解的代码。伟大的代码可以被第一年的 CS 专业的新生理解。 作为一名工程师,最被低估的技能是记录。说真的,如果有人可以教我怎么写文档,我会付钱,也许是 1000 美元。 网上....

Google 翻译退出中国大陆,原因竟然是因为...

不知道大家最近有没有发现,谷歌翻译突然用不了了,阿粉查询了一下,原因是谷歌翻译退出了中国大陆,然而退出中国大陆的原因你绝对想不到,竟然是因为使用率太低! 看到这个原因有很多网友表示震惊了,表示自己一直用谷歌翻译,每天都用,怎么就使用率太低了,不能访问的太突然了。现在打开谷歌翻译国内域名https://translate.google.cn/ 会显示下面的页面,变成一个普通的搜索框,点击过后会进入谷歌翻译香港地址。当然香港地址在国内也还是没有办法正常访问的。 早在 2010年,谷歌这家科技巨头就已经退出中国市场,仅保留谷歌翻译与谷歌地图两款服务。但是在2020年2月,谷歌地图在中国大陆停止服务,如今,最后一项服务也暂停在中国的服务。 对于程序员来说,使用的最多的翻译应该就是谷歌翻译,谷歌翻译的准确性相对于国内的一些翻译软件要好很多,这也是为什么大家会使用的原因,谷歌翻译是一项免费的服务,支持翻译的语言多达133种。 这款翻译工具使用传统计机器翻译,会在翻译的过程中在经过人工翻译的文档中进行大量检索与推测,从而得出最合适的翻译结果,因此受到很多用户的喜爱,特殊被程序员钟爱。 所以当阿粉发现....

消息队列堆积太多,下游处理不过来怎么办?

作为后端程序员日常工作中难免会遇到要跟消息队列打交道的时候,而且在当下微服务的场景下,很多服务的性能不是我们自己能控制的,这不阿粉最近就遇到了一个场景,由于上游服务流量增加,发送到消息队列的消息增多,阿粉在处理消息的时候需要依赖下游的一个服务,可是谁想到下游的服务效率太差,消息太多处理不过来,CPU 居高不下。 看过我们昨天文章的小伙伴应该都知道,这个时候我们就需要进行限流了,为了避免将下游的服务打垮,我们来进行单机限流操作。这里我们来模拟一下操作过程,首先我们通过一段伪代码来模拟大流量,然后通过配置 sentinel 的控制台来配置规则从而实现单机 QPS 20 的限制。 创建 SpringBoot 服务 首先我们创建一个 SpringBoot 服务,在 pom.xml 文件中增加下面的配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </depende....

15 行 Java 代码实现一个标准输出的进度条,其中的知识点你知道但并不一定会用

最近阿粉在折腾一台服务器,折腾的过程中往往会需要安装很多依赖软件,有的是在官网下载压缩包,有的是通过系统命令直接安装,在通过系统命令直接安装的时候,就会有类似下面的进度条出现。 进度条在我们日常使用的软件中已经很频繁了,不过除了安装软件一般都是在网页中看到,看到这个阿粉就想知道,那如何在标准输出中实现一个进度条呢? 光有想法是不行,接下来我们就开始实践一下,通过 Java 代码在标准输出中实现一个类似的进度条。 首先我们看到一个进度条是从 0 加载到 100 的一个过程,实现进度条我们需要一个最终的状态,然后逐渐从到有变化形成,所以我们要有一个百分比显示,其次我们要有两种不一样的样式变化。我们可以通过先展示一种符合为百分百,然后不断通过替换新的符合,产生一种变化的效果,这里我们采用下面这两种符号来表示 char incomplete = '░'; // U+2591 Unicode Character 表示还没有完成的部分 char complete = '█'; // U+2588 Unicode Character 表示已经完成的部分 通过用完成的符号不断的替换未完成的符号,形成.....

程序员如何打造一款适合自己的终端工具?Oh My Zsh YYDS!

作为后端程序员日常工作中使用最多的工具除了 IDEA 之外,那一定是 Linux 终端工具了,页面上终端工具有很多,比如 SecureCRT,Putty,Xshell 或者 macOS 自带的终端工具或者 iTerm 等等,其中有收费的也有免费,大家可以根据自己的喜好选择合适的一款就好,但是不管选择哪个工具,最终都是用来链接 Linux 系统的,如果想要用的顺手,我们还必须对其进行设置。 阿粉使用的终端是 macOS 系统的 iTerm,接下来就跟 iTerm 给大家演示如何设置终端,默认的终端是下面这样,不得不说,太难看了. 首先我们进行 zsh 的安装,通过命令yum install zsh 安装 zsh,如果是直接使用 macOS 可以使用命令brew install zsh 进行安装。 安装 zsh 完成过后,我们还需要给 zsh 做一个增强,接下来我们需要使用命令chsh -s $(which zsh) 切换 shell 类型,如下,不用关心下面的警告,必现没有报错。 接下来是最重要的部分,我们需要安装 Oh My Zsh 了,通过执行下面的这个命令,从 github 中下载....

Java 中经常被提到的 SPI 到底是什么?

Java 程序员在日常工作中经常会听到 SPI,而且很多框架都使用了 SPI 的技术,那么问题来了,到底什么是 SPI 呢?今天阿粉就带大家好好了解一下 SPI。 SPI 概念 SPI 全称是 Service Provider Interface,是一种 JDK 内置的动态加载实现扩展点的机制,通过 SPI 技术我们可以动态获取接口的实现类,不用自己来创建。 这里提到了接口和实现类,那么 SPI 技术上具体有哪些技术细节呢? 接口:需要有一个功能接口; 实现类:接口只是规范,具体的执行需要有实现类才行,所以不可缺少的需要有实现类; 配置文件:要实现 SPI 机制,必须有一个与接口同名的文件存放于类路径下面的 META-INF/services 文件夹中,并且文件中的每一行的内容都是一个实现类的全路径; 类加载器 ServiceLoader:JDK 内置的一个类加载器,用于加载配置文件中的实现类; 举个栗子 上面说了 SPI 的几个概念,接下来阿粉就通过一个栗子来带大家感受一下具体的用法。 第一步 创建一个接口,这里我们创建一个解压缩的接口,其中定义了压缩和解压的两个方法。 packag....

用了那么久的 Java For 循环,你知道哪种方式效率最高吗?

作为程序员每天除了写很多 if else 之外,写的最多的也包含 for 循环了,都知道我们 Java 中常用的 for 循环有两种方式,一种是使用 for loop,另一种是使用 foreach,那如果问你,这两种方式哪一种效率最高,你的回答是什么呢?今天阿粉就来带你看一下。 首先我们先通过代码来实际测试一下,在计算耗时之前我们先创建一个大小集合,然后通过不断的获取集合中的内容来测试耗时。 package com.example.demo; import java.util.ArrayList; import java.util.List; /** * <br> * <b>Function:</b><br> * <b>Author:</b>@author ziyou<br> * <b>Date:</b>2022-06-26 12:22<br> * <b>Desc:</b>无<br> */ public class ForTest ....

Java 极客技术的第 800 篇原创,想跟你分享一下我们的成长历程

Hello,大家好,这是我们公号「Java 极客技术」的第 800 篇原创,作为圈内分享技术的公众号我们的原创数量不说最多,但也绝对不少。这一路走来团队里面的每个小伙伴都在努力,大家基本上都是从 2019 年开始一路坚持下来的,这三年多的时间风雨无阻,砥砺前行。 公号的由来 早期的小伙伴应该都知道我们 【Java 极客技术】公众号是由【纯洁的微笑】微笑哥在 2019 年发起的一起搞事情创立起来的,早期的成员还包括【沉默王二】的二哥,【江南一点雨】的松哥,都是圈内有名的大佬。 一起搞事情活动是微笑哥发起的项目,简单来说在网上组织几个志同道合的人一起运营项目,运营项目的收益大家根据多劳多得的准则自行分成,就比如说我们的公众号【 Java 极客技术】是最早第一期搞事情的项目,现在以鸭血粉丝的形象在独立运营,带来的收益其实是有几个人一起分成的。 比如上面就是我们公众号去年某个月的分成数据,可以看到基本上每个月都可以有 1-2k 额外收入,当然并不是每个月都会是这样,根据行情以及公号的运营情况而定。另外搞事情这个活动不单单是运营公众号,还有很多其他活动比如说闲鱼,抖音,B 站,知乎等等,找到最适....