- 博客(290)
- 资源 (7)
- 收藏
- 关注
原创 第十章 Executor框架
第十章 Executor框架线程的工作单位是Runnable和Callable,执行机制由Executor框架提供。10.1Executor框架简介10.1.1Executor框架的两级调度在上层,Java多线程程序通常把应用分解成为若干任务,然后使用用户级的调度器(Executor框架)将这些任务映射成为固定数量的线程;在底层,操作系统内核将这些线程映射到硬件处理器上。...
2018-06-13 08:59:31
906
原创 第九章 java中的线程池
第九章 java中的线程池线程池的好处:1.降低资源消耗2.提高响应数独3.提高线程的可管理性9.1线程池实现原理1.线程池判断核心线程池里的线程是否都在执行任务。如果不是,那就创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下个流程。2.线程池来判断工作队列是否已经满。如果工作队列没有满,则将新提交的任务存储子啊这个工作队列里。如果工...
2018-06-12 16:34:45
841
原创 第八章 Java中的并发工具类
第八章 Java中的并发工具类8.1等待多线程完成的CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。类似于Thread.join()package cn.edu.hust.atomic;public class CountDownLatchTest { public static void main(String[...
2018-06-12 16:31:43
803
原创 第七章 Java中的13个原子操作类
第七章 Java中的13个原子操作类4中类型的原子更新方式,分别是原子更新基本类型、原子更新数组、原子更新引用和原子更新属性。主要使用Unsafe实现的包状态类。7.1原子更新基本类型AtomicBoolean:原子更新布尔类型AtomicInteger:原子更新整型AtomicLong:原子更新长整型以AtomicInteger进行讲解:int addAndGet...
2018-06-12 16:30:13
927
原创 第六章 Java并发容器和框架
第六章 Java并发容器和框架6.1ConcurrentHashMap的实现原理和使用ConcurrentHashMap式线程安全且高效的HashMap。6.1.1为什么要选择ConcurrentHashMap1.线程不安全的HashMap2.效率低下的HashTableHashTable使用synchronized来保证线程的安全,在线程激烈的情况下,Hashta...
2018-06-12 16:28:12
916
原创 第五章 Java中的锁
第五章 Java中的锁5.1Lock接口获取锁后,发生过异常,锁不会释放。锁与synchronized关键字的对比:Lock接口的实现基本都是通过聚合了一个同步器的子类来完成线程访问控制的。5.2队列同步器AbstractQueuedSynchronizer同步器是构建锁和其他同步组件的基础框架。同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽...
2018-06-12 16:23:59
831
原创 第三章 Java内存模型
第三章 Java内存模型3.1Java内存模型的基础3.1.1并发编程模型的两个关键问题线程之间的通信机制有两种:共享内存和消息传递共享内存:线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。消息传递:线程之间没有公共状态,线程之间必须通过发送消息显示进行通信。Java的并发是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完...
2018-06-12 16:13:55
917
原创 Java性能调优(四):GC策略和程序调优
GC策略的优化 选择不同的GC收集器,会有不同的效果,CMS GC多数动作是和应用并发进行的,确实可以减少GC动作给应用造成的暂停。 对于web应用而言,在G1还不够成熟的情况下,CMS GC是不错的选择。程序调优CPU消耗严重的解决方法1.CPU us高的解决方法 CPU us高的原因主要是执行程序无任何挂起动作,且一直执行,导致CPU没有机会去调度执行其他的线程,导致线程饿死的现象。 以上图片...
2018-06-12 15:58:50
2043
原创 Java性能调优(三):程序执行和JVM调优
程序执行慢情况分析 有些情况是资源消耗不多,但程序执行仍然慢,这种现象多出现访问量不是非常大的情况下,造成这种原因有三种:锁竞争激烈 锁竞争激烈直接会造成程序执行慢。例如一个典型的例子是数据库连接池,通常数据库连接池提供的连接数是有限的。未充分使用硬件资源 可以优化程序,充分发挥硬件资源的座椅哦难过,此时可进行一定的优化充分使用硬件资源,提升程序的执行速度。数据量的增长 数据量增长通常也是造成程序...
2018-06-12 15:56:15
1297
原创 Java性能调优(二):IO和内存分析
文件IO消耗分析 Linux在操作文件的时候,先将文件放入文件缓存,直到内存不足或者进程使用。这是一种提升IO速度的方式。1.pidstat KB_rd/s表示每秒读,KB_wr/s每秒写2.iostat 查看历史IO网络IO分析 使用命令 sar -n FULL 1 2内存消耗分析 JVM内存消耗过多会导致GC喜欢 ii 次难过频繁,CPU消耗增加,应用线程的执行速度严...
2018-06-12 15:54:25
2660
原创 Java性能调优(一):调优的流程和程序性能分析
Java性能调优随着应用的数据量不断的增加,系统的反应一般会越来越慢,这个时候我们就需要性能调优。性能调优的步骤如下:寻找性能瓶颈 通常性能瓶颈的表象是资源消耗过多、外部处理系统的不足,或者资源消耗不多,但是程序的响应速度却达不到要求。下面的分析针对于Linux。CPU消耗分析 CPU主要用于中断、内核以及用户进程的处理;优先级为中断、内核和用户进程。我们首先有了解3个概念。1.上下文切换 线程从...
2018-06-11 19:31:41
9117
2
原创 464. 整数排序 II
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求给一组整数,按照升序排序。使用归并排序,快速排序,堆排序或者任何其他 O(n log n) 的排序算法。样例给出 [3, 2, 1, 4, 5], 排序后的结果为 [1, 2, 3, 4, 5]。解题思路 使用快排。实现代码class Solution {public: /** ...
2018-06-11 15:56:46
923
原创 457. 经典二分查找问题
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求在一个排序数组中找一个数,返回该数出现的任意位置,如果不存在,返回-1样例给出数组 [1, 2, 2, 4, 5, 5].对于 target = 2, 返回 1 或者 2.对于 target = 5, 返回 4 或者 5.对于 target = 6, 返回 -1.挑战O(logn) 的时间解题思路 ...
2018-06-11 15:55:00
888
原创 423. 有效的括号序列
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and ']', 判定是否是有效的括号序列。样例括号必须依照 "()" 顺序表示, "()[]{}" 是有效的括号,但 "([)]"则是无效的括号。解题思路 使用栈,如果匹配就出栈,看最后栈中是否有剩...
2018-06-11 15:52:29
879
原创 413. 反转整数
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求将一个整数中的数字进行颠倒,当颠倒后的整数溢出时,返回 0 (标记为 32 位整数)。样例给定 x = 123,返回 321给定 x = -123,返回 -321解题思路 使用队列,现将数字转化为一个个数,然后在重新拼凑,要注意数字溢出。实现代码class Solution {public:...
2018-06-11 15:49:07
864
原创 366. 斐波纳契数列
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求描述查找斐波纳契数列中第 N 个数。所谓的斐波纳契数列是指:前2个数是 0 和 1 。第 i 个数是第 i-1 个数和第i-2 个数的和。斐波纳契数列的前10个数字是:0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ...样例给定 1,返回 0给定 2,返回 1给定 10,返回 34解...
2018-06-11 15:45:41
891
原创 365. 二进制中有多少个1
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求计算在一个 32 位的整数的二进制表示中有多少个 1.样例给定 32 (100000),返回 1给定 5 (101),返回 2给定 1023 (1111111111),返回 10挑战If the integer is n bits with m 1 bits. Can you do it in O(m...
2018-06-11 15:43:14
1060
原创 213. 字符串压缩
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求设计一种方法,通过给重复字符计数来进行基本的字符串压缩。例如,字符串 aabcccccaaa 可压缩为 a2b1c5a3 。而如果压缩后的字符数不小于原始的字符数,则返回原始的字符串。可以假设字符串仅包括a-z的字母。样例str=aabcccccaaa 返回 a2b1c5a3str=aabbcc 返回...
2018-06-11 15:40:45
1226
原创 212. 空格替换
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求设计一种方法,将一个字符串中的所有空格替换成 %20 。你可以假设该字符串有足够的空间来加入新的字符,且你得到的是“真实的”字符长度。你的程序还需要返回被替换后的字符串的长度。样例对于字符串"Mr John Smith", 长度为 13替换空格之后,参数中的字符串需要变为"Mr%20John%20Sm...
2018-06-11 15:27:00
840
原创 211. 字符串置换
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求给定两个字符串,请设计一个方法来判定其中一个字符串是否为另一个字符串的置换。置换的意思是,通过改变顺序可以使得两个字符串相等。样例"abc" 为 "cba" 的置换。"aabc" 不是 "abcc" 的置换。解题思路 可以使用HashMap求解,先将字符串A的字符hash到里面,然后在将字符串B...
2018-06-11 15:23:45
1018
原创 204. 单例
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求单例 是最为最常见的设计模式之一。对于任何时刻,如果某个类只存在且最多存在一个具体的实例,那么我们称这种设计模式为单例。例如,对于 class Mouse (不是动物的mouse哦),我们应将其设计为 singleton 模式。你的任务是设计一个 getInstance 方法,对于给定的类,每次调用 ...
2018-06-10 11:53:28
1052
原创 181. 将整数A转换为B
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求如果要将整数A转换为B,需要改变多少个bit位?样例如把31转换为14,需要改变2个bit位。(31)10=(11111)2(14)10=(01110)2解题思路 将两个数相与,就可以得到不相同的1的个数的整数,然后再次判断1个数即可。实现代码class Solution {public: ...
2018-06-10 11:49:38
1138
原创 174. 删除链表中倒数第n个节点
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点。样例给出链表1->2->3->4->5->null和 n = 2.删除倒数第二个节点之后,这个链表将变成1->2->3->5->null.挑战O(n)时间复杂度解题思路 使用双...
2018-06-10 11:47:14
1018
原创 173. 链表插入排序
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求用插入排序对链表排序样例Given 1->3->2->0->null, return 0->1->2->3->null解题思路/** * Definition of singly-linked-list: * class ListNode { * ...
2018-06-10 11:44:19
1117
原创 172. 删除元素
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求描述给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度。元素的顺序可以改变,并且对新的数组不会有影响。样例给出一个数组 [0,4,4,0,0,2,4,4],和值 4返回 4 并且4个元素的新数组为[0,0,0,2]解题思路 循环数组,判断是否为目标元素,如果是,那么将移动数组。实现...
2018-06-10 11:41:27
1033
原创 167. 链表求和
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。样例给出两个链表 3->1->5->null 和 5->9->2->null,返回 8->0-&...
2018-06-10 10:50:35
1026
原创 166. 链表倒数第n个节点
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求描述找到单链表倒数第n个节点,保证链表中节点的最少数量为n。样例给出链表 3->2->1->5->null和n = 2,返回倒数第二个节点的值1.解题思路 使用双指针法,一个指针先走k-1步,另一个指针和前一个指针一起走,前一个指针到达末端后,前一个指针即是倒数第k的节点...
2018-06-10 10:46:56
1035
原创 165. 合并两个排序链表
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求描述将两个排序链表合并为一个新的排序链表样例给出 1->3->8->11->15->null,2->null, 返回 1->2->3->8->11->15->null。解题思路 使用归并排序。实现代码/** * Defin...
2018-06-10 10:43:49
1064
原创 159. 寻找旋转排序数组中的最小值
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求描述假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2)。你需要找到其中最小的元素。你可以假设数组中不存在重复的元素。样例给出[4,5,6,7,0,1,2] 返回 0解题思路 使用二分法,如果中间的数大于最前面,那么中间的数处于递增;...
2018-06-10 10:38:48
1074
原创 158. Valid Anagram
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求写出一个函数 anagram(s, t) 判断两个字符串是否可以通过改变字母的顺序变成一样的字符串。样例给出 s = "abcd",t="dcab",返回 true.给出 s = "ab", t = "ab", 返回 true.给出 s = "ab", t = "ac", 返回 false.挑
2018-06-09 20:19:17
1045
原创 157. 判断字符串是否没有重复字符
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求实现一个算法确定字符串中的字符是否均唯一出现样例给出"abc",返回 true给出"aab",返回 false挑战如果不使用额外的存储空间,你的算法该如何改变?解题思路 先排序,后查重。实现代码class Solution {public: /* * @param str: ...
2018-06-09 20:16:07
1196
原创 142. O(1)时间检测2的幂次
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求用 O(1) 时间检测整数 n 是否是 2 的幂次。样例n=4,返回 true;n=5,返回 false.挑战O(1) time解题思路 2的幂次,表明在二进制中,只有一个1.实现代码class Solution {public: /** * @param n: An int...
2018-06-09 20:12:42
1035
原创 134. LRU缓存策略
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求描述为最近最少使用(LRU)缓存策略设计一个数据结构,它应该支持以下操作:获取数据(get)和写入数据(set)。获取数据get(key):如果缓存中存在key,则获取其数据值(通常是正数),否则返回-1。写入数据set(key, value):如果key还没有在缓存中,则写入其数据值。当缓存达到上限...
2018-06-09 20:10:43
1031
原创 111. 爬楼梯
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求111. 爬楼梯假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部?样例比如n=3,1+1+1=1+2=2+1=3,共有3种不同的方法返回 3解题思路 根据数学归纳法,这是一个斐波拉契数列。实现代码class Solution {public...
2018-06-09 20:08:05
1053
原创 104. Merge K Sorted Lists
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求合并k个排序链表,并且返回合并后的排序链表。尝试分析和描述其复杂度。样例给出3个排序链表[2->4->null,null,-1->null],返回 -1->2->4->null解题思路 使用归并排序实现代码/** * Definition of ListNo...
2018-06-09 20:04:26
961
原创 102. 带环链表
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求给定一个链表,判断它是否有环。样例给出 -21->10->4->5, tail connects to node index 1,返回 true挑战不要使用额外的空间解题思路 使用两个指针,一个指针比另一个指针快,如果快的指针追上了慢的指针,那么就有环。实现代码/** * D...
2018-06-09 20:02:27
1024
原创 97. 二叉树的最大深度
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的距离。样例给出一棵如下的二叉树: 1 / \ 2 3 / \ 4 5这个二叉树的最大深度为3.解题思路 判断左右子树的深度即可。实现代码 /** * Definition of TreeNode:...
2018-06-09 19:59:14
994
原创 93. 平衡二叉树
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求描述给定一个二叉树,确定它是高度平衡的。对于这个问题,一棵高度平衡的二叉树的定义是:一棵二叉树中每个节点的两个子树的深度相差不会超过1。 样例给出二叉树 A={3,9,20,#,#,15,7}, B={3,#,20,15,7}A) 3 B) 3 / \ ...
2018-06-09 19:57:10
1063
原创 82. 落单的数
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求描述给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字。样例给出 [1,2,2,1,3,4,3],返回 4挑战一次遍历,常数级的额外空间复杂度解题思路 由于只有一个出现一次,其他均出现两次,那么采用异或,最后将会得到这个数。实现代码class Solution ...
2018-06-09 19:51:28
1062
原创 71. 二叉树的锯齿形层次遍历
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载。题目需求描述给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行)样例给出一棵二叉树 {3,9,20,#,#,15,7}, 3 / \ 9 20 / \ 15 7返回其锯齿形的层次遍历为:[ [3], [20,9], [15...
2018-06-06 10:05:06
1241
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅