
Java
文章平均质量分 74
L__ear
我还只是个孩子呀
展开
-
基于原生JDK实现异步回调
我们希望执行异步任务的线程,在异步任务完成后,能自动调用异步结果的处理逻辑,不需要我们另起线程等待异步任务执行完成,这便是常说的异步回调。原创 2022-10-09 18:04:13 · 541 阅读 · 0 评论 -
Java Callable任务
对于Callable任务来说,其实真正异步的还是Runnable任务,Callable只是对Runnable的封装,通过中间变量,让我们可以方便的获取异步执行的结果。原创 2022-10-09 17:54:51 · 391 阅读 · 0 评论 -
自定义类加载器
类:ClassLoader方法:findClass;defineClass(将字节数组变成Class对象);loadClass;【双亲委派模型】使用模板模式实现在loadClass方法中。loadClass 的源码: protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassL原创 2020-09-20 21:39:08 · 214 阅读 · 0 评论 -
顺丰的一道笔试题
问输出结果,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 · 475 阅读 · 0 评论 -
ConcurrentHashMap1.8 面试准备总结
ConcurrentHashMap数据结构依然是 数组+链表+红黑树利用 CAS+Synchronized 来保证并发更新的安全1.8 的锁粒度是桶,相比于 1.7 的分段锁,锁粒度更小,并发度更高。计算 size将所有 size 变化写入一个变量和一个数组。计算 size 时,将变量和数组中的非空元素都加起来。全程 CAS只在数组未初始化且没有线程争用时,将 size 变化写入变量。否则,只将 size 变化写入数组中任一元素。数组可扩容,长度上限为机器原创 2020-08-09 00:01:01 · 878 阅读 · 0 评论 -
关于 CopyOnWriteArrayList 的一个简单优化
一、优化动机二、优化实现三、优化导致的问题和解决方案四、示意代码原创 2020-06-07 16:31:33 · 480 阅读 · 0 评论 -
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 · 3732 阅读 · 0 评论 -
关于 ConcurrentHashMap 1.8 中的线程探针哈希
ConcurrentHashMap 在累加键值对个数的 addCount 函数中,使用 ThreadLocalRandom.getProbe() 得到线程的探针哈希值。在这里,这个探针哈希值的作用是哈希线程,将线程和数组中的不用元素对应起来,尽量避免线程争用同一数组元素。探针哈希值和 map 里使用的哈希值的区别是,当线程发生数组元素争用后,可以改变线程的探针哈希值,让线程去使用另一个数组元素,而 map 中 key 对象的哈希值,由于有定位 value 的需求,所以它是一定不能变的。那么这个探针哈希值原创 2020-06-03 17:57:53 · 2501 阅读 · 3 评论 -
synchronized 各种锁状态
偏向锁的论文中给出的,偏向锁定下的锁状态转换:可能发生的所有状态转换:对象可能的初始锁状态只有 可偏向 和 无锁 两种。注释:可偏向状态,使用原始论文里的表达就是 the biasable but unbiased state。又叫 匿名偏向状态,后面统一使用 可偏向状态表达。 可偏向 只能变成 偏向。偏向 可以批量重偏向为 可偏向,可以撤销偏向为 无锁,或者撤销偏向为 轻量级锁。无锁 只能变成 轻量级锁。轻量级锁 可以解锁后变成 无锁,可以发生锁争用后膨胀成 重量级锁。状态转换图示:状态原创 2020-05-28 23:35:19 · 551 阅读 · 0 评论 -
源码解析-线程A请求偏向于线程B的偏向锁
一、先理理所有情况假设偏向锁有效,即类没有关闭偏向模式,且其 epoch 没有过期。则一定会发生偏向锁的撤销。第一类情况:线程 B 没有正在持有该偏向锁。仅发生单个偏向撤销,偏向锁先被撤销为无锁,然后在 slow_enter 里升级为轻量级锁。触发了批量重偏向,偏向锁先被撤销为匿名偏向,随后立即重偏向于 A。触发了批量撤销,偏向锁同样先被撤销为无锁,然后在 slow_enter 里升级为轻量级锁。第二类情况:线程 B 正在持有该偏向锁。仅发生单个偏向撤销,偏向锁撤销为 B 的轻量级锁,原创 2020-05-28 19:11:04 · 625 阅读 · 0 评论 -
HotSpot VM 压缩指针
现在基本上已经是 64 位机的时代了,内存单元的地址也是 64 位。在 Java 中,除了 8 种基本类型,最常见的类型就是引用类型了,引用类型封装了引用对象的指针。使用压缩指针将 64 位长度的指针压缩到 32 位,可以有效降低存储空间的开销。压缩指针首先它不是一个地址,它是一个相对于堆 64 位基址上的一个偏移量。由于对象大小一定是 8 字节的整数倍,所以这个偏移量的单位不是字节,而是 ...原创 2020-04-16 15:25:25 · 343 阅读 · 0 评论 -
Java 对象头中你可能不知道的事
写在前头本文将通过 jol 工具包和 OpenJDK 源码来说明对象头中 hashCode 的设置。为了不浪费大家的时间,先说结论:对象创建完毕后,对象头中的 hashCode 为 0。只有对象调用了从 Object 继承下来的 hashCode 方法,HotSpot 才会把对象 hashCode 写入对象头,否则不会写入。验证一、jol 输出验证jol 全称 Java Obje...原创 2020-04-13 13:09:55 · 875 阅读 · 0 评论 -
java ArrayList的序列化分析
一、绪论JAVA 序列化就是将 JAVA 对象以一种形式保持,比如存放到硬盘,或是用于传输。反序列化是序列化的一个逆过程。JAVA 规定被序列化的对象必须实现 java.io.Serializable 这个接口,而我们分析的 ArrayList 同样实现了该接口。通过对 ArrayList 源码的分析,可以知道 ArrayList 的数据存储依赖于 elementData 数组,它的声明为:...转载 2019-12-18 23:51:03 · 442 阅读 · 0 评论 -
transient关键字详解
作用:一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。 transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。 一个静态变量不管是否被transient修饰,均不能被序列化。请看代码://实体类(必须实现...转载 2019-12-18 10:37:19 · 272 阅读 · 0 评论 -
leetcode 72.编辑距离
编辑距离可以说是动态规划算法中经典的、知名的题目了,题目难度也不小,是一道很好的动态规划的题目。很可能会出现在面试中动态规划的考察上。题目给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入: word1 = “horse”, word2 =...原创 2019-11-14 11:23:04 · 214 阅读 · 0 评论 -
Java 字符串与字符串常量池
字符串常量池存在的意义就是实现字符串的共享,节省内存空间。像 Integer 等部分基本类型的包装类也实现了常量池技术,但是它们都是直接在 Java 源码层面实现的,而字符串常量池是在 JVM 层面使用 C 语言实现的。字符串常量池的底层实现其实就是一个哈希表,可以把它理解成不能自动扩容的 HashMap。原创 2019-11-01 19:43:17 · 459 阅读 · 0 评论 -
Java HashMap精讲版
基于 JDK1.81、是否允许 key 为 null?允许 key 为 null。// 进一步处理的 key 原本哈希值的哈希函数static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h &amp;amp;amp;gt;&amp;amp;amp;gt;&amp;amp;amp;gt; 16);原创 2019-03-07 17:07:27 · 261 阅读 · 0 评论 -
Java 数组
一、数组声明数组的声明有两种方式:type arrayName[];type[] arrayName;两种方式都可以,高维数组也是如此,根据自己的编程习惯选择即可。二、数组初始化方式一://分配长度为 4 个 int 型的内存空间,并分别赋初始值1,2,3,4int[] array = new int[]{1, 2, 3, 4};方式二://方式一的简写int[] arr...原创 2019-02-26 22:12:25 · 241 阅读 · 0 评论 -
Java Arrays工具类
以下内容基于 JDK1.8一、主要操作位于 java.util 包,是用来操作数组的一个工具类。它提供的操作主要包含下面 8 类:数组排序有序数组的二分查找转列表数组复制数组转字符串数组比较判等计算数组哈希值填充二、常用函数public class Arrays { //默认升序的排序算法 //串行排序算法,底层实现是双轴快速排序,后两个参数可选 ...原创 2019-02-26 22:04:43 · 233 阅读 · 0 评论 -
leetcode 6. Z 字形变换(Java版)
题目描述(题目难度,中等)将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:L C I RE T O E S I I GE D H N之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。请你实现这个将字符串...原创 2019-02-20 18:59:33 · 514 阅读 · 0 评论 -
leetcode 15. 三数之和(Java版的三种解法)
题目描述(题目难度,中等)给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。注意: 答案中不可以包含重复的三元组。例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[ [-1, 0, 1], [-1, -1, 2]...原创 2019-02-25 16:43:37 · 1349 阅读 · 0 评论 -
leetcode 5. 最长回文子串(Java版)
题目描述(题目难度,中等)给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”示例代码时间复杂度为O(n2)O(n^2)O(n2),空间复杂度为O(1)O(1)O(1)class Solution {...原创 2019-02-19 19:57:18 · 509 阅读 · 0 评论 -
leetcode 4. 寻找两个有序数组的中位数(Java版)
题目描述给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, 4]则中位数是...原创 2019-02-18 20:26:42 · 874 阅读 · 0 评论 -
leetcode 3. 无重复字符的最长子串(Java 版)
题目描述给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子...原创 2019-02-18 17:10:28 · 604 阅读 · 0 评论 -
leetcode 11. 盛最多水的容器(Java版)
题目描述(题目难度,中等)给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i,ai)。在坐标内画 n 条垂直线,垂直线 iii 的两个端点分别为 (i,ai) 和 (i,0)。找出其中的两条线,使得它们与 x 轴共...原创 2019-02-23 17:34:37 · 819 阅读 · 0 评论 -
Java HashMap原理详解
前言: 本文基于 JDK1.8,不会过多的扩展其它知识,重点关注 HashMap 的实现。首先简单介绍一下和 HashMap 有亲戚关系的三个类,分别为 LinkedHashMap、TreeMap 和 Hashtable。类的继承关系如下图所示:HashMap: (1)非线程安全 (2) 遍历顺序不确定 (3) 允许有一条记录的 key 为 nullLinkedHashMap: (1...原创 2019-02-17 19:30:45 · 286 阅读 · 0 评论 -
leetcode 7. 整数反转(Java版)
题目描述(题目难度,简单)给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,231−1][−2^...原创 2019-02-22 17:11:30 · 542 阅读 · 0 评论 -
leetcode 16. 最接近的三数之和(Java版)
题目描述(题目难度,中等)给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。例如,给定数组 nums = [-1,2,1,-4] 和 target = 1.与 target 最接近的三个数的和为 2 (-1 + 2 + 1 = 2)。示例代码clas...原创 2019-03-11 16:49:55 · 500 阅读 · 0 评论 -
leetcode 23. 合并K个排序链表(Java版)
题目描述(题目难度,困难)合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4->4->5->6示例代码解法一:借助优先队列(小根堆),下面解法的时间复杂度为 O(nlog(k))O(n\l...原创 2019-04-08 16:44:32 · 1289 阅读 · 0 评论 -
leetcode 46. 全排列(Java版)
题目描述(题目难度,中等)给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/permutations著作权归...原创 2019-07-30 15:15:27 · 864 阅读 · 0 评论 -
leetcode 43. 字符串相乘(Java版)
题目描述(题目难度,中等)给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 = “2”, num2 = “3”输出: “6”示例 2:输入: num1 = “123”, num2 = “456”输出: “56088”说明:num1 和 num2 的长度小于110。num1...原创 2019-07-16 21:59:06 · 872 阅读 · 0 评论 -
leetcode 42. 接雨水(Java版)
题目描述(题目难度,困难)给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6来源:力扣(LeetCode)链接:htt...原创 2019-07-11 10:09:00 · 587 阅读 · 0 评论 -
leetcode 40. 组合总和 II(Java版)
题目描述(题目难度,中等)给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。示例 1:输入: candidates = [10,1,2,7,6,1,5], target ...原创 2019-06-16 21:55:54 · 625 阅读 · 1 评论 -
leetcode 39. 组合总和(Java版)
题目描述(题目难度,中等)给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入: candidates = [2,3,6,7], target =...原创 2019-06-14 22:50:45 · 593 阅读 · 0 评论 -
leetcode 36. 有效的数独(Java版)
题目描述(题目难度,中等)判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。数独部分空格内已填入了数字,空白格用 '.' 表示。示例 1:输入: ["5","3",".",".","7",".",".",...原创 2019-06-09 11:21:20 · 477 阅读 · 0 评论 -
leetcode 37. 解数独(Java版)
题目描述(题目难度,困难)编写一个程序,通过已填充的空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。空白格用 '.' 表示。Note:给定的数独序列只包含数字 1-9 和字符 '.' 。你可以假设给定的数独只有唯一解。给定数独永远是...原创 2019-06-12 21:45:52 · 677 阅读 · 0 评论 -
leetcode 30. 串联所有单词的子串(Java版)
题目描述(题目难度,困难)给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。示例 1:输入:s = “barfoothefoobarman”,words = [“foo”,“bar”]输出:[0,9]...原创 2019-04-29 15:47:55 · 729 阅读 · 0 评论 -
leetcode 29. 两数相除(Java版)
题目名,两数相除,表面看起来人畜无害。结果…,他喵的提交十几次才过。题目描述(题目难度,中等)给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。示例 1:输入: dividend = 10, divisor = 3输出: 3示例 2:输入: di...原创 2019-04-19 16:53:45 · 658 阅读 · 0 评论 -
leetcode 34. 在排序数组中查找元素的第一个和最后一个位置(Java版)
题目描述(题目难度,中等)给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例 2:输入: nums = [5,...原创 2019-05-03 02:10:54 · 355 阅读 · 0 评论 -
搜索旋转排序数组
题目描述(题目难度,中等)假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6...原创 2019-05-02 23:09:35 · 214 阅读 · 0 评论