自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

L__ear的博客

散发对光和热的感觉

  • 博客(90)
  • 收藏
  • 关注

原创 实现异步回调

使用java一步步实现一个异步回调的架子

2024-02-05 17:26:20 194

原创 Z字型遍历二叉树

核心代码就一点:入队的时候左孩子在左边,右孩子在右边。这样,从右边出队就是从右往左倒序遍历,从左边出队就是从左往右正序遍历。

2024-01-30 10:15:47 263

原创 邮件翻译(pg位图索引相关问题解答)

如果位图变得太大,我们将其转换为“有损”风格,在这种风格中,我们只记住哪些页面包含匹配的元组,而不是单独记住每个元组。当这种情况发生时,表访问阶段必须检查页面上的每个元组,并重新检查扫描条件,以确定返回哪个元组。

2022-10-27 15:37:26 381 1

原创 基于原生JDK实现异步回调

我们希望执行异步任务的线程,在异步任务完成后,能自动调用异步结果的处理逻辑,不需要我们另起线程等待异步任务执行完成,这便是常说的异步回调。

2022-10-09 18:04:13 447

原创 Java Callable任务

对于Callable任务来说,其实真正异步的还是Runnable任务,Callable只是对Runnable的封装,通过中间变量,让我们可以方便的获取异步执行的结果。

2022-10-09 17:54:51 221

转载 @AliasFor 注解

Spring 框架提供了很丰富的注解可以让我们很方便的进行 Spring 配置,今天要讲的注解——@AliasFor之前你可能并没有关注过,因为平时开发时我们的确不太会用到。我关注到这个注解是因为我经常翻看 Spring 的源代码,在 Spring 提供的注解中大量的用到了这个注解,对这个注解不熟悉的话会影响你对代码的判断,而且有些代码看的总是似懂非懂的,很难受(强迫症,哈哈),比如说下面这段代码。上面的代码大致能“猜测”出 @AliasFor 是为了属性起别名,但是 @AliasFor 的使用场景,使用

2022-06-15 18:40:03 292

原创 笔试会遇到的树相关的算法

1. 构建哈夫曼树public class Huffman { static class Node{ int val; Node left, right; Node(int val){ this.val = val; } } // 看作是合并森林中的树 private static Node buildHuffman(int[] w) { Queue<Node> heap = new PriorityQueue<>((a, b)->(

2020-10-01 22:18:54 131

原创 前缀树笔记

1. 前言发现笔试题经常爱考前缀树。每次慢慢回忆,再慢悠悠的写代码,时间根本来不及。需要总结一下记忆方法,目标是以后碰到前缀树的题能上手就来。记忆点一:图记忆点二:边表示字符,结点对应 isEnd 和 count 信息。从结点到根只有一条路径,表示一个字符串前缀。记忆点三:class Trie { final int max = 1000; int[][] tree = new tree[max][26]; // 一行表示一个结点;孩子表示法 int[] count = new

2020-09-30 15:51:33 175

原创 算法题 牌型判断 Java

题目德州扑克的花型由 N 张扑克牌组成 0<N<8,可以组成的牌型按照价值从高到低来区分分别为:皇家同花顺:最高为 Ace (一点)的同花顺。如 A K Q J 10 的同花顺同花顺:同一花色,五张顺字的牌。如:K Q J 10 9 的同花顺四条:有四张同一点数的牌。如:4 4 4 4 9葫芦:三张同一点数的牌。加—对其他点数的牌。如:3 3 3 10 10同花:五张同一花色的牌。如:J 10 8 7 5 的全是红桃的牌顺子:五张顺连的牌。如:5 4 3 2 A 的非

2020-09-24 09:54:44 3836

原创 自定义类加载器

类:ClassLoader方法:findClass;defineClass(将字节数组变成Class对象);loadClass;【双亲委派模型】使用模板模式实现在loadClass方法中。loadClass 的源码: protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassL

2020-09-20 21:39:08 158

原创 顺丰的一道笔试题

问输出结果,public class Test { public static void main(String[] args){ int num = 1; System.out.println("main:\t"+method(num)); } private static int method(int num) { num++; try{ return ++num; } finally { num++; System.out.println("meth

2020-08-21 23:19:11 392

原创 ConcurrentHashMap1.8 面试准备总结

ConcurrentHashMap数据结构依然是 数组+链表+红黑树利用 CAS+Synchronized 来保证并发更新的安全1.8 的锁粒度是桶,相比于 1.7 的分段锁,锁粒度更小,并发度更高。计算 size将所有 size 变化写入一个变量和一个数组。计算 size 时,将变量和数组中的非空元素都加起来。全程 CAS只在数组未初始化且没有线程争用时,将 size 变化写入变量。否则,只将 size 变化写入数组中任一元素。数组可扩容,长度上限为机器

2020-08-09 00:01:01 761

原创 JVM 各种常量池傻傻分不清?

总体上有如下四种常量池:class 文件中的常量池、运行时常量池、字符串常量池、符号常量池。class 文件中的常量池: 一个类对应一个 class 文件,每个 class 文件中都有一个常量池。这个常量池是一个静态的常量池,存在于文件中,而不是内存中。记录了类中的字面量和符号引用。运行时常量池: 与 class 文件中静态的常量池相对的是 JVM 进程中的运行时常量池,运行时常量池是 JVM 加载 class 文件(类加载)后,class 文件中的常量池在内存中的表现形式,存储在 JVM 的方法区。

2020-07-17 21:25:57 414 1

原创 HTTPS 和安全通信原来这么简单

HTTP 协议(HyperText Transfer Protocol,超文本传输协议):用于客户端与服务器端之间的通信。通过请求报文和响应报文的交换达成通信。是无状态的协议。HTTP 协议以简单便捷为设计目的,所以并没有提供确保通信安全的服务。HTTPS(HTTP Secure,超文本传输安全协议),实现了 HTTP 的安全通信。HTTPS = HTTP + 加密(防窃听) + 认证(防伪装) + 完整性保护(防篡改)。HTTPS 并非是应用层的一种新协议,而是让 HTTP 和 SSL

2020-06-28 23:31:44 303

原创 关于 CopyOnWriteArrayList 的一个简单优化

一、优化动机二、优化实现三、优化导致的问题和解决方案四、示意代码

2020-06-07 16:31:33 383

原创 ConcurrentHashMap 1.8 计算 size 的方式

相关字段: /** * Base counter value, used mainly when there is no contention, * but also as a fallback during table initialization * races. Updated via CAS. */ private transient volatile long baseCount; /** * Spinlock (lock

2020-06-03 20:43:36 3512

原创 关于 ConcurrentHashMap 1.8 中的线程探针哈希

ConcurrentHashMap 在累加键值对个数的 addCount 函数中,使用 ThreadLocalRandom.getProbe() 得到线程的探针哈希值。在这里,这个探针哈希值的作用是哈希线程,将线程和数组中的不用元素对应起来,尽量避免线程争用同一数组元素。探针哈希值和 map 里使用的哈希值的区别是,当线程发生数组元素争用后,可以改变线程的探针哈希值,让线程去使用另一个数组元素,而 map 中 key 对象的哈希值,由于有定位 value 的需求,所以它是一定不能变的。那么这个探针哈希值

2020-06-03 17:57:53 2308 3

原创 synchronized 各种锁状态

偏向锁的论文中给出的,偏向锁定下的锁状态转换:可能发生的所有状态转换:对象可能的初始锁状态只有 可偏向 和 无锁 两种。注释:可偏向状态,使用原始论文里的表达就是 the biasable but unbiased state。又叫 匿名偏向状态,后面统一使用 可偏向状态表达。 可偏向 只能变成 偏向。偏向 可以批量重偏向为 可偏向,可以撤销偏向为 无锁,或者撤销偏向为 轻量级锁。无锁 只能变成 轻量级锁。轻量级锁 可以解锁后变成 无锁,可以发生锁争用后膨胀成 重量级锁。状态转换图示:状态

2020-05-28 23:35:19 465

原创 源码解析-线程A请求偏向于线程B的偏向锁

一、先理理所有情况假设偏向锁有效,即类没有关闭偏向模式,且其 epoch 没有过期。则一定会发生偏向锁的撤销。第一类情况:线程 B 没有正在持有该偏向锁。仅发生单个偏向撤销,偏向锁先被撤销为无锁,然后在 slow_enter 里升级为轻量级锁。触发了批量重偏向,偏向锁先被撤销为匿名偏向,随后立即重偏向于 A。触发了批量撤销,偏向锁同样先被撤销为无锁,然后在 slow_enter 里升级为轻量级锁。第二类情况:线程 B 正在持有该偏向锁。仅发生单个偏向撤销,偏向锁撤销为 B 的轻量级锁,

2020-05-28 19:11:04 509

原创 源码解析-偏向锁撤销流程解读

一、单个偏向锁的撤销源码链接:http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/9ce27f0a4683/src/share/vm/runtime/biasedLocking.cpp#l376static BiasedLocking::Condition revoke_bias(oop obj, bool allow_rebias, bool is_bulk, JavaThread* requesting_thread) { markOop ma

2020-05-27 01:49:13 1018 1

原创 源码解析-触发批量撤销或批量重偏向的条件

JVM 基于一种启发式的做法判断是否应该触发批量撤销或批量重偏向。依赖三个阈值作出判断:# 批量重偏向阈值-XX:BiasedLockingBulkRebiasThreshold=20# 重置计数的延迟时间-XX:BiasedLockingDecayTime=25000# 批量撤销阈值-XX:BiasedLockingBulkRevokeThreshold=40启发式的判断源码如下:static HeuristicsResult update_heuristics(oop o, bool

2020-05-26 21:44:17 644 1

转载 CopyOnWriteArrayList原理解析

CopyOnWriteArrayList是一个线程安全的ArrayList,对其进行的修改操作都是在底层的一个复制的数组(快照)上进行的,也就是使用了写时复制策略。如图所示是CopyOnWriteArrayList的类图结构:上图有个小瑕疵,lock 是 包级私有,而不是 protected。能够看到,每个CopyOnWriteArrayList对象都有一个array数组用来存放具体元素,而ReenTrantLock则用来保证只有一个线程对Array进行修改。ReenTrantLock本身是一个独占锁

2020-05-21 00:26:55 5894 1

翻译 MESI 缓存一致性协议(翻译,中英对照)

内容来自《What Every Programmer Should Know About Memory》的 3.3.4 节 Multi-Processor Support。这篇文章是按论文的格式写的,与其说是文章,说是书更加合适,毕竟总共有 114 页。作者 Ulrich Drepper 是真大牛,如果你想要在编程领域走的深的话,文章名说的一点也不夸张,内存是每个程序员都应该知道的。而且这篇文章的内容也确实配得上所有程序员都应该阅读的水平。本文以直译为主,尽量不改变原文的意思。括号里一般是我的总结和理解

2020-05-14 13:55:27 687

原创 HotSpot VM 压缩指针

现在基本上已经是 64 位机的时代了,内存单元的地址也是 64 位。在 Java 中,除了 8 种基本类型,最常见的类型就是引用类型了,引用类型封装了引用对象的指针。使用压缩指针将 64 位长度的指针压缩到 32 位,可以有效降低存储空间的开销。压缩指针首先它不是一个地址,它是一个相对于堆 64 位基址上的一个偏移量。由于对象大小一定是 8 字节的整数倍,所以这个偏移量的单位不是字节,而是 ...

2020-04-16 15:25:25 292

原创 Java 对象头中你可能不知道的事

写在前头本文将通过 jol 工具包和 OpenJDK 源码来说明对象头中 hashCode 的设置。为了不浪费大家的时间,先说结论:对象创建完毕后,对象头中的 hashCode 为 0。只有对象调用了从 Object 继承下来的 hashCode 方法,HotSpot 才会把对象 hashCode 写入对象头,否则不会写入。验证一、jol 输出验证jol 全称 Java Obje...

2020-04-13 13:09:55 789

原创 滑动窗口算法框架总结

leetcode 30. 串联所有单词的子串给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。示例 1:输入:s = “barfoothefoobarman”,words = [“foo”,“bar”]...

2020-03-28 13:08:02 621

转载 一个通用方法团灭 6 道股票问题!

转载自:https://github.com/labuladong/fucking-algorithm/blob/master/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%B3%BB%E5%88%97/%E5%9B%A2%E7%81%AD%E8%82%A1%E7%A5%A8%E9%97%AE%E9%A2%98.md6 道股票问题买卖股票的最佳时机买卖股票的...

2020-03-22 10:53:21 202

原创 你真的熟练掌握二分查找了吗?

二分查找由于思想简单,在经典算法中最容易被初学者忽视。看懂了书上的一种写法后,就以为自己会了,而实际上是一看就会,一写就废。不信的话,先来看一个问题:找出升序数组中小于等于目标值的最大值?(数组中可能不包含目标值)如果感觉很棘手,别着急,看完本文你能随手撸出两种不同的解法。如果你写出来了,也别着急,继续看下去,你会发现你写的不一定完美。好啦,不管怎样,看完绝对不亏,哈哈。一、开门见山不...

2020-03-22 02:21:30 177

原创 全排列、组合、组合总和、子集

声明:把递归参数不变的,尽量统一设置为成员变量。全排列全排列问题求解体系基本上分为两大类,一是基于选择,二是基于交换。全排列1:无重复基于选择的经典解法:class Solution { private int[] nums; private List<List<Integer>> result; public List<List<In...

2020-03-08 12:34:28 401

原创 leetcode 215. 数组中的第K个最大元素(热门面试题)

题目求解快速选择算法,跟快速排序是一个人发明的,思想和快速排序一样,平均时间复杂度为 O(N)。class Solution { private int[] nums; private int k; public int findKthLargest(int[] nums, int k) { this.nums = nums; ...

2020-03-08 11:26:59 241

原创 PCA降维原理

PCA 简介主成分分析(PCA)是最流行的降维算法,通过把数据从高维映射到低维来降低特征维度,同时保留尽可能多的信息。在进行图像识别以及高维度数据降维处理中有很强的应用性,算法主要通过计算,选择特征值较大的特征向量来对原始数据进行基变换,不仅可以去除无用的噪声,还能减少计算量;广泛应用于降维、有损数据压缩、特征提取、数据可视化等领域。三个数学概念方差:衡量变量的离散程度。协方差:衡量两...

2020-01-16 11:15:30 2438

原创 强化学习Q learning算法最简单的入门(含java实现的小例子)

强化学习强化学习和遗传算法优胜劣汰的思想类似,通过奖惩机制不断强化好的行为,弱化坏的行为。什么是好的行为,什么是坏的行为,这跟你要解决的具体问题有关,比如路径规划问题,走距离目标点较近的路线就是好的行为,走距离目标点较远的路线就是坏的行为。强化学习包含四要素:agent、环境状态、行为和奖励,目标是获得最多的累计奖励。Q learningQ learning 融合了马尔科夫过程和动态规划,...

2020-01-07 23:05:21 5533 2

原创 神奇的数据结构---并查集

树的双亲表示法并查集,拆解为并、查、集,何为集,集合,用树表示,何为并,集合的合并,何为查,判断两个元素是否属于同一集合。基础算法的实现并查集的启发式优化,a,b合并,究竟是a的祖先合并在b的祖先上,还是b的祖先合并在a上?小树合并到大树或低树合并到高树。并查集的路径压缩优化,查询是顺便压缩路径,让结点离祖先更近,能大大提升效率,并且压缩路径的代价不大。...

2019-12-24 00:44:49 240

转载 java ArrayList的序列化分析

一、绪论JAVA 序列化就是将 JAVA 对象以一种形式保持,比如存放到硬盘,或是用于传输。反序列化是序列化的一个逆过程。JAVA 规定被序列化的对象必须实现 java.io.Serializable 这个接口,而我们分析的 ArrayList 同样实现了该接口。通过对 ArrayList 源码的分析,可以知道 ArrayList 的数据存储依赖于 elementData 数组,它的声明为:...

2019-12-18 23:51:03 354

转载 transient关键字详解

作用:一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。 transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。 一个静态变量不管是否被transient修饰,均不能被序列化。请看代码://实体类(必须实现...

2019-12-18 10:37:19 233

原创 leetcode 72.编辑距离

编辑距离可以说是动态规划算法中经典的、知名的题目了,题目难度也不小,是一道很好的动态规划的题目。很可能会出现在面试中动态规划的考察上。题目给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入: word1 = “horse”, word2 =...

2019-11-14 11:23:04 172

原创 Java 字符串与字符串常量池

字符串常量池存在的意义就是实现字符串的共享,节省内存空间。像 Integer 等部分基本类型的包装类也实现了常量池技术,但是它们都是直接在 Java 源码层面实现的,而字符串常量池是在 JVM 层面使用 C 语言实现的。字符串常量池的底层实现其实就是一个哈希表,可以把它理解成不能自动扩容的 HashMap。

2019-11-01 19:43:17 395

原创 字符编码(GB 2312、GBK、UTF-8、UTF-16)

GB 2312GB 2312 是 1980 年发布的中文编码,共收录 7445 个字符,有 6763 个汉字以及 682 个非汉字字符,其中一级汉字 3755 个,二级汉字 3008 个。GB 2312 采用双字节编码,两字节最高位均为 1,兼容 ASCII 码。整个字符集分为 94 个区,每个区有 94 个位,7445 个字符被填入到这 94*94 个区位中。每个区位上只有一个字符,因此...

2019-10-25 16:11:53 3114

原创 从编码角度直观理解信息熵计算公式

信息论之父 C. E. Shannon 在 1948 年发表的论文“通信的数学理论(A Mathematical Theory of Communication)”中指出,绝大部分信息都存在冗余,冗余大小与信息中每个符号(数字、字母或单词)的出现概率或者说不确定性有关。Shannon 借鉴了热力学的概念,把信息中排除了冗余后的平均信息量称为“信息熵”,并给出了计算信息熵的数学表达式。假设信息中...

2019-08-25 00:40:29 2577

原创 LDA 吉布斯采样(Gibbs Sampling)的公式推导

LDA 吉布斯采样的公式推导,推导方法有很多种,本文根据《LDA数学八卦》和《Parameter estimation for text analysis》介绍两种推导方法...

2019-08-15 20:21:40 3468

空空如也

空空如也

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

TA关注的人

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