自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

我们的征途是星辰大海

我的GitChat : https://gitbook.cn/gitchat/author/5aa87360f09ada6c2d5d0533

  • 博客(673)
  • 资源 (1)
  • 问答 (6)
  • 收藏
  • 关注

原创 LC指北-持续更新中

先导篇-数据结构基础数据结构部分知识框架:数据结构数据结构内容总结:数据结构内容详情进阶篇动态规划01背包问题:01背包完全背包问题:完全背包多重背包问题:多重背包回溯算法贪心算法并查集并查集基础知识:并查集基础...

2021-09-09 21:42:42 157

原创 Druid核心源码解析--DruidDataSource

配置读取连接池初始化创建连接连接回收

2022-03-15 15:17:12 4274

原创 CopyOnWriteArrayList实现解析

一,内部核心变量定义 /** The lock protecting all mutators */ final transient ReentrantLock lock = new ReentrantLock(); /** The array, accessed only via getArray/setArray. */ private transient volatile Object[] array;数据存放在arry内部;二,读取操作 /**

2022-02-17 21:25:31 324

原创 Java SPI

what SPI?SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。如何使用定义如下类:public interface SPITestInterface { String consoleSth(String source);}public class DefaultSPITestInterfaceImplOne implements

2022-01-20 13:32:36 1033

原创 LinkedHashMap实现解析

1,基本核心结构LinkedHashMap继承HashMap,除了有那些HashMap内部的结构外,还定义了 一个双向链表,/** * HashMap.Node subclass for normal LinkedHashMap entries. */static class Entry<K,V> extends HashMap.Node<K,V> { Entry<K,V> before, after; Entry(int hash, K ke

2022-01-01 16:30:26 738

原创 HashMap核心代码解析

1,基本结构图解HashMap首先是一个 数组,数组的每个位置,挂的是链表或者红黑树 (jdk 1.8及其以上);在jdk 1.8之前,HashMap的实现仅仅是在数组的每个位置上 挂链表;只用链表的弊端:可能以为位置上hash冲突过多,造成去定位时候,查找效率比较低,ps,链表的查找时间复杂度为O(n),红黑树查找的复杂度为O(logn);2,如何去定位在数组中的位置首先先来看HashMap是如何把数据打散的:首先先来看HashMap是如何把数据打散的:static final int ha

2022-01-01 15:40:52 903

原创 redis——基于redission的延时队列

private RBlockingQueue<TeacherAuthProgressContext> blockingQueue; private RDelayedQueue<TeacherAuthProgressContext> delayedQueue;初始化: blockingQueue = client.getNativeClient().getBlockingQueue(queueName); if (blockingQueue == n...

2021-12-21 16:06:03 1263

原创 Guava:使用ListenableFuture来执行有返回值的线程任务

首先来定义一个任务: @Getter @Setter @AllArgsConstructor class GetThreadReturnResult implements Callable<String>, Serializable { private static final long serialVersionUID = 2277437296426921203L; private String id; @Overr

2021-12-21 15:05:47 834

原创 Java一些并发类实现原理

基础元素实现原理volatileLock前缀指令+JMM+缓存一致性模型+内存屏障(JMM内存屏障映射为操作系统内存屏障)synchronized锁升级(优化 ),monitor对象+等待通知(重量级锁)finalJMM保证cascmpxchg...

2021-12-18 14:46:12 702

原创 synchronized实现解析

JVM层的实现对于代码: int dataV = 1; public synchronized void changeData() { dataV++; } public void readData() { synchronized (this) { System.out.println(dataV); } }同步代码块首先来看代码块方法readData反编译之后:对于同步代码快,反编译

2021-12-16 18:00:30 260

原创 volatile实现解析

反汇编生成代码使用测试代码,观察value值生成的汇编代码:volatile int value = 1; @Test public void test() { value++; }反汇编观察value++时候的代码: 0x000000011541f775: lock addl $0x0,(%rsp) ;*putfield queueaddl操作前面,会加入一个lock前缀指令。下面来查询lock前缀指令的作用:lock描述翻译:lo

2021-12-16 15:35:36 679

原创 JVM参数笔记

功能参数运行时打印汇编指令-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly

2021-12-16 11:48:29 166

原创 缓存数据库双写不一致问题处理

我们的数据库操作中,一般会封装同步修改缓存的写法,但是这是一个两步操作,有可能带来缓存数据库数据不一致的问题。使用redisson提供的分布式锁解决参考:基于redis的分布式锁在我们之前加锁的逻辑中,对于读写的一段逻辑进行加锁,但是在高并发的场景中,有可能出现同一时刻,锁竞争过多,有可能有的线程会经历过长时间的等待。解决加锁的这种问题,回顾下我们的java提供的一些线程安全的类,可以为我们提供如下解决思路:数据分段将数据通过不同的一个组值,分成多段进行加锁,减少竞争发生时候,等待的线程数.

2021-12-05 14:27:21 1352

原创 基于redis的分布式锁

java使用redisson的客户端 String lockKey = StringUtils.join(new String[]{qid, SafeConverter.toString(resultGroupId)}, ":"); RLock lock = client.getNativeClient().getLock(lockKey); try { lock.lock(); //这里写具体

2021-12-05 11:41:23 1002

原创 图解Java虚拟机内存模型

类装载子系统负责将我们用到的文件,加载到JVM的运行时数据区字节码执行引擎负责执行加载到方法区中的字节码在执行字节码的同时,修改对应线程的程序计数器,标记当前正在执行的代码运行时数据区- 线程独享的部分虚拟机栈主要是存放调用方法时候用到的一些数据;下面我们用一段简单代码来说明下: @Data public static class User implements Serializable { Integer id; String name; .

2021-12-04 20:23:35 1201

原创 Java原子更新类

@Test public void test6() throws Exception { AtomicInteger value = new AtomicInteger(0); CyclicBarrier cyclicBarrier = new CyclicBarrier(100); ExecutorService executorService = Executors.newCachedThreadPool(); for (int .

2021-11-23 20:27:57 358

原创 线程同步控制

CyclicBarrierint iMax = 100; CyclicBarrier barrier = new CyclicBarrier(iMax); int shareValue = 0; Lock lock = new ReentrantLock(); @Test public void test() throws Exception { for (int i = 0; i < iMax; i++) { Some

2021-11-23 18:37:37 159

原创 区块链原理入门

定义区块创建区块链/** * \* Created: liuhuichao * \* Date: 2021/11/20 * \* Time: 5:26 下午 * \* Description:区块定义 * \ */@Data@AllArgsConstructor@NoArgsConstructorpublic class Block implements Serializable { private static final long serialVersionUID = -7

2021-11-20 17:41:59 11262

原创 前缀和—— 一维数组和二维数组的前缀和

一维数组前缀和定义应用示例二维数组前缀和定义应用示例

2021-09-28 21:56:15 287 2

原创 动态规划问题3--多重背包

多重背包问题描述及其代码在01背包的基础上,01背包是每个物品有一个,所以只能放入一次,此时我们再加入一个物品个数的数组s,表示每个物品的个数,多重背包介于01背包和完全背包中间,加入了判断物品个数的一个维度,我们可以在01背包基础上,增改下代码(这里面我们直接上一维数组的了,不讲空间优化了,有兴趣的可以去看前面写过的背包问题,已经写过了):/** * @param V 最大容量 * @param C 物品个数 * @param v 价值数组 * @param w

2021-09-09 17:51:07 245

原创 动态规划2——完全背包问题解析

完全背包问题描述有C种物品和一个容量为V的背包,每种物品都有无限件。第i件物品的体积是v[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。与之前的01背包不同的是,每个物品都有无限个,对于同一个物品,可以放置多个。基本解法首先还是先来用基本解法来一遍,不带优化的。先看多个物品的状态转移方程。当不选择该物品时候,这个时候值跟01背包的一样,还是dp[i - 1][fv];当选择该物品时候,对于一个固定容量,如果该物品能被放进去,要想价值最大,

2021-09-07 18:50:38 245

原创 动态规划1 —— 01背包详解

从斐波那契数列说起斐波那契数列(Fibonacci sequence),对于n(n>=0),n=0时,f(0)=0;n=1时,f(1)=1;n=2时,f(2)=f(0)+f(1);n=3时,f(2)=f(1)+f(2);以此类推…求解f(n)。最早 ,我们可能在课本上学过,这是个经典的递归问题,于是,能很很快写出递归的代码: public int fib(int N) { if (N == 0) { return 0; }

2021-09-03 18:37:14 330

原创 并查集模板1-路径压缩和按秩合并

并查集的概念引人并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中。其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能用并查集来描述。并查集是一种树型的数据结构,

2021-03-27 14:04:44 301

原创 将二叉搜索树构建为高度平衡二叉树的方法1--拆解为有序数组,构建高度平衡二叉树

/** * 先得到值,之后重建 * * @param root * @return */ public TreeNode balanceBST(TreeNode root) { if (root == null) { return null; } List<Integer> data = new ArrayList<>(); inOrde.

2020-10-06 14:21:49 249

原创 超简单KMP实现讲解

最长公共前后缀 /** * 获取最长公共前后缀长度 * * @param s * @return */ private int[] getNext(String s) { int[] result = new int[s.length()]; int len = 0, i = 1; while (i < s.length()) { if (s.charAt(i) == s

2020-07-16 15:06:43 944 3

原创 求解最长回文字串——Manacher 算法

之前用动态规划法和中心扩散法求解过这个问题,复习戳这里:LeetCode——5,最长回文子串,看这篇之前,如果不是很明白这个问题的通用解法,先看懂这个再往下看。鉴于dp和中心扩散法,时间复杂度都为n,在这里,我们对中心扩散法进行优化,去掉多次访问同一位置,将中心扩散法优化为时间复杂度为n的算法。 /** * Manacher -- n复杂度算法 * * @param s * @return */ public String longestPali

2020-07-09 15:34:15 381

原创 LeetCode——5,最长回文子串

/** * \* Created: liuhuichao * \* Date: 2019/2/19 * \* Time: 5:41 PM * \* Description: 最长回文子串 * <p> * 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 * <p> * 示例 1: * <p> * 输入: "babad" * 输出: "bab" * 注意: "aba" 也是一个有效答案。 * 示例 2: *

2020-07-09 11:21:43 213

原创 LRU Cache实现--Java版

LRU全名是:Least recently use 简单的说就是:最近最少使用。核心思想有以下几点:1,当空间不足时候,先淘汰掉最不常使用到的数据。2,经常访问到的数据的优先级比较高。下面来看几种LRU Cache的简单java实现。使用LinkedList实现class Node { int key; int value; Node(int key, int value) { this.key = key;

2020-07-04 14:18:49 282

原创 Java并发编程入门——详解线程及基本锁的获取释放

context 1:构建简单的GUI线程和数据线程工作模式GUI初始化和数据初始化为了为我们所有的test构建一个上下文的context,首先我们来写几个类,来简单模拟下我们安卓中,GUI线程和数据线程是如何来显示按钮和数据的:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OCc9Hxjh-1580648242992)(1.1ModelAndView.png)...

2020-02-02 20:58:04 557

原创 LeetCode——215,数组中的第K个最大元素(分治法)

/** * \* Created: liuhuichao * \* Date: 2020/1/27 * \* Time: 11:32 上午 * \* Description: 数组中的第K个最大元素 * \ * 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 * <p> * 示例 1: * ...

2020-02-02 20:53:59 1031

原创 Java并发编程集锦

学习工具Java Concurrent Animated程序,演示动画及代码:官方网址是:http://sourceforge.net/projects/javaconcurrenta/下载地址:http://sourceforge.net/projects/javaconcurrenta/files/latest/download?source=files书籍并发编程的艺术(关腾飞)...

2019-10-18 15:50:16 227

原创 Java大文件分行解析

String path = "/Users/liuhuichao/Downloads/sourceProcessTest.txt"; int totalLine = getLineNum(path); int item = 100000; int group = totalLine / item; ExecutorService executor = Executo...

2019-10-16 14:43:31 510

原创 常见位运算汇总(java)

最近发现了很多挺有意思的位运算,有时候位运算解决问题还是挺简单的,(建议看一下原码,反码,补码的概念再来看下面的代码)记录下常用的一些位运算: public class BitManipulationClass { /** * 逐位输出整数的每一位 * * @param num * @return */ public i...

2019-09-19 00:13:40 377

原创 实现前缀树

class TrieNode { Boolean isWord; Character c; List<TrieNode> next; TrieNode() { isWord = false; } TrieNode(Character c) { ...

2019-09-02 22:47:26 360

原创 N叉树的遍历

前序遍历 public List<Integer> preorder(Node root) { List<Integer> res = new ArrayList<>(); if (root == null) { return res; } res.add(root.val...

2019-09-02 22:45:29 1659

原创 LeetCode——108,将有序数组转换为二叉搜索树

/** * \* Created: liuhuichao * \* Date: 2019/8/29 * \* Time: 32:32 PM * \* Description: 将有序数组转换为二叉搜索树 * \ * 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 * <p> * 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对...

2019-09-01 10:40:39 301

原创 LeetCode——110,判断平衡二叉树

/** * \* Created: liuhuichao * \* Date: 2019/8/29 * \* Time: 30:09 PM * \* Description: 判断平衡二叉树 * \ * 给定一个二叉树,判断它是否是高度平衡的二叉树。 * <p> * 本题中,一棵高度平衡二叉树定义为: * <p> * 一个二叉树每个节点 的左右...

2019-09-01 10:39:28 865

原创 LeetCode——703,数据流中的第K大元素

/** * \* Created: liuhuichao * \* Date: 2019/8/29 * \* Time: 35:22 AM * \* Description: 数据流中的第K大元素 * \ * 设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。 * <p> * 你的 KthLargest&nbsp...

2019-09-01 10:36:42 445

原创 BST基本操作——搜索,插入,删除

搜索public TreeNode searchBST(TreeNode root, int val) { if (root == null) { return null; } if (root.val == val) { return root; } if (root...

2019-09-01 10:34:47 533

原创 LeetCode——297,二叉树的序列化与反序列化

/** * \* Created: liuhuichao * \* Date: 2019/8/27 * \* Time: 28:23 PM * \* Description: 二叉树的序列化与反序列化 * \ * 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。...

2019-08-31 12:20:02 314

ble设备扫描器.apk

ble设备扫描器.apk,目前只有扫描周边BLE设备的功能,又需要其他功能的,可以私信我。

2016-09-13

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除