3 阿演

廊坊云动网络科技有限公司 - 软件工程师

我要认证

生活待我不薄

等级
TA的排名 5w+

volatile关键字,内存可见性问题

现在有一种这样的情况public class TestVolatile { public static void main(String[] args) { ThreadDemo td = new ThreadDemo(); new Thread(td).start(); while(true){ if(td.isFlag()){ System.out.println("!!!!!!!!

2020-10-12 10:55:12

赫夫曼树的相关概念和创建代码及原理

基本介绍1,给定n个权值作为n个叶子结点,构造一颗二叉树,若该树的带权路径长度(wpl)打到最小值,称这样的二叉树为最优二叉树,也称为赫夫曼树。2,赫夫曼树是带权路径长度最短的树,权值较大的结点离跟较近。相关概念1,路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或者孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根节点的层数为1,则从根节点到第L层的路径长度就是L-1。2,结点的权及带权路径长度:若将树中结点赋一个有着某种含义的值,则这个值称为该结点的权。结点

2020-09-16 16:37:50

堆排序的思路说明和代码实现

基本介绍1,堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度都是O(nlogn),也就是线性阶,它也是不稳定排序2,堆是具有以下性质的完全二叉树: 每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆注意:这里没有要求结点的左孩子的值和右孩子的值的大小关系...

2020-09-15 15:06:54

线索化二叉树的概念和实现

什么是线索化二叉树?将一个数列{1,3,6,8,10,14}构建成一颗二叉树 如图这里有几个问题1,当我们对上面的二叉树进行中序遍历时,数列为{8,3,10,1,14,6}2,但是6,8,10,14这几个结点的左右指针,并没有完全利用上3,我们可以充分利用各个结点的左右指针,让各个结点可以指向自己的前后结点解决办法就是线索化二叉树线索化二叉树的介绍1,n个结点的二叉树中含有n+1个空指针域。利用二叉树中的空指针域,存放指向该结点在某种遍历次序(前序,中序,后序)下的前驱和后

2020-09-03 16:10:38

顺序存储二叉树

什么是顺序存储二叉树?从数据存储来看,数组储存方式和树的存储方式可以互相转换,即数组可以转换成树,树也可以转换成数组,如下图顺序存储二叉树的特点:1,顺序二叉树通常只考虑完全二叉树2,第n个元素的左子结点在数组中的下标为2*n+13,第n个元素的右子结点在数组中的下标为2*n+24,第n个元素的父节点在数组中的下标为(n-1)/25,n:表示二叉树中的第几个元素(从0开始编号,如上图)...

2020-08-27 16:23:47

Java实现二叉树的相关操作

相关概念如果一个二叉树的所有叶子节点都在最后一层,并且节点总数为2的n次方减一,这里n为层数,则这个二叉树就是一个满二叉树。如果一个二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点做左边连续,倒数第二层的叶子节点在右边连续,则这个二叉树就是一个完全二叉树。二叉树的遍历二叉树的遍历分为三种,分别是前序遍历,中序遍历,后序遍历前序遍历:先输出父节点,再遍历左子树和右子树 1,先输出当前节点(初始的时候是根节点) 2,如果左子节点不为空,...

2020-08-26 15:30:18

使用哈希表对数据进行增删改查操作

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。public class HashTableDemo { public static void main(String[] args) { HashTable hashTable = new HashTable(7); has.

2020-08-11 16:23:56

hibernate操作Oracle出现违反唯一约束条件

出现这个问题的原因无非是主键冲突,我这里引起主键冲突的原因是实体类使用的ID策略为GenerationType.SEQUENCE这个策略是在数据库中创建一个序列文件,在其中根据图中所指位置实现每次自增1我是在更换数据库后出现的这个问题,意思就是现在数据库序列文件产生的ID在之前数据库序列文件已经产生过,并且那条数据还存在数据库中处理方法可以把现在使用数据库中报主键冲突的表数据清空,我使用的是这个方法。如果不能删数据的话,使用另一个处理方法 :修改Oracle序列...

2020-08-07 16:07:24

查找算法之 插值查找

插值查找,有序表的一种查找方式。插值查找是根据查找关键字与查找表中最大最小记录关键字比较后的查找方法。插值查找基于二分查找,将查找点的选择改进为自适应选择,提高查找效率。对于一个有序且分布均匀的数组,使用差值查找比使用二分查找要快很多 public static void main(String[] args) { int[] arr = new int[33]; for (int i = 0; i < 33; i++) { ar

2020-08-06 11:13:43

使用二分查找在有序数组里面查找元素

返回所有跟所求值匹配的元素下标public class BinarySearch { public static void main(String[] args) { int[] arr = {1, 3, 22, 22,444, 534, 1000}; List<Integer> resultIndex = binarySearch(arr, 0, arr.length - 1, 22); System.out.println(res

2020-08-04 17:06:55

使用递归的回溯算法解决八皇后问题

什么是八皇后问题?八皇后问题(英文:Eight queens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。计算机发明后,有多种计算机语言可

2020-07-13 11:40:02

使用递归解决迷宫回溯问题

这里使用一个二维数组来表示迷宫,1表示墙,即不能走的地方。起点从左上角的0开始,出口在右下角的0.创建地图 public static void main(String[] args) { //使用一个二维数组模拟迷宫 int map[][] = new int[8][7]; //使用1表示墙 //四周都是墙,全部置为1 for (int i = 0; i < 7; i++) {

2020-07-09 14:59:29

栈实现综合计算器、逆波兰计算器

对于一个字符串类型的表达式,实现基础的加减乘除运算String expression = "8/2+2*5-4";使用栈来实现这个表达式的解析和运算实现思路:1,通过一个index来遍历我们的表达式2,如果发现是一个数字,判断下一位是不是运算符,如果是,把数字入数栈。如果不是,继续扫描,拼接数字3,如果发现是一个运算符,判断符号栈是否为空,如果为空,直接入符号栈。如果不为空,就跟符号栈中栈顶的符号进行比较,如果优先级小于等于栈顶的符号,就需要从数栈中pop出两个数,从符号栈中pop

2020-07-05 21:32:28

使用环形链表解决约瑟夫问题

约瑟夫问题:据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一

2020-06-25 20:53:01

单链表双链表的实现和常见问题

什么是链表?1,链表是以节点的方式存储的,链式存储2,每个节点包含data域,next域指向下一个节点3,链表的各个节点不一定是链式存储的4,链表分带头节点的链表和不带头结点的链表下面用代码实现一个单向链表首先定义一个类用来存储到链表中/** * 定义HeroNode,每个HeroNode对象就是一个节点 */public class HeroNode { public int no;//编号 public String name;//名字 pub

2020-06-17 11:34:22

java使用数组模拟队列、环形队列

什么是队列?队列是一个有序列表,可以用数组或链表来实现。遵循先入先出的原则。我们来用代码实现一个简单的队列public class ArrayQueue<T> { private int maxSize;//表示数组的最大容量 private int front;//队列头 private int rear;//队列尾 private T[] arr;//用于存放数据的数组 public ArrayQueue(int arrMaxSize){

2020-06-06 17:01:53

二维数组的压缩存储,稀疏数组

在二维数组只有少部分有效数据的时候,为了不存储过多的无效数据,我们可以使用稀疏数组来存储二维数组。下面是一个五子棋的残局,用二维数组表示之后,会发现有很多0的无效数据,这个时候就可以使用稀疏数组保存二维数组。...

2020-06-06 11:08:19

NIO详解----NIO与传统IO的区别 ,NIO的原理和使用

传统IO是面向流,NIO是面向缓冲区面向流的传统IO建立的通道是单向的,NIO创建的通道是双向的NIO的核心在于,通道和缓冲区。通道表示打开到IO设备的连接,若需要使用NIO,需要获取用于连接IO设备的通道以及用于容纳数据的缓冲区。然后操作缓冲区,对数据进行处理。简而言之就是 通道负责传输,缓冲区负责存储。1> 缓冲区缓冲区的底层用的就是数组,根据传输数据类型的不同,java为我们提供了相应类型的缓冲区ByteBuffer、CharBuffer、ShortBuffer、..

2020-06-02 09:52:10

java8中的Optional容器类,避免空指针异常

java8中使用Optional容器类来尽可能的避免或快速定位空指针异常Optional类的基本使用public class Person { private Integer age; private Double salary; public Person() { } public Person(Integer age, double salary) { this.age = age; this.salary = s

2020-05-28 10:20:13

java8中的并行流,封装ForkJoin

并行流就是执行任务的时候分配给多个线程队列执行,但是如果某一个队列执行完成,其他队列还在执行,这个时候执行完成的队列就是空闲状态java8中的并行流,使用的是工作窃取模式,在一个队列的任务执行完成之后,他会去其他没有执行完成的任务队列里面窃取尾部的任务来执行。正常情况下我们计算一个大一点的数,这个耗时三十多秒 public void test(){ Long num = 100000000000L; long sum = 0; Inst

2020-05-27 18:23:32

查看更多

勋章 我的勋章
  • 签到新秀
    签到新秀
    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 新人勋章
    新人勋章
    用户发布第一条blink获赞超过3个即可获得
  • 阅读者勋章Lv2
    阅读者勋章Lv2
    授予在CSDN APP累计阅读博文达到7天的你,是你的坚持与努力,使你超越了昨天的自己。
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 1024勋章
    1024勋章
    #1024程序员节#活动勋章,当日发布原创博客即可获得
  • 勤写标兵Lv2
    勤写标兵Lv2
    授予每个自然周发布4篇到6篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。
  • 学习力
    学习力
    《原力计划【第二季】》第一期主题勋章 ,第一期活动已经结束啦,小伙伴们可以去参加第二期打卡挑战活动获取更多勋章哦。
  • 原力新人
    原力新人
    在《原力计划【第二季】》打卡挑战活动中,成功参与本活动并发布一篇原创文章的博主,即可获得此勋章。