Java
文章平均质量分 80
Java语言相关内容
Ch.yang
try{ coding } catch { bug }
展开
-
【Log4j2】log4j-users-guide 官方文档阅读笔记
原文Apache Log4j 官方文档 pdf需求将指定包目录的日志打到指定文件中将ERROR日志单独打到指定文件中目标理解 log4j2 的架构,理解并编写配置文件,完成需求。原创 2024-08-02 18:52:02 · 749 阅读 · 0 评论 -
【Java】pcm 与 wav 格式互转工具类 (附测试用例)
语音引擎只认 pcm 格式数据。前端只认 wav 格式 。需要后端对 pcm 和 wav 格式实现互转,特此编写工具类,并提供测试用例。原创 2024-06-23 18:21:50 · 408 阅读 · 0 评论 -
【Java】字节数组 pcm 与 wav 格式互转 (附原理概述)
最近实现了一个文字转语音的功能,语音引擎返回的是pcm格式的数据。需要转化成wav格式前端才能播放。本文首先会给出解决方案,后续会讲背后的原理。场景wav格式实际上就是在pcm数据上加了头部,让浏览器能够解析pcm数据,进而能播放音频。可以类比 TCP协议的报文头,报文头携带了数据长度、偏移量等元信息。原创 2024-06-22 14:08:45 · 759 阅读 · 0 评论 -
【Java】IdentityHashMap 的使用场景
最近有兴趣看一下 Druid 连接池怎么做连接管理的,看到一个类,这里记录一下使用场景。原创 2024-05-27 19:53:13 · 354 阅读 · 0 评论 -
【Spring】通过Spring收集自定义注解标识的方法
需求:用key找到对应的方法实现。使用注解的形式增量开发。任意时刻都能通过key来进行依赖查找@TestAssert.notNull(myBeanFactory.getMethod("key1"), "key1对应的方法不能为空");声明自己的类注解,并要求被 Spring 收集声明自己的方法注解,确保可以通过反射获取借 Spring 的能力,容器启动收集bean完成后,把bean列表交给自己,用于自己的收集策略。原创 2024-03-31 20:13:31 · 585 阅读 · 1 评论 -
【源码】hamcrest 源码阅读 定制 Matcher
官方文档官方示例:(打开后搜索 Writing custom matchers)需求按官方的规范拓展自己的 Matcher将自己的 Matcher 加入到现有的谓词用法里 (allOf 、anyOf 等)原创 2023-10-07 15:22:15 · 161 阅读 · 0 评论 -
【源码】hamcrest 源码阅读 空对象模式、模板方法模式的应用
hamcrest ,一个被多个测试框架依赖的包。听说 hamcrest 的源码质量很高,特此来学习一下。建议fork原仓库,拉到本地看代码。代码仓库hamcrest github 仓库。原创 2023-10-02 13:58:46 · 1218 阅读 · 0 评论 -
【Log】为类中的所有日志打印添加前缀
有没有一种办法,在一个类中(业务逻辑)。的时候自动加上日志前缀,这样子查日志更方便。stackoverflow 上面有对该问题的讨论,实测可用,这里记录一下。来自stackoverflow 简洁可用的方式。原创 2023-09-24 11:49:00 · 694 阅读 · 0 评论 -
【Mockito】@Mock 和 @MockBean 的区别与 @MockBean 的使用时机
由于历史原因,@Mock 和 @MockBean 都会出现在项目代码里,这里记录下具体的区别。并突出 @MockBean 在 Spring Boot 中的使用时机stackoverflow原文。原创 2023-07-03 22:38:45 · 2003 阅读 · 0 评论 -
【算法】笔记:LeetCode 206. 反转链表
这道题可以拆成几个小点去理解,本篇博文快速记录一下。有迭代和递归两种解法。迭代的解法空间复杂度更优秀,递归的思想更巧妙。这里主要总结下迭代的解法。并简要理解下递归的解法。LeetCode 206. 反转链表。原创 2023-03-04 14:46:02 · 651 阅读 · 0 评论 -
【Java】《Java8 实战》 CompletableFuture 学习
看 《Java8 实战》后,觉得自己对多线程应用还是停留在 JUC 工具类的使用上,忽略了 CompletableFuture 这么强大的工具。本文主要内容复习并行、并发的概念。多线程的编程模型CompletableFuture 让多线程编程更加清爽有时间的话,补充 CompletableFuture 的内部原理这个类是 Java 8 引入的,用于解决FutrueFutrue 任务之间的依赖关系很难表达等待Futrue集合中的所有任务都完成应对Future的完成事件。原创 2023-02-19 19:59:51 · 1051 阅读 · 0 评论 -
【Java】使用 Optional 让代码变得更清爽
今天看 《Java8 实战》 发现了 Optional 可以用来改善工作中的代码质量。本文用于巩固 Optional 的 api 积累及理解,并尝试多多应用于生产中。// 模拟VO Insurance insurance = new Insurance();// 模拟字段的数据源,通常是为了节省数据库IO, 由全量数据转化成的 key-value HashMap < String , String > properties = new HashMap < >();原创 2023-02-15 23:35:27 · 272 阅读 · 0 评论 -
【Spring】Spring @Cacheable 官方学习及demo
Spring 有很多声明式的编程风格,@Transactional 是,@Cacheable 也是。说起 @Transactional,复杂的事务情况下,这个注解也有局限,需要用到编程式的事务完成需求。同样地,@Cacheable 也是适合简单的缓存场景。原创 2022-12-29 22:25:47 · 568 阅读 · 0 评论 -
【Java】 String.split 归纳
jdk的注释已经写的很明白了,本文只是在此基础上再归纳一下。重点是归纳下第二个参数的用法。原创 2022-08-07 21:10:59 · 175 阅读 · 0 评论 -
【著作阅读笔记】《代码整洁之道》对Sql类的重构引发的思考
代码整洁之道》第十章,类。教我们去识别能支持拓展的代码是怎样的,跟设计模式是有交集的,包括单一原则,开闭原则。借书中的代码和阐述,记录下对原则的认识,及识别高内聚、可拓展的代码。...原创 2022-08-07 16:38:02 · 172 阅读 · 0 评论 -
【Java】Java8特性官网学习之Stream的前世今生
前言最近看了《数据密集型应用系统设计》,间断介绍了命令式语言和声明式语言的区别介绍了UNIX的 设计哲学MapReduce编程框架数据流引擎函数运算符(函数式编程)能发现Java8 Stream的语法都有上述内容的影子,本文旨在了解了流式编程技术发展和迭代关系,把零散的信息整合成网状信息,加深对Java8 Stream的理解。1. 命令式语言和声明式语言命令式语言 public static List<String> getSharks(List<String&原创 2022-03-13 19:16:15 · 1407 阅读 · 0 评论 -
【算法】LeetCode二分查找例题汇总(持续更新)
死循环问题仅一部分的测试用例可以通过为了避免以上问题,收敛下题目,记住解题思路。当序列中有三个元素, (下标从0开始)往 mid 的左边找可以找到答案left == 0, right == 1 (为什么不是 mid - 1 而是 mid) 因为当前Mid可能是答案,不要漏掉了。往 mid 的右边找可以找到答案left == 1, right == 2 (为什么可以是 mid + 1) 因为当前Mid不可能是答案 (答案是要找false节点,而不是true节点)原创 2021-12-31 17:05:57 · 772 阅读 · 0 评论 -
【C/C++】Java程序员理解C++方法签名中结构体指针的引用的作用
1. 前言本文先介绍C中的指针和引用的区别,再联系Java中舍弃指针,只用引用的使用场景进行理解。2. 使用的场景下题摘自广工考研真题:2.1 题目某仓库用一个带头节点的循环链表L存储各种货物的代码,链表的定义如下:看不懂链表定义点这里typedef struct Goods { int code; Goods *next;} Goods, *GoodsList;试写一个算法 void f(GoodsList L, GoodList &Lc, int c),将其中代码code大原创 2021-08-06 23:42:45 · 288 阅读 · 0 评论 -
【Java_jvm】Window下查看本地JVM类的实例数量及占用内存
1. 导出dump文件1.1 获取PID(两种方式)可以使用任务管理器获取也可以使用jconsole间接获取在jdk的bin 目录下找到jconsole.exe 执行即可如果看不到本地进程、文件权限可能存在问题解决:先通过本地java代码运行:System.out.println(System.getProperties());查看属性java.io.tmpdir=C:\Users%USER%\AppData\Local\Temp注: 此处%USER%为变量代表操作系统用户原创 2020-10-22 21:34:00 · 4415 阅读 · 3 评论 -
【Java_基础深入】Java8 Stream | Collections API 的 分组操作
Java8 Stream | Collections API 的 分组操作初始数据 // 初始数据 List<User> userList = Arrays.asList( new User("zhangsan", 10), new User("zhangsan", 12), new User("lisi", 10), new User("wangwu", 15),原创 2020-05-16 20:11:06 · 535 阅读 · 0 评论 -
【算法】O(n2)时间复杂度和O(nlogn)排序算法的简要分析
排序算法的概述排序算法按时间复杂度分可以分为O(n2) 和 O(logn)O(n2) 排序算法流程分析1234.n个数已有序5.开始扫描第n+1个数n个无序序列外层遍历遍历至第n个数内层遍历外层遍历的时间复杂度是n,内层遍历的时间复杂度也是n,由于嵌套关系,总的时间复杂度就是O(n2) 。O(n2) 排序算法都使用上述的流程,典型的代表有选择排序 、插入排序选择排序123value和...原创 2020-03-15 00:54:14 · 3768 阅读 · 1 评论 -
【Java_基础深入】JDK借助RandomAccess接口 ,定制ArrayList与LinkedList的二分查找策略
java常用集合类接口实现情况public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializablepublic class LinkedList<E> exte...原创 2020-03-08 19:04:28 · 728 阅读 · 0 评论 -
【Java_基础深入】LinkedHashMap 继承 HashMap又实现 Map 接口背后的设计思想
JDK源码的类定义public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializablepublic class LinkedHashMap<K,V> extends HashMap<K,V> implements...原创 2020-03-08 14:06:26 · 1153 阅读 · 3 评论 -
【RabbitMQ】@RabbitListener的使用及造成报错死循环的分析
问题复现:docker 下清空对应的队列信息exec rabbitmq /bin/bash #rabbitmq是容器名,也可以指定为Idrabbitmqctl purge_queue queue.order # queue.order是队列名RabbitMQ控制台新建消息,等待消费者消费http://localhost:15672前置知识:一、 @RabbitListener的使...原创 2020-02-10 18:27:03 · 13396 阅读 · 0 评论 -
【Java_基础深入】SimpleDateFormat.format()线程不安全的起因与解决方案
追踪问题网上找到的最多讨论的就是 calendar的线程不安全操作传递到了SimpleDateFormat针对Calendar进行断点观察,观察其值的变化观察calendar的赋值链SimpleDateFormat实例化过程1: calendar初始化的位置追踪上层方法:2.1 疑惑:无参构造调用了有参的构造方法,初始化了calendar2.2 解惑:无参构造中使用了this...原创 2019-12-29 23:12:44 · 1163 阅读 · 0 评论 -
【java_基础深入】模板方法设计模式的妙用 : 回调子类实现
模板方法设计模式应用场景HttpServlet 的 service() 就是一个模板方法,它实现了Servlet规范,DispatcherServlet 借助service() 的模板方法,拓展了自己的逻辑。HttpServlet 是一个抽象类。抽象类是实现模板方法的基石,以下先举个简单例子,再从底层证明实例产品线定义:/** * @Author james * @Descript...原创 2019-12-24 22:52:02 · 303 阅读 · 0 评论 -
【java_基础深入】com.mysql.jdbc.Driver 借助SPI打破双亲委派
一. SPI 中角色前言以下概念拓展至Effective java page 6 (中文版)SPI (Service Provider Interface),用于拓展工程实例的接口对于JDBC ,Connection 就是其服务接口的一部分1.1 服务提供者面向的JDK接口 DriverService InterfaceJDK 提供了标准,具体的数据库驱动由各大数据库厂商提供...原创 2019-12-11 22:48:40 · 1510 阅读 · 0 评论 -
【java_基础深入】类加载器和双亲委派机制、全盘委托机制的关系
类加载器和双亲委派机制、全盘委托机制的关系一. 类加载器1.1 类加载器rt.jar中 sun.misc.Launcher.classpublic class Launcher { static class AppClassLoader extends URLClassLoader {} static class ExtClassLoader extends URLClas...原创 2019-12-11 22:32:33 · 1000 阅读 · 1 评论 -
【java_多线程】模拟银行转账,为保证原子性而引发死锁,检测死锁并解决
前言本例子不是实际的生产模型,只是为了更好研究死锁而举的例子需求james 转账给 jay 20 元,需要保证转账过程原子性操作能加锁的前提每个对象都有一个monitor,用于维护自身的锁状态,换句话说,所有对象都可以作为一把锁每个用户的monitor就可以作为一把锁,并且这把锁是互斥的,暂且称作读写锁用加锁实现原子性锁规则每个用户都持有账户的一把读写锁,可以自己持有,也可以被...原创 2019-11-22 17:54:16 · 1368 阅读 · 0 评论 -
【java_多线程】多线程核心问题
有多少种实现线程的方法?思路有5点摆明立场从不同的角度看,会有不同的答案我认为本质上都是实现Runnable 和继承Thread举出例子线程池的Worker 本质上是一个线程安全的RunnableFutureTask 是使用Future接口拓展的一个RunnableTimerTask 也是一个Runnable一个线程两次调用start()方法会出现什么情况?为什么会抛出异常...原创 2019-11-23 21:41:57 · 267 阅读 · 0 评论 -
【java_基础深入】ThreadPoolExecutor.execute() 源码分析
第一层:初见阻塞队列BlockingQueue、任务载入方法Worker.addWorker()思考:corePoolSize BlockingQueue 如何直接参与调度出现了的Worker是什么为什么没有出现maximumPoolSize public void execute(Runnable command) { //线程池指标: 获取线程池状态 + 活跃线程数 (使用二...原创 2019-11-17 16:23:10 · 623 阅读 · 0 评论 -
【java_多线程】让线程阻塞,获取其他线程的返回值 ,使用AQS组件实现
1. 传统方式 Thread.join() /** * 使用传统方式启动线程,执行任务,实现阻塞 * * @see Thread#join() * */ public static void main(String[] args) { Thread thread = new Thread(new Runnable() {...原创 2019-10-29 21:39:14 · 705 阅读 · 0 评论 -
【java_设计模式】动态代理和静态代理的本质区别
前言网上有很多讲动态代理和静态代理的写法作为区分原因,但是都没有讲到本质上本文主要从应用层自上而下看待这个问题应用场景静态代理 // 数据准备 Order order = new Order();order.setUserId(1); Money money = new Money(); // 创建静态代理 O...原创 2019-10-25 20:22:53 · 892 阅读 · 0 评论 -
【java_基础深入】从语言规范、字节码指令、jvm编译 理解finally语句块细节
一、finally语句块执行的外在表现1.1. Gosling 亲自对 finally 的描述a finally clause is always entered with a reason. That reason may be that the try code finished normally, that it executed a control flow statement su...原创 2019-10-22 21:18:29 · 309 阅读 · 0 评论 -
【java_基础深入】注解注入配置 / Properties读取配置 / ResourceBundle读取配置
注解注入/** * 生命周期问题: * 注解的默认生命周期是保留到字节码阶段 * 通过Retention元注解指定注解的生命周期 * 1. SOURCE 保留到源码阶段 * 2. CLASS 保留到字节码阶段 * 3. RUNTIME 保留到运行时 */@Retention(RetentionPolicy.RUNTIME)public @interface JdbcI...原创 2019-10-22 10:30:54 · 277 阅读 · 0 评论 -
【java_基础深入】使用内省技术模仿实现BeanUtils
原BeanUtils出处import org.apache.commons.beanutils.BeanUtils;原BeanUtils常用法populate(Object bean, Map<String, ? extends Object> properties); // 传入Map参数注入bean public void getBean() { ...原创 2019-10-22 10:03:58 · 172 阅读 · 0 评论 -
【算法】求100以内的所有素数,使用数组优化
普通解法 public static void getE(int size){ int count = 0; for (int i = 2; i < size; i++) { // 默认所有数都是素数 boolean flag = true; for (int j = 2; j <...原创 2019-10-20 19:46:54 · 4451 阅读 · 0 评论 -
【算法】从斐波那契问题看待数据结构和算法
题目回顾求斐波那契数列的第n个数1, 1, 2 , 3, 5,8,… /** * 递归算法 * @param n 第n个数 * @return 第n个数的值 */ private static long Fibonacci(int n) { if(n == 1 || n == 2) { ret...原创 2019-10-20 18:58:51 · 218 阅读 · 0 评论 -
【算法】回溯时集合操作 保持对象的独立性
题目/** * @Author james * @Description 给定一个没有重复数字的序列,返回其所有可能的全排列。 -- 使用数组记录状态 * * 示例: * * 输入: [1,2,3] * 输出: * [ * [1,2,3], * [1,3,2], * [2,1,3], * [2,3,1], * [3,1,2], * [3,2,1...原创 2019-08-27 11:44:16 · 140 阅读 · 0 评论 -
【算法】求二叉树两节点的最近公共祖先 迭代解法 Stack + Map + Set
算法拆分遍历树广度优先遍历(层序遍历) – 辅助栈 Stack // 辅助栈 Stack<TreeNode> stack = new Stack<>(); // 遍历前压栈进根节点 stack.push(root); // 遍历树,广度优先遍历, 每次遍历前 pop 一个元素 while (!stack.isEmpt...原创 2019-09-02 22:08:23 · 283 阅读 · 0 评论