- 博客(22)
- 资源 (1)
- 收藏
- 关注
原创 刷题大王--二叉树套餐
二叉树非递归遍历 前序 //先序非递归遍历:使用栈的数据结构,先入右侧节点。 public static void preOrder(TreeNode root){ TreeNode p = root; Stack<TreeNode> stack = new Stack<>(); while (p != null || !stack.isEmpty()){ if (p != null){
2021-07-29 19:13:09
196
原创 深入理解JAVA多线程---线程池
线程池什么是线程池?线程池的优势线程池如何使用?线程池的主要参数任务缓存队列拒绝策略线程池的任务处理策略线程池的关闭 什么是线程池? 多线程的异步执行方式可以极大发挥出计算机的优势,但是频繁的创建和结束线程对系统的开销十分巨大,如果不加以控制可能会造成负面影响.因此引入了线程池来管理创建的线程. 为了避免重复的创建线程,线程池的出现可以让线程进行复用。通俗点讲,当有工作来,就会向线程池拿一个线程,当工作完成后,并不是直接关闭线程,而是将这个线程归还给线程池供其他任务使用。 线程池的优势 (1)降低系统资源消
2021-01-30 19:34:37
298
原创 深入理解JAVA多线程---对synchronized的锁优化
Synchronized优化前言JDK1.6之前JDK1.6之后一.锁升级偏向锁为什么引入偏向锁偏向锁的升级偏向锁的撤销偏向锁的取消轻量级锁为什么引入轻量级锁轻量级锁加锁轻量级锁解锁和膨胀几种锁的对比二.锁粗化三.锁消除 前言 在多线程并发编程中Synchronized一直是元老级的角色,很多人都称呼它为重量级锁.但是随着JDK1.6对Synchronized进行了各种优化之后,有些情况下它并不呢么重了,那么接下来我们就学习一下究竟进行了那些优化. JDK1.6之前 在JDK1.6之前Synchronize
2021-01-15 23:08:32
267
原创 深入理解JAVA多线程---对象及变量的并发访问(synchronized和volatile关键字)
synchronized和volatile关键字前言线程不安全问题解决线程不安全问题synchronized实现原理volatile 前言 在多线程开发过程中,难免遇到很多线程不安全的问题,例如多个线程对一个变量进行访问和修改,就会产生"脏读".因此利用好synchronized和volatile关键字是多线程的关键一步. 线程不安全问题 首先我们来看一段线程不安全的代码: public class synchronizedAndVolatile { public static int i = 0;
2021-01-13 23:46:03
286
原创 深入理解JAVA多线程---多线程的常用操作
多线程常用操作线程启动(start())线程名称的设置和获取线程休眠(sleep())线程让步(yield())等待线程终止(join())线程停止运行(wait())唤醒线程(notify())唤醒全部线程(notifyAll())线程的停止线程的优先级 线程启动(start()) 上文中已将提到了线程的几种创建方法,当线程创建后调用start()方法就可以启动线程了. //线程类继承Runnable接口 static class MyThread implements Runnable{
2021-01-09 00:25:24
191
原创 深入理解JAVA多线程---线程的几种创建方法
多线程前言什么是进程? 前言 现代计算机的处理能力越发的强大,多线程可谓是程序员必须要熟练应用的技能,本人将记录自己学习多线程总结出来的要点希望对读者有一丝的启发.文章大部分来自书籍JAVA多线程编程核心技术,也推荐大家对多线程有一定了解后去品读一定会有很多的收获. 什么是进程? 在学习多线程之前我们必须要对进程和线程有着很清晰的认识. 进程: ...
2021-01-03 00:51:54
484
1
原创 深入理解JVM---垃圾收集器
垃圾收集器HotSpot中的垃圾收集器Serial收集器Serial Old收集器(标记-整理算法)ParNew 收集器(复制算法)Parallel Scavenge收集器(复制算法)Parallel Old收集器(标记-整理算法)CMS收集器(标记-清除算法)G1垃圾收集器G1收集器的特点: HotSpot中的垃圾收集器 Serial收集器 新生代单线程收集器,收集和标记都是单线程,意味着它只会使用一个 CPU 或一条收集线程去完成收集工作,并且在进行垃圾回收时必须暂停其它所有的工作线程直到收集结束。
2020-12-27 17:49:16
183
原创 深入理解JVM---垃圾回收机制
垃圾回收机制垃圾回收机制垃圾垃圾判断算法引用计数算法 垃圾回收机制 程序运行过程中难免产生一些不被引用的对象和数据占用JVM的空间,这就是我们所说的"垃圾".C 和 C++ 都需要程序员手动去处理这些垃圾,而JAVA的JVM中的垃圾回收机制自动的就实现了’内存动态分配’和’垃圾回收’(GC). 垃圾 什么是垃圾? 要想进行垃圾回收就先确定什么是垃圾,在JVM眼中,"垃圾"是指堆中"不再被引用"的对象 垃圾判断算法 引用计数算法 在对象中添加一个计数器,当对象被引用的时候计数器就加1,当引用失效
2020-11-26 20:35:40
238
原创 深入理解JVM---类加载
类加载的过程 当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化 1.加载 加载指的是将类的class文件读入到内存,并为之创建一个java.lang.Class对象,也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象。 ...
2020-11-23 21:34:53
431
2
原创 深入了解JVM---JVM内存模型
什么是JVM? JVM它是Java Virtual Machine 的缩写,主要是通过在实际计算机模仿各种计算机功能来实现的。Java能够被称为“一次编译,到处运行”的原因就是Java屏蔽了很多的操作系统平台相关信息,使得Java只需要生成在JVM虚拟机运行的目标代码也就是所说的字节码,就可以在多种平台运行。 JVM的内存区域 了解JRE、JVM、JDK三者的关系是什么 JDK是Java程序员常用的开发包、目的就是用来编译和调试Java程序的。JRE是指Java运行环境,也就是我们的写好的程序必须在
2020-11-20 22:52:27
298
原创 常见的七大排序(冒泡,插入,选择,归并,堆,快速,希尔)
七大排序一:直接插入排序二:希尔排序三:选择排序四:堆排序五:冒泡排序六:快速排序七:归并排序排序复杂度总结 一:直接插入排序 原理: 整个区间被分为: 有序区间 无序区间 每次选择无序区间的第一个元素,在有序区间内选择合适的位置插入 //插入排序 public static void inSort(int[] n){ for (int i = 1; i < n.len...
2020-04-14 20:32:44
483
原创 数据结构------优先级队列(堆)
堆 概念: 堆逻辑上是一棵完全二叉树 堆物理上是保存在数组中 满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆 反之,则是小堆,或者小根堆,或者最小堆 堆的基本作用是,快速找集合中的最值 如何构建一个堆呢? 首先建堆需要借助一个调整的过程,根据需要向上或者向下调整根节点的位置,然后从第一个非叶子节点开始进行调整,就可以得到一个堆. 代码实现: //从最后一个非叶子节...
2020-04-13 18:06:02
270
原创 数据结构------二叉树
二叉树概念 一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。 二叉树特点: 每个结点最多有两棵子树,即二叉树不存在度大于 2 的结点. 二叉树的子树有左右之分,其子树的次序不能颠倒. 两种特殊的二叉树 完全二叉树: 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个...
2020-04-08 20:53:47
201
原创 数据结构------List的运用
List的运用 list(有序、可重复) List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法,查询速度快。因为往list集合里插入或删除数据时,会伴随着后面数据的移动,所有插入删除数据速度慢。 ArrayList ArrayList是基于数组的,在初始化ArrayList时,会构建空数组(Object[] elementData={})。ArrayL...
2020-03-26 14:36:50
324
原创 不允许创建临时变量,交换两个数的内容.C语言表示
这个问题难点在于算法,不创建新的临时变量交换两个数.只有把两个数相加,赋值给其中一个再把另一个减去如此一来就实现了交换数值. 核心算法 a=a+b b=a-b a=a-b 代码如下: #include<stdio.h> int main() { int a=1,b=2; printf("交换前a=%d,b=%d\n", a, b); a = a + b; b = a - b; ...
2019-11-12 18:15:25
164
原创 求两个数的最大公约数(辗转相减法)
更相减损法:也叫更相减损术,是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。 《九章算术》是中国古代的数学专著,其中的“更相减损术”可以用来求两个数的最大公约数,即“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。” 翻译成现代语言如下: 第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;...
2019-11-12 18:01:54
11701
原创 将10个数按从大到小输出。
如题这种排列大小的问题都可以用冒泡排序法,讲大的数或者小的数一个一个比较之后向上移动,从而达到排列的效果. 代码如下 #include<stdio.h> int main() { int i, j,x; char a[10] = { 3,8,1,5,6,7,2,9,4,0}; for (j = 0; j < 10; j++) { for (i = 0; i < 1...
2019-11-12 17:16:07
1620
原创 求10 个整数中最大值。
先初始化一个变量,将数组中一个数复制给它,再让它与其他数比较,若有比它大的交换就把大的数赋值给max,一遍下来就可以找出max.代码很简单 程序如下: #include<stdio.h> int main() { int max, i; char a[10] = { 2,8,4,6,7,0,5,3,1,9 }; max = a[0]; for (i = 0; i < 10...
2019-11-12 16:44:57
220
原创 给定两个整形变量的值,将两个值的内容进行交换。
问题很简单不做过多描述,加一个第三变量寄存一下即可. 代码如下: #include<stdio.h> int main() { int a, b, c; a = 1; b = 2; printf("a=%d,b=%d\n", a, b); c = a; a = b; b = c; printf("交换后\n"); printf("a=%d,b=%d",a,b); r...
2019-11-12 16:20:23
170
原创 判断1000-2000年之中的闰年(c语言)
闰年是指能被4整除但不能被100整除的年份叫做闰年. 因此这个代码实现只需要简单地加if判断语句,加上如上两个条件,在for循环下就可实现找出闰年, 代码如下: #include <stdio.h> int main() { int x, y, z; for (x = 1000; x < 2001; x++) { if (x % 4 == 0 && x %...
2019-11-11 22:17:31
281
原创 输出乘法口诀表(c语言表达)
输出乘法口诀并不难,只需要定义三个变量x,y,z利用两个for循环即可,x*y=z;编程过程中发现难点在于怎么让乘法口诀自己排成表的形式,研究后发现只要当x=y是切换行就可以了,于是利用if语句即可解决这个问题,代码如下. 程序: #include <stdio.h> int main() { int x, y, z; for (x = 1; x < 10; x++) { ...
2019-11-11 22:10:53
687
原创 打印100~200 之间的素数(c语言表达)
打印100~200 之间的素数 首先弄清楚素数的概念:素数是除本身和1之外没有其他因数的一类数. 判断一个数x是否为素数可判断在2到sqrt(x)是否有x的因子没有则x为素数,反之就不是素数. 因此可以用c语言程序简单表示出来,程序如下: #include<stdio.h> #include<math.h> int main() { for (int x = 100; x...
2019-11-11 20:50:46
416
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅