未读代码
Java 教程
Java 基础
Java 高级
Java I/O
Java 新特性
Java 进阶
Java 性能分析
开源工具库
Java 开发
Web 开发
Spring Boot 教程
授权认证
编译打包
Java Web 开发基础
数据库
内容搜索
2000 Star,是时候为我的开源项目更新下功能了
# 更新原因
# 功能更新
# 壁纸详情
# 壁纸搜索功能
# 自适应的全屏显示
# 日期翻页浏览
# 夜间模式
# 登录收藏功能
Java 断言 Assert 使用教程与最佳实践
# Java Assert 简介
# 启用和禁用断言
# Java 中使用断言
# 方式1
# 方式2
# Assert 最佳实践
# 适用场景
# 不适用场景
# Assert 进阶用法
# 编译阶段消除断言
# 强制启用断言
# 替代开源库
# 参考
使用 Maven Wrapper 构建项目
# Maven Wrapper 是什么
# Maven Wrapper 使用场景
# Maven Wrapper 使用方式
# 自动生成
# 手动复制
# 手动配置
# Maven Wrapper 总结
微信公众号扫码登录原理和实现
# 引言
# 公众号扫码登录优势
# 公众号扫码登录实现原理
# 开发准备工作
# 公众号
# 开发者文档
# 网站服务端
# 具体开发
# 配置微信公众号
# 项目总体结构
# 项目公众号信息配置
# 验证签名
# 获取 Access Token
# 生成登录二维码
# 扫码回调与身份绑定
# 浏览器轮询扫描状态
# 扫码登录测试
GitHub WebHook 使用教程
# 什么是 WebHook
# WebHook 配置
# 访问
# 配置
# Ping 测试
# WebHook 消息验证
# Java 验证 WebHook
# WebHook 最佳实践
JSON Web Token 入门教程
# 传统认证方式的问题
# JWT 是什么
# JWT 应用场景
# JWT 组成结构
# 标头 Header
# 负载 Payload
# 签名 Signature
# JWT 身份认证
# JWT 的特点
# JWT 最佳实践
Jpackage-制作无需预装Java环境的Jar可执行程序
# 什么是 jar
# jar 命令
# jpackage 命令
# jpackage 创建可执行文件
# Windows 平台
# Mac 平台
# Linux 平台
# 总结
# 参考
Java Arrays 教程
# 打印数组
# 复制数组
# 填充数组
# 数组比较
# Arrays.equals
# Arrays.hashCode
# 数组排序
# 二分查找
# 数组转 Stream
# 数组转换
# 并行前缀计算
# 总结
Spring Boot 整合 SQLite 和 JPA
# 为什么选择 SQLite
# 为什么 选择 JPA
# 创建 Spring Boot 项目
# 配置 SQLite & JPA
# 配置实体映射
# 编写 JPA 查询方法
# 编写 Controller
# 启动测试
# 请求初始化接口
# 请求查询用户接口
# 请求登录接口
# SQLite 3 数据审查
SQLite 入门教程
# SQLite 安装
# SQLite 使用场景
# SQLite3 命令操作
# SQLite 新建数据库
# SQLite 查看当前数据库
# SQLite 数据类型
# SQLite 增删改查
# SQLite 更改输出格式
# 查询 Schema
# 结果写出到文件
# 读取运行 SQL 脚本
# SQLite 备份与恢复
# SQLite 可视化工具
# 附录
# 参考
Java 中如何删除文件
# Files.delete
# Files.deleteIfExists ⭐️
# Files.delete
# FileUtils.forceDelete
Java 追加内容到文件
# 追加单行内容
# Files.writeString ⭐️
# Files.write ⭐️
# FileWriter.write
# BufferedWriter
# FileOutputStream
# 追加多行内容
# Files.write ⭐️
# BufferedWriter
# 第三方库
# Apache Commons
# Google Guava
Java 读取文件
# Files.readAllLines ⭐️
# Files.readAllBytes ⭐️
# Files.lines ⭐️
# Files.readString
# BufferedReader
# BufferedInputStream
# Scanner
# Apache Commons IO
Java 创建和写入文件
# Files.write ⭐️
# Files.writeString
# BufferedWriter
Java I/O 教程
# Java 文件操作
Java 中使用 List
# 为什么使用 List
# List 的概念
# List 常用方法
# 创建 List
# 添加元素
# 获取元素
# 修改元素
# 删除元素
# 判断元素是否存在
# 获取List的大小
# 遍历 List
# 排序 List
# List 常用转换
# List 与 数组
# List 与 Map
# List 实现类
# ArrayList
# LinkedList
# Vector
# CopyOnWriteArrayList
# List 注意事项
# 线程安全问题
# 空指针异常
# ConcurrentModificationException
# 元素的顺序
# List 常见问题
# List 与Set的区别
# List与数组的区别
# List 总结
Java 21 新功能介绍 (LTS)
# JEP 444. 虚拟线程 ⭐️
# 引入虚拟线程原因
# 虚拟线程的使用
# 创建提交执行虚拟线程
# 设置虚拟线程名称
# 启动为虚拟线程
# 判断是否是虚拟线程
# JEP 431. 有序集合
# JDK 21 之前有序集合操作
# JDK 21 有序集合操作
# JEP 430. 字符串模版(预览)
# Java 21 之前
# Java 21 字符串模版
# JEP 440. Record 模式
# JEP 441. switch模式匹配
# JEP 445. 未命名的类和main方法(预览)
# JEP 443. 未命名模式和变量(预览)
# 其他更新
# JEP 442. 外部函数和内存 API(三次预览)
# JEP 448. Vector API(六次孵化)
# JEP 446. 作用域值
# JEP 449. 弃用 windows 32 位 x86 端口
# JEP453. Structured Concurrency (预览)
# JEP 439. ZGC
# JEP 451. 准备禁止动态加载代理程序
# JEP 452. Key Encapsulation Mechanism API
如何破解滑动验证码?
# 什么是验证码
# 自动破解验证码
# 图片滑动验证码
# 具体案例分析
# 访问网站
# 获取验证码
# 验证码校验
# 信息返回
# 图片滑动验证码破解
# 验证码图片分析
# 灰度图片
# 图片二值化
# 滑动距离计算
# 总结
Java 注释
# 为什么要写注释?
# Java 单行注释
# Java 多行注释
# Java 文档注释
# Javadoc 命令构建文档
# IntelliJ IDEA 生成 Java 文档
# Java 注释建议
抽象类和接口的区别
# 抽象类和接口的区别
# 抽象类和接口如何选择
使用 JCommander 解析命令行参数
# jcommander 引入
# jcommander 参数绑定
# 参数名称
# 参数限制
# 帮助信息
# 参数排序
# 参数绑定完整测试
# jcommander 参数验证
# jcommander 子命令
# 什么是子命令
# jcommander 子命令实现
# jcommander 参数转换
# 总体测试
ProcessBuilder API 使用教程
# ProcessBuilder 介绍
# ProcessBuilder 入门示例
# ProcessBuilder 环境变量
# ProcessBuilder 工作目录
# ProcessBuilder I/O
# 输出到文件
# 输出到当前进程
# ProcessBuilder 管道操作
# ProcessBuilder 超时与终止
# ProcessBuilder 异步处理
# ProcessBuilder 总结
ProtoBuf 教程
# Protobuf 介绍
# 编写 Protobuf
# 头部全局定义
# 消息结构具体定义
# 字段类型定义
# 编译 Protobuf
# 使用 Protobuf
# 构造消息对象
# 序列化、反序列化
# Protobuf 为什么高效
# 序列化大小对比
# 序列化速度对比
# 为什么高效?
# 总结
Java 20 新功能介绍
# Java 20 安装
# JEP 429: Scoped Value
# 例子
# 使用 ScopedValue
# JEP 432: Record 模式匹配(二次预览)
# JEP 432 例子
# JEP 433: switch 模式匹配(四次预览)
# JEP 434: 外部函数和内存 API(二次预览)
# JEP 436: 虚拟线程(二次预览)
# JEP 437: Structured Concurrency(二次孵化)
# JEP 438: Vector API(五次孵化)
Java 集合框架
# Collection
# Map
# 添加元素 & 打印集合
# 迭代器 Iterator
# 类型推断
# 总结
Java 枚举
# 什么是枚举
# 定义枚举类型
# 使用枚举类型
# 比较
# 遍历
# 查询
# 枚举类型的方法
# 枚举高级用法
# 枚举实现接口
# 枚举重载方法
# 枚举抽象方法
Java 异常处理
# 什么是异常
# Java 异常
# Java 异常示例 - 空指针
# Java 异常示例 - 数组越界
# Java 异常分类
# 非受检异常
# 受检异常
# Java 捕捉异常
# 捕获指定异常
# 打印看懂异常信息
# 捕获多个异常
# 捕获所有异常
# Java 处理异常
# Finally 处理
# 资源初始化与关闭
# 自定义异常
# 附录:常见 Java 异常
Java 日期时间 Date
# 时间创建
# SimpleDateFormat 时间格式化
# 字符串转时间
# 日期比较
# 日期加减
# Calendar 操作
# 时间戳操作
# 耗时统计
Java Scanner
# Scanner
# Scanner 类型
# Scanner 读取文件
# Scanner 分隔符
Java 抽象类
# 抽象方法
# 抽象类
# 继承抽象类
# 抽象类不能实例化
# 多态
# 抽象类总结
Java 多态
# 什么是多态
# 多态的实现方式
# 继承实现多态
# 接口实现多态
# 多态的特点
# 多态的优点
# 为什么要用多态
Java 接口
# 什么是接口
# 为什么需要接口
# Java 接口定义和特点
# 接口特点
# Java 接口实现
# 单接口实现
# 多态实现
# 多接口实现
# 接口继承接口
# 空接口
# Java 接口实现特点
# 接口和类和抽象类区别
Java 继承
# 继承是什么
# 为什么要继承
# 继承相关概念
# Java 的继承
# Java 继承的特点
# 单继承
# 子类权限
# 方法重写
# 多重继承
# 子类和基类有相同类型
# Java 继承多个
# Java 继承的优点
# Java 继承的缺点
# is-a 和 is-like -a
Java StringBuilder
# StringBuilder 实现原理
# StringBuilder 构造方法
# StringBuilder重要方法
# append
# insert
# delete
# replace
# reverse
# StringBuilder 注意事项
Java 多维数组
# 多维数组
# 多维数组创建
# 多维数组访问
# 三维数组
# 多维数组的 clone
# 交错(Jagged)数组
# 交错(Jagged)数组创建
# 交错(Jagged)数组访问
# 交错(Jagged)数组优点
Java Array 数组
# Array 特点
# Array 创建
# Array 访问
# Array 复制
# Cloneable
# System.arraycopy
# Arrays.copyOfRange
# Array 操作
# 常见问题
Java String 字符串
# Java String
# Java String 不可变
# Java String 方法
# Java String 接口
# Comparable
# CharSequence
# Java String 内存分配
# String 常见问题
Java 流程控制
# 条件语句
# if
# if-else
# if-else-if
# switch
# 跳转语句
# break
# continue
# return
# 循环语句
# for
# while
# do-while
# FOR 的多种写法
# 基本 for 循环
# 增强 for 循环
# 无限 for 循环
Java 数据类型
# 基本数据类型
# 默认值
# String
# 引用数据类型
JDK、JRE、JVM 的区别
# JDK
# JRE
# JVM
# 总结
# 其他资料
JFR 使用教程
# JFR 启动记录
# JFR 分析内存
# JFR 分析CPU
# JFR 分析网络
# JFR 分析 IO
JMC 使用教程
# JMC 介绍
# JMC 测试环境准备
# 测试代码准备
# JMC 概览
# JMC 触发器
# JMC 分析内存
# JMC 分析CPU
# JMC 分析死锁
你好 ChatGPT, 帮我看下这段代码有什么问题?
# 前言
# 问题分析
# 问题复现
# 问题原因
# 问题解决
# ChatGPT 分析
# ChatGPT 分析代码
# ChatGPT 实现功能
# 总结
# 附录:ChatGPT 写代码测试
# 问1
# 问2
# 问3
Java 开发工具
# 💬 消息中间件
如何搭建一个自己的音乐服务器
# 树莓派启动
# 安装 Docker
# 安装音乐服务器
# 音乐上传
# 启动音乐服务器
# 浏览器访问
# 使用 APP 访问
# 外网访问
JUnit 5 单元测试教程
# JUnit 5 介绍
# JUnit 5 和 JUnit
# JUnit 5 基本组件
# JUnit 5 依赖
# JUnit 5 常用注解
# @Test
# @BeforeAll
# @BeforeEach
# @AfterAll
# @AfterEach
# @Disabled
# @DisplayName
# @ParameterizedTest
# @Order
# 其他注解
# JUnit 5 常用断言
# Maven JUnit 测试
使用 StringUtils.split 的坑
# StringUtils.split 的坑
# StringUtils.split 源码分析
# 如何解决?
Java 19 新功能介绍
# JEP 405: Record 模式匹配(预览)
# JEP 425: 虚拟线程 (预览)
# 引入的原因
# 虚拟线程
# JEP 427: switch 模式匹配 (三次预览)
# JEP 422: Linux/RISC-V Port
# JEP 424: 外部函数 & 内存 API (预览)
# 其他更新
Apache HttpClient 5 使用详细教程
# HttpClient 5 依赖
# HttpClient 5 Maven 依赖
# HttpClient 5 Gradle 依赖
# HttpClient 5 GET 请求
# HttpClient 5 Fluent GET
# HttpClient5 GET 请求参数
# HttpClient 5 POST 请求
# HttpClient 5 Fluent POST
# HttpClient5 POST JSON 参数
# HttpClient 5 设置超时
# HttpClient 5 异步请求
# HttpClient 5 获取 Cookie
# HttpClient 5 读取文件内容请求
# HttpClient 5 表单登录
# HttpClient 5 Basic Authorization
# HttpClient 5 Digest Authorization
# HttpClient 5 拦截器
Jackson 解析 JSON 详细教程
# JSON 介绍
# Jackson 介绍
# Jackson Maven 依赖
# ObjectMapper 对象映射器
# Jackson JSON 基本操作
# Jackson JSON 序列化
# Jackson JSON 反序列化
# JSON 转 List
# JSON 转 Map
# Jackson 忽略字段
# Jackson 日期格式化
# Date 类型
# LocalDateTime 类型
# 时间格式化
# Jackson 常用注解
# @JsonIgnore
# @JsonGetter
# @JsonSetter
# @JsonAnySetter
# @JsonAnyGetter
# Jackson 总结
必应壁纸,我的第一个 400 Star 开源项目
# 起因
# 开发
# 现状
# 优化
# 抓取方式
# 展示效果
Java 中的对象池实现
# 1. 什么是对象池
# 2. 为什么需要对象池
# 3. 对象池的实现
# 4. 开源的对象池工具
# 5. JedisPool 对象池实现分析
# 6. 对象池总结
Java 8 Lambda 和 Comparator 排序
# 1. Comparator 排序
# 2. Lambda 和 Comparator 排序
# 3. 排序反转
# 4. Lambda 和 Comparator 和 Stream 排序
Java 18 新功能介绍
# JEP 400:默认 UTF-8 字符编码
# JEP 408:简单的 Web服务器
# JEP 413:Javadoc 中支持代码片段
# 高亮代码片段
# 正则高亮代码片段
# 替换代码片段
# 附:Javadoc 生成方式
# JEP 416:使用方法句柄重新实现反射核心功能
# JEP 417:Vector API(三次孵化)
# JEP 418:互联网地址解析 SPI
# JEP 419:Foreign Function & Memory API (第二次孵化)
# JEP 420:switch 表达式(二次预览)
# JEP 421:弃用删除相关
# 参考
5种限流算法,7种限流方式,挡住突发流量?
# 前言
# 1. 限流
# 2. 固定窗口算法
# 2.1. 代码实现
# 3. 滑动窗口算法
# 3.1. 代码实现
# 4. 滑动日志算法
# 4.1. 代码实现
# 5. 漏桶算法
# 6. 令牌桶算法
# 6.1. 代码实现
# 6.2. 思考
# 7. Redis 分布式限流
# 7.1. 固定窗口限流
# 7.3. 滑动窗口限流
# 8. 总结
# 参考
Java 中拼接 String 的 N 种方式
# 1. 前言
# 2. 问题复现
# 3. 使用 + 运算符
# 4. 使用 String.concat()
# 5. 使用 StringBuilder
# 6. 使用 StringJoiner 类 (Java 8+)
# 7. 使用 Streams.filter (Java 8+)
# 8. 总结
字符作画,我用字符画个冰墩墩
# 1. 字符图案思路
# 2. 图片的缩放
# 2.1. java.awt.Graphics2D
# 2.2. Image.getScaledInstance
# 3. RGB 灰度计算
# 4. 输出字符图片
# 5. 其他字符图片
# 参考
Java 开发相关文章
# Java 开发
# 工具技巧
# 消息中间件
Java 中的5个代码性能提升技巧,最高提升近10倍
# 预先分配 HashMap 的大小
# 优化 HashMap 的 key
# 不使用 Enum.values() 遍历
# 使用 Enum 代替 String 常量
# 使用高版本 JDK
5 分钟复现 log4J 漏洞,手把手实现
# 0x01. 漏洞情况
# 0x02. 安全建议
# 0x03. 漏洞复现
# 3.1. 环境模拟 - 受害者小白服务
# 3.2. 环境模拟 - 攻击者服务
# 3.3. 测试
JMX 监控和管理 Java 程序
# 1. JMX 是什么?
# 2. 为什么使用 JMX 技术?
# 3. JMX 的技术架构
# 3.1. 资源管理 MBean
# 3.2. 资源代理 MBean Server
# 3.3. JMX 远程管理
# 4. JMX 的具体使用
# 4.1. 编写资源管理 MBean
# 4.2. 注册资源到 MBean Server
# 4.3. 远程管理 jconsole
# 参考
Java 中的监控与管理原理概述
# Java SE 监控管理功能
# Java 监控和管理 API
# Java 虚拟机监测
# Java 管理扩展技术(JMX)
# Java 监控和管理的工具
Java 性能分析与优化导读
# Java 性能监控开源工具
# Arthas - 性能分析利器
# Java 中的管理监控功能
# Java 中的管理监控概述
# JMX
# Java 性能监控和管理工具
# JMC(Java Mission Control)
# JFR(Java Flight Recorder)
# Jconsole
# JVisualVM
# Java 性能分析命令工具
# jmap(内存分析)
# jhat
# jstack(堆栈分析)
# jstat(GC)
# jinfo
# jcmd
# JMH 性能基准测试
Java 17 新功能介绍(LTS)
# 1. JEP 306: 恢复始终严格的浮点语义
# 2. JEP 356:增强的伪随机数生成器
# 3. JEP 382:使用新的 macOS 渲染库
# 4. JEP 391:支持 macOS/AArch64 架构
# 5. JEP 398:删除已弃用的 Applet API
# 6. JEP 403:更强的 JDK 内部封装
# 7. JEP 406:switch 的类型匹配(预览)
# 8. JEP 407:移除 RMI Activation
# 9. JEP 409:密封类(Sealed Classes)
# 10. JEP 401:移除实验性的 AOT 和 JIT 编译器
# 11. JEP 411:弃用 Security Manager
# 12. JEP 412:外部函数和内存 API (孵化)
# 13. JEP 414:Vector API(二次孵化)
# 14. JEP 415:指定上下文的反序列化过滤器
# 14.1. 反序列化示例
# 14.2. 反序列化过滤器
# 参考
Java 16 新功能介绍
# 1. JEP 347: 启用 C++ 14 语言特性
# 2. JEP 357:从 Mercurial 迁移到 Git
# 3. JEP 369:迁移到 GitHub
# 4. JEP 376:ZGC 并发线程堆栈处理
# 5. JEP 380:Unix 域套接字通道
# 6. JEP 386:移植 Alpine Linux
# 7. JEP 387:更好的 Metaspace
# 8. JEP 388:移植 Windows/AArch64
# 9. JEP 389:外部连接器 API(孵化)
# 10. JEP 390:基于值的类的警告
# 11. JEP 392:打包工具
# 12. JEP 393:外部内存访问(第三次孵化)
# 13. JEP 394:instanceof 模式匹配
# 14. JEP 395:Records
# 15. JEP 396:默认强封装JDK内部
# 16. JEP 397:Sealed Classes(密封类)预览
# 参考
Java 15 新功能介绍
# 1. JEP 339 爱德华曲线算法(EdDSA)
# 2. JEP 360:Sealed Classes(密封类)预览
# 3. JEP 371:Hidden Classes(隐藏类)
# 4. JEP 372:移除 Nashorn JavaScript 引擎
# 5. JEP 373:重新实现 DatagramSocket API
# 6. JEP 374:禁用和废弃偏向锁(Biased Locking)
# 7. JEP 375:instanceof 类型匹配 (二次预览)
# 8. JEP 377:ZGC: 可扩展低延迟垃圾收集器(正式发布)
# 9. JEP 378: 文本块
# 10. JEP 379:Shenandoah: 低停顿时间的垃圾收集器
# 11. JEP 384:Records(二次预览)
# 其他更新
# 参考
Java HashMap 源码分析和原理
# 1. HashMap 的存储结构
# 2. HashMap 的 put()
# 3. HashMap 的 get()
# 4. HashMap 的 Hash 规则
# 5. HashMap 的初始化大小
# 6. HashMap 的扩容方式
# 7. HashMap 中的红黑树
# 8. 为啥容量都是2的幂?
# 9. 快速失败(fail—fast)
# 10. 线程安全的 Map
Java 14 新功能介绍
# 1. JEP 305:instanceof 类型判断(预览)
# 2. JEP 343:打包工具(孵化)
# 3. JEP 345: G1 支持 NUMA(非统一内存访问)
# 4. JEP 358:更有用的 NullPointerExceptions
# 5. JEP 359:Records (预览)
# 6. JEP 361:Switch 表达式 (标准)
# 7. JEP 368:文本块(二次预览)
# 其他更新
# 参考
Java 13 新功能介绍
# 1. JEP 350 动态 CDS 存档
# 2. JEP 351: ZGC,归还未使用的内存 (实验性)
# 3. JEP 353: 重新实现 Socket API
# 4. JEP 354: Switch 表达式 (二次预览)
# 5. JEP 355: 文本块 (预览)
# 参考
Java 8 UnaryOperator 函数接口
# 1. UnaryOperator
# 2. UnaryOperator.identity
# 3. UnaryOperator 作为参数
# 4. UnaryOperator 多个参数
# 参考
Java 8 BiPredicate 函数接口
# 1. BiPredicate <T, U>
# 2. BiPredicate And
# 3. BiPredicate 作为参数
# 参考
Java 8 BiFunction 函数接口
# 1. BiFunction
# 2. BiFunction 和 Function
# 3. 工厂模式
# 4. 扩展玩法
# 参考
Java 8 List 转 Map
# 1. Collectors.toMap
# 2. List 转 Map,冲突 Key
# 3. List 转 Map,指定 Map 类型
# 参考
Java 8 Supplier 函数接口
# 1. Supplier
# 2. 工厂模式
# 3. Supplier 扩展类
# 参考
Java 8 Consumer 函数接口
# 1. Consumer accept
# 2. Consumer andThen
# 3. Consumer forEach
# 4. Consumer 扩展
# 参考
Java 8 Predicate 函数接口
# 1. Predicate test
# 2. Predicate Stream filter
# 3. Predicate and
# 4. Predicate negate
# 5. Predicate or
# 6. Predicate 链式编程
# 7. Predicate 与对象
# 参考
Java 8 forEach 遍历
# 1. List forEach 遍历
# 2. Map forEach 遍历
# 3. Array forEach 遍历
# 4. forEachOrdered 有序遍历
# 5. forEach 和 Consumer
# 参考
Java 8 Function 函数接口
# 1. Function apply
# 2. Function andThen
# 3. List -> Map
# 4. List -> List<Other>
# 参考
Java 新特性教程
# Java 新特性文档
# Java 8 新特性系列
# 函数接口
Java 反编译工具的使用与对比分析
# 前言
# Procyon
# 使用 Procyon
# Procyon GUI
# CFR
# CFR 命令行使用
# CFR 代码中使用
# JD-Core
# 使用 JD-core
# JD-GUI
# Jadx
# Fernflower
# 反编译速度
# 语法支持和可读性
# Procyon
# CFR
# JD-Core
# Jadx
# Fernflower
# 总结
Java 中 RMI 的使用
# RMI 介绍
# RMI 工作原理
# RMI 开发
# RMI Server
# RMI Client
# RMI 测试
# serialVersionUID 的生成
# 参考
# 订阅
如何使用 Github Actions 自动抓取每日必应壁纸?
# 分析必应壁纸 API
# 必应壁纸爬虫
# Github Actions
# Github Actions 体验
# Github Actions 定时抓取必应壁纸
# 参考
# 订阅
Java 12 新特性介绍
# Switch 表达式 (JEP 325)
# 使用预览功能
# Java 12 Switch
# 文件对比 Files.mismatch
# Compact Number
# JVM 相关更新
# 其他更新
# 参考
# 订阅
三种骚操作绕过迭代器遍历时的数据修改异常
# 前言
# 异常原因
# 绕过方式一:40 多亿次循环绕过
# 绕过方式二:线程加对象锁绕过
# 绕过方式三:利用类型擦除放入魔法对象
# 订阅
2020 往日不可追,2021 来日犹可期
# 朋友圈
# 时光
# 春节
# 疫情
# 暖春
# 夏日
# 秋
# 冬日
# 2021
站内文章导航
# ⏳ Java 开发
# 😍 Java 基础教程
# Java 数组
# Java 面向对象
# Java 集合
# 代码测试
# 😃Java I/O 教程
# 🎉 Java 进阶教程
# 🌿 SpringBoot 2.x 教程
# ☕ Java 新特性
# 💻 Java 并发编程
# 🕹 Java 虚拟机
# 🔍 Java 性能分析
# 🔬 JDK 源码分析
# 认证授权
# 🧱 数据结构
# 🍔 数据库
# 🧰 工具技巧
# 💬 消息中间件
# 🗺 贡献与建议
# 公众号
# 联系我
Spring Boot 的多数据源配置
# 环境准备
# 数据准备
# 项目准备
# 多数据源
# 连接配置
# Mybatis 配置
# 多数据源配置
# 主数据源
# 第二个数据源
# 访问测试
# 连接池
量子革命?脑机接口?电子皮肤?我看了一次高质量科学大会
# 以人为本、科技向善
# 新量子革命
# 信息交互和隐私
# 第一次科学革命
# 计算能力和隐私保护
# 量子力学
# 脑机接口
# 最初设想
# 实验一:视觉
# 实验二:触觉
# 实验三:动作
# 实验四:人体
# 人造皮肤
# 最后
Java Guava 工具包使用教程
# 数据校验
# 非空判断
# 预期值判断
# 是否越界
# 不可变的集合
# 创建方式
# 注意事项
# 集合操作工厂
# 创建集合。
# 集合交集并集差集
# 有数量的集合
# 字符串操作
# 字符拼接
# 字符串分割
# 缓存
# 总结
# 订阅
「1024」专属序猿的快乐,惊奇迷惑代码大赏
# 还记得你的第一行代码?
# 这是高级语言
# 我是怎么解决异常的
# 获取明天当前时间
# 聊天机器人
# 据说很NB
# 网页编辑器
# 一行代码可以做什么?
CopyOnWriteArrayList 源码分析和原理
# 前言
# 线程安全 List
# CopyOnWriteArrayList
# 分析源码 ( JDK8 )
# 构造函数
# 新增元素
# 修改元素
# 删除元素
# 获取元素
# 迭代器的弱一致性
# 新版变化
# 总结
Java 7 Files,Paths,Path 文件操作介绍
# 文件路径
# 文件操作
# 文件属性
# 文件列表流
# 文件监视
JMH - Java 代码性能基准测试
# Java 性能测试难题
# JMH 介绍
# JMH 使用
# 快速测试
# 注解说明
# 结果分析
# 正确的微基准测试
# 无用代码消除 ( Dead Code Elimination )
# 常量折叠 (Constant Folding)
# 总结
ArrayList 和 LinkedList 源码分析和原理
# 前言
# 线性表
# 数组
# 链表
# ArratList
# ArrayList 存储结构
# ArrayList 扩容机制
# ArrayList 数据新增
# ArrayList 数据获取
# LinkedList
# LinkedList 存储结构
# LinkedList 数据获取
# LinkedList 数据新增
# LinkedList 数据删除
# 扩展
# 总结
Java 开发的编程噩梦,这些坑你没踩过算我输
# 随处可见的 Null 值
# 没有进行空值检查
# 忽略的异常处理
# 没有释放资源
# ConcuretModificationException
# 缺少注释
# 不进行代码测试
# 重复造轮子
# 缺少必要的沟通
# 没有代码规范
# 总结
撸了个多线程断点续传下载器,我从中学习到了这些知识
# 断点续传的原理
# 怎么保证文件的一致性?
# 多线程下载如何实现?
# 网速带宽固定,为什么多线程下载可以提速?
# 多线程断点续传代码实现
cURL 使用教程
# 1. 请求源码
# 2. 文件下载
# 3. Response Headers
# 4. 请求方式(GET/POST/...)
# 5. 请求参数
# 6. 文件上传
# 7. 网址通配
# 8. 使用 cookie
# 总结
一篇有趣的负载均衡算法实现
# 1. 随机访问
# 2. 轮询访问
# 3. 轮询加权
# 4. 随机加权
# 5. IP-Hash
# 6. 总结
Manjaro Linux 入门使用教程
# Manjaro 初体验
# 下载镜像
# 制作启动盘
# 安装 Manjaro
# 更换软件源
# 安装输入法
# 使用 zsh
# 安装常用软件
# 开发环境配置
# 字体渲染
# 可选操作
# 总结
ConcurrentHashMap 源码分析和原理
# 1. ConcurrentHashMap 1.7
# 1. 存储结构
# 2. 初始化
# 3. put
# 4. 扩容 rehash
# 5. get
# 2. ConcurrentHashMap 1.8
# 1. 存储结构
# 2. 初始化 initTable
# 3. put
# 4. get
# 3. 总结
Spring Boot 多模块开发教程
# 创建项目
# 模块化
# 依赖管理
# 处理依赖问题
# 优化依赖
# 打包编译
Java 11 新特性介绍
# 1. String API
# 2. File API
# 3. JEP 321 - HTTP Client
# 4. JEP 323 - Lambda 局部变量推断
# 5. JEP 330 - 单命令运行 Java
# 6. 免费的飞行记录器
# 其他更新
Java 10 新特性介绍
# 1. JEP 322 - 基于时间的版本号
# 2. JEP 286 - 局部类型推断
# 3. JEP 317 - 基于 Java 的 JIT 编译器(实验性)
# 4. JEP 310 - 类数据共享
# 5. JEP 307 - G1 并行全GC
# 6. JEP 314 - Unicode 语言标签扩展
# 7. API 更新
# 其他更新
Java 9 新特性介绍
# 1. 模块化
# 2. 集合工厂方法
# 3. Stream API
# 4. 接口私有方法
# 5. HTTP / 2 Client
# 6. Java REPL - JShell
# 7. 其他更新
Java 7 新特性介绍
# 前言
# Java 7 语言特性
# 1. switch String
# 1.1. switch String 基本用法
# 1.2. switch String 实现原理
# 2. try-with-resource
# 2.1. try-catch-finally
# 2.2. try-autocloseable
# 3. try-catch
# 4. 二进制
# 5. 数字下划线
# 6. 结束语
Spring Boot Admin 教程
# 1. Spring Boot Admin 是什么
# 2. Spring Boot Admin 服务端
# 2.1. 添加依赖
# 2.2. 启动配置
# 3. Spring Boot Admin 客户端
# 3.1 客户端依赖
# 3.2 客户端配置
# 3.3. 客户端运行
# 4. Spring Boot Admin 功能
# 5. Spring Boot Admin 进阶
# 5.1. 邮件通知
# 5.2 自定义通知
# 5.2. 访问限制
Async-Profiler - Java 火焰图性能分析工具
# async-profiler 介绍
# async-profiler 安装
# async-profiler 使用
# async-profiler 案例
# Java 案例编码
# CPU 性能分析
# Heap 内存分析
Spring Boot 使用 Swagger 文档
# 前言
# 1. OpenAPI 规范介绍
# 2. Swagger 介绍
# 3. Springfox 介绍
# 4. Springboot 整合 Swagger
# 4.1. 创建项目
# 4.2. 引入依赖
# 4.3. 配置 Springfox-swagger
# 4.4. 代码编写
# 4.5. 运行访问
# 4.7. 调用测试
# 5. 常见报错
# 参考文档
Java 8 Stream 流式操作
# 前言
# 1. Stream 流介绍
# 2. Stream 流概念
# 2.1. 数据源
# 2.2. 数据处理
# 2.3. 收集结果
# 2.4. short-circuiting
# 3. Stream 流使用
# 3.1. Stream 流获取
# 3.2. forEach
# 3.3. map / flatMap
# 3.4. filter
# 3.5. findFirst
# 3.6. collect / toArray
# 3.7. limit / skip
# 3.8. Statistics
# 3.9. groupingBy
# 3.10. partitioningBy
# 3.11. 进阶 - 自己生成 Stream 流
# 4. Stream 流优点
# 4.1. 简洁优雅
# 4.2. 惰性计算
# 4.3. 并行计算
# 5. Stream 流建议
# 5.1 保证正确排版
# 5.2 保证函数纯度
Java 8 Lambda 表达式介绍
# 1. 前言
# 2. Lambda 介绍
# 3. 函数接口介绍
# 3. Lambda 语法
# 4. Lambda 使用
# 4.1 对于函数接口
# 4.2 对于方法引用
# 4.3 对于遍历方式
# 4.4 对于流式操作
# 5. Lambda 总结
Arthas - Java 线上问题定位处理的终极利器
# 前言
# 1、Arthas 介绍
# 2、Arthas 使用场景
# 3、Arthas 怎么用
# 3.1 安装
# 3.2 运行
# 3.3 web console
# 3.4 常用命令
# 3.5 退出
# 4、Arthas 常用操作
# 4.1 全局监控
# 4.2 CPU 为什么起飞了
# 4.3 线程池线程状态
# 4.4 线程死锁
# 4.5 反编译
# 4.6 查看字段信息
# 4.7 查看方法信息
# 4.8 对变量的值很是好奇
# 4.9 程序有没有问题
# 4.9.1 运行较慢、耗时较长
# 4.9.2 统计方法耗时
# 4.10 想观察方法信息
# 4.10.1 观察方法的入参出参信息
# 4.10.2 观察方法的调用路径
# 4.10.3 方法调用时空隧道
# 4.5. 火焰图分析
# 4.5.1.使用案例
# 4.5.2. 复杂命令
Java 8 Optional 介绍
# 1. 前言
# 2. Optional 创建
# 3. Optional 判断
# 4. Optional 获取值
# 5. Optional 默认值
# 6. Optional 异常
# 7. Optional 函数接口
# 8. Optional 案例
# 9. Optional 总结
Spring Boot 编写自己的 Spring Boot starter
# 1. 前言
# 2. Springboot 官方模式
# 2.1. 引入依赖
# 2.2. 自动配置
# 3. 第三方集成模式
# 3.1 引入依赖
# 3.2 自动配置
# 4. 编写自己的 starter
# 4.1 创建启动器项目
# 4.2 创建自动配置项目
# 4.3 使用自定义的启动器
Java 热加载手动实现
# 1. 什么是热加载
# 2. 热加载与热部署的区别
# 3. 类加载五个阶段
# 4. 实现类的热加载
# 4.1 实现思路
# 4.2 自定义类加载器
# 4.3 定义要热加载的类
# 4.4 热加载获取类信息
# 4.5 热加载测试
Java 8 LocalDate、LocalDateTime 时间处理介绍
# 1. 时间处理类
# 2. 时间获取
# 3. 时间创建
# 4. 时间转换
# 5. 时间格式化
# 6. 时间比较
# 7. 时间加减
# 8. 时间扩展方法
# LocalDateTime 本月第一天
# LocalDateTime 本月最后一天
# LocalDateTime 最后一秒
# 是否闰年
Java IDEA 使用教程
# 1. 窗口切换 - 凌波微步
# 2. 项目切换 - 来而不往
# 3. 文件定位 - 来去自如
# 4. 代码定位 - 百步穿杨
# 5. 代码操作 - 出神入化
# 6. 惊世骇俗 - 深藏不露
# 6.1 集成插件
# 6.2 Rest Client
# 6.3 剪切板历史
# 6.4 JSON 格式化
# 6.5 演示模式
# 6.6 补全判断
Spring Boot 启用 HTTPS
# 1. 获取 HTTPS 证书
# 2. 配置 HTTPS 证书
# 3. 测试 HTTPS 证书
# 4. HTTP 跳转 HTTPS
# 附录
Spring Boot 使用邮件服务
# Springboot mail 依赖
# Springboot mail 配置
# Springboot mail 文本邮件
# Springboot mail HTML 邮件
# Springboot mail 附件邮件
# Springboot mail 图片邮件
# Springboot mail 模版邮件
# Springboot mail 补充
Spring Boot 使用 Mybatis 集成 pagehelper 分页插件和 mapper 插件
# 前言
# 数据库准备
# 引入依赖
# 增加配置
# 通用 Mapper
# 自动生成配置
# 自动生成代码
# 自动生成结果
# 通用 Mapper
# 单元测试和分页测试
Spring Boot 使用 Mybatis访问数据库
# 1. Springboot mybatis 介绍
# 2. Springboot mybatis 依赖
# 3. Springboot mybatis 配置
# 4. Springboot mybatis 编码
# 4.1. 数据库准备
# 4.2. 自动生成插件
# 4.3. 注解配置方式
# 5. Springboot mybatis 测试
Spring Boot 使用 Spring data jpa
# 前言
# 1. Spring data jpa 介绍
# 2. Spring data jpa 依赖
# 3. Spring data jpa 配置
# 4. Spring data jpa 编码
# 4.1. 数据实体类
# 4.2. JPA 操作接口
# 5. Spring data jpa 测试
Spring Boot 使用 Spring JDBC 和 Druid 数据源监控
# 前言
# 1. 数据库准备
# 2. 添加依赖
# 3. 配置数据源信息
# 4. 使用 Spring-JDBC
# 5. 使用 Druid 监控
Spring Boot 动态 Banner
# 1. 自定义 banner
# 2. ASCII 图案生成原理
# 3.自己实现图片转 ASCII字符
Spring Boot 异常处理
# 前言
# 1. SpringBoot 异常处理机制
# 1.1. errorAttributes
# 1.2. basicErrorControll
# 1.3. ererrorPageCustomizer
# 1.4. conventionErrorViewResolver
# 2. 自定义异常页面
# 3. 自定义错误JSON
# 4. 统一异常处理
Spring Boot 拦截器,AOP,监听器
# 1. 拦截器
# 1.1 引入依赖
# 1.2 编写拦截器
# 1.3 配置拦截器
# 2 切面编程
# 3. Servlet,Filter,Listener
# 3.1 编写 Servlet
# 3.2 编写 Filter
# 3.3 编写 Listener
# 3.4 添加到容器
Spring Boot Web 开发之静态资源和模版引擎
# 前言
# 自动配置原理?
# 1. JSON 格式转换
# 2. 静态资源映射
# 2.1 默认映射
# 2.2 webjars
# 3. 模版引擎
# 3.1 引入 Thymeleaf
# 3.2 使用 Thymeleaf
Spring Boot 日志框架
# 前言
# 1. 日志框架介绍
# 2. SLF4 的使用
# 3. 统一日志框架的使用
# 4. Spring Boot 的日志关系
# 4.1. 排除其他日志框架
# 4.2. 统一框架引入替换包
# 5. Spring Boot 的日志使用
# 5.1. 日志级别和格式
# 5.2 自定义日志输出
# 6. 替换日志框架
Spring Boot 自动配置
# 前言
# 1. @SpringBootApplication
# 2. @EnableAutoConfiguration
# 3. xxxAutoConfiguration 与 xxxProperties
# 4. 自动配置总结
# 5. 配置类
# 5.1 XML配置
# 5.2 注解配置
# 6. 附录
Spring Boot 配置文件
# 前言
# 1. YAML 文件
# 2. Properties 文件
# 3. 随机数与占位符
# 4. 配置的使用
# 4.1 ConfigurationProperties
# 4.2 Value
# 4.3 PropertySource
# 5. 多环境配置
# 5.1 properties 多环境
# 5.2 YAML 多环境
# 5.3 多环境激活方式
# 6. 配置文件加载顺序
# 7. 外部配置文件
Spring Boot 入门篇
# 前言
# 1. Spring Boot 介绍
# 2. Spring Boot 优点
# 3. Spring Boot 前置
# 4. Spring Boot 体验
# 5. Spring Boot 开发
# 5.1 依赖项
# 5.2 启动类
# 5.3 控制器
# 5.4 访问测试
# 6. Spring Boot 单元测试
# 6.1 模拟请求测试
# 6.2 Spring Boot 集成测试
如何使用 Lombok 进行优雅的编码
消息队列中间件(三)Kafka 入门指南
# Kafka 来源
# Kafka 介绍
# Kafka 基本概念
# 概念的延伸
# Kafka 消息结构
# Kafka 优点
# Kafka 应用
# Kafka 安装
# 安装 Jdk
# 安装 Kafka
# Kafka 工程实例
# POM 依赖
# 生产者
# 消费者
# 问题
消息队列中间件(二)使用 ActiveMQ
# ActiveMQ 介绍
# ActiveMQ 特点
# ActiveMQ 消息
# ActiveMQ 概念
# ActiveMQ 工程实例
# POM 依赖
# 队列模式消费者
# 队列模式生产者
# 发布订阅模式生产者
# 发布订阅模式生产者
# Spring 整合 ActiveMQ
# POM 依赖
# XML 配置
# XML 公共配置
# XML 消费者
# XML 生产者
# 生产者编写
# 消费者编写
# 运行测试
消息队列中间件(一)介绍
# 消息队列介绍
# 消息队列应用场景
# 应用解耦
# 异步处理
# 流量错峰
# 日志处理
# JMS消息服务
# JMS消息模式
# JMS编码接口
Ubuntu18 的超详细常用软件安装
# Gnome-Tweak-Tool
# N卡驱动异常
# 开机关机异常
# 安装N卡驱动
# 纸飞机Shadowsocks
# JDK环境变量
# IDEA图标
# Sublime Text 3
# 字体YaHeiConsolas
# SecureCRT
# mysql5.7
# 安装Mysql5.7
# 远程登录mysql
# 安装typora
# 邮件客户端
# 安装搜狗拼音输入法
# VLC播放器
# 点击任务栏图表最小化
# QQ TIM 迅雷
# wine程序图标放到顶部
# 登录页面背景
IO通信模型(三)多路复用IO
# 多路复用IO
# 缓冲区Buffer
# Buffer的基本用法
# Buffer的测试代码
# Buffer的读写模式
# 通道Channel
# 选择器Selector
# Java NIO编程
# 多路复用IO优缺点
IO通信模型(二)同步非阻塞模式NIO(NonBlocking IO)
# 同步非阻塞模式(NonBlocking IO)
# Java同步非阻塞模式
# Java同步非阻塞模式编码
# 同步非阻塞模式总结
IO通信模型(一)同步阻塞模式BIO(Blocking IO)
# 几个概念
# 同步阻塞模式(Blocking IO)
# Java同步阻塞模式
# Java同步阻塞模式编码
# 多线程客户端
# 单线程服务端
# 多线程服务端
# 同步阻塞模式总结
ElasticSearch(三)Head插件的安装与使用
# elasticsearch-head 介绍
# elasticsearch-head 下载
# elasticsearch-head 启动
# 方式1:使用nodejs启动
# 方式2:使用Tomcat启动
# 方式3:使用chrome扩展插件
Web笔记(五)Servlet 的生命周期
# 开发
# 配置
# 访问
# 总结
Web笔记(四)Servlet 程序开发
# Servlet 的编写
# Servlet 的web.xml配置
# Servlet 3.0的注解配置
# Servlet 的运行与访问
# Servlet 的初始化参数
# 编写Servlet
# 配置Servlet
# 测试Servlet
# Servlet 的开发总结
Web笔记(三)Servlet 的类与接口API
# Servlet 介绍
# Servlet API
# Servlet 接口
# ServletConfig 接口
# GenericServlet 接口
# HttpServlet 接口
# ServletRequest 和 ServletResponse 接口
# HttpServletRequest 和 HttpServletResponse 接口
# ServletContext 接口
# HttpSession 接口
# 附录:HttpServletRequest的请求信息获取
Web笔记(二)Tomcat 使用总结
# Tomcat 介绍
# Tomcat 安装
# Tomcat 的默认端口
# Tomcat 的虚拟目录配置
# 自动映射虚拟目录
# 修改server.xml 映射虚拟目录
# 在conf /Catalina /localhost 增加xml文件映射虚拟目录
# Tomcat 的虚拟主机
# Tomcat 的单例多实例配置
Jquery - 使用jquery-easing.js实现页面锚点平滑滚动
# 使用jquery-easing.js实现页面锚点平滑滚动
# 效果图
# HTML代码
# Anchor-animation.js代码
# jquery-easing.js代码
CSS - 使用CSS实现Mac窗口效果
# HTML代码
# CSS代码
# 最终效果
Web笔记(一) Web 简介与开发环境搭建
# Web应用程序的工作原理
# Web应用开发技术
# Web 服务器
# 安装与配置JDK
# 安装与启动Tomcat
# Eclipse中使用Tomcat
# web项目开发
# 创建web项目
# 部署web项目
# 访问web项目
Linux配置Tomcat的单机多实例
# Tomcat 下载
# 配置多实例模版
# 测试实例模版
# 增加一个实例
网络协议之HTTP
# HTTP的简介
# HTTP的特点
# HTTP的URL(UniformResourceLocator)
# HTTP的请求消息Request
# HTTP的响应消息Response
# HTTP的状态码
# HTTP的请求方法(动作)
# TCP的三次握手
# HTTP协议工作流程
# GET请求和POST请求的区别
在CentOS7下Nginx的简单使用
# Nginx
# Nginx简单配置 - 发布web目录
# Nginx简单配置 - 反向代理
# Nginx简单配置 - HTTPS
Linux 定时任务 crontab 教程
# crontab 介绍
# crontab 文件
# crontab 配置格式
# crontab 命令使用
# crontab 任务查看
# crontab 常用定时示例
ElasticSearch(二)深入搜索
# 数据准备
# 子条件查询
# Query context
# 全文本查询-模糊查询
# 全文本查询-短语查询
# 全文本查询-多字段查询
# 全文本查询-语法查询
# 字段级别查询-精确查询
# 字段级别查询-范围查询
# Filter context
# 复合条件查询
# 固定分数查询
# 组合或关系查询
# 组合与关系查询
# 组合非关系查询
ElasticSearch(一)数据的增删改查
# 索引创建
# 非结构化创建
# 结构化创建
# 查看索引信息
# 数据插入
# 根据文档ID插入
# 自动生成文档ID插入
# 数据修改
# 直接修改
# 脚本修改
# 删除
# 文档删除
# 索引删除
# 基本查询
# 数据准备
# 查询
# 全部查询
# 精确查询
# 限制查询条数
# 关键词排序查询
# 聚合查询
# 统计查询
# 参考资料
Solr7.3.0入门教程,部署Solr到Tomcat,配置Solr中文分词器
# solr 基本介绍
# solr 名称来源
# solr 历史
# 环境准备
# 部署Solr到Tomcat
# 复制Solr文件到Tomcat
# 配置Solr Home
# 关闭安全约束
# Tomcat启动访问
# 创建Solr Core
# 添加 Core 字段
# 在页面上添加
# 在配置文件中添加
# 添加/更新/查询数据
# 中文分词器的使用
# 参考资料
设计模式 -创建型模式之单例模式的五种实现
# 单例模式(Singleton)
# 单例模式 - 饿汉模式
# 单例模式 - 懒汉模式 - 普通
# 单例模式 - 懒汉模式 - 同步锁
# 单例模式 - 懒汉模式 - 双重校验锁
# 单例模式 - 懒汉模式 - 内部类
使用Apache Ant 进行Java web项目打包并部署至TOMCAT
# Apache Ant介绍
# 下载Apache Ant
# 安装Apache Ant
# 配置Apache Ant
# Apache Ant编译准备
# 编写用于编译的build.xml
# Build.xml文件的一些解释
# Apache Ant编译开始
使用Apache Ant 进行Java web项目打包并部署至TOMCAT
# Apache Ant介绍
# 下载Apache Ant
# 安装Apache Ant
# 配置Apache Ant
# Apache Ant编译准备
# 编写用于编译的build.xml
# Build.xml文件的一些解释
# Apache Ant编译开始
使用MyBatis Generator自动生成Model、Dao、Mapper相关代码
# MyBatis Generator?
# 工具准备
# 在当前目录下运行命令进行生成
# 查看生成的文件