自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 RabbitMQ介绍

RabbitMQ

2022-09-02 12:36:39 529 1

原创 JUC高并发编程(LockSupport与线程中断)

​   中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的interrupt方法,该方法也仅仅是将线程对象的中断标识设成true;接着你需要自己写代码不断地检测当前线程的标识位,如果为true,表示别的线程要求这条线程中断,此时究竟该做什么需要你自己写代码实现。​   每个线程对象中都有一个标识,用于表示线程是否被中断;该标识位为true表示中断,为false表示未中断;......

2022-08-03 16:06:02 200

原创 JUC高并发编程(锁)

ReentrantLock可以实现公平锁和非公平锁。ReentrantLock默认实现的是非公平锁。ReentrantLock的获取锁和释放锁必须成对出现,锁了几次,也要释放几次。释放锁的操作必须放在finally中执行。lockInterruptibly()实例方法可以相应线程的中断方法,调用线程的interrupt()方法时,lockInterruptibly()方法会触发异常。关于异常说一下,看到方法声明上带有方法而触发。...

2022-08-02 15:15:33 214

原创 JUC高并发编程之CompletableFuture

Future接口定义了操作异步任务执行一些方法,如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等。Callable接口中定义了需要有返回的任务需要实现的方法为什么使用异步任务?当主线程让一个子线程去执行任务,子线程可能比较耗时,启动子线程开始执行任务后,主线程就去做其他事情了,过了一会才去获取子任务的执行结果。get()阻塞 一旦调用get()方法,不管是否计算完成都会导致阻塞2.2、isDone()轮询isDone()轮询轮询的方式会耗费无

2022-08-01 20:40:45 403

原创 JUC高并发编程简介

JUC就是java.util.concurrent工具包的简称。这是一个处理线程的工具包。

2022-08-01 15:27:59 114

原创 Floyd算法(java)

一、Floyd算法简介  Floyd算法是求解每对顶点之间的最短路径,时间复杂度为O(∣V∣3)O(|V|^3)O(∣V∣3)。二、Floyd算法思想  Floyd算法的基本思想是:  递推产生一个n阶方阵序列A−1,A0,...,Ak,...,An−1A^{-1},A^{0},...,A^{k},...,A^{n-1}A−1,A0,...,Ak,...,An−1,其中Ak[i][j]A^{k}[i][j]Ak[i][j]表示从顶点viv_{i}vi​到顶点vjv_{j}vj​的路径长度,k表示绕

2022-02-09 11:59:41 1411

原创 Dijkstra算法实现(java)

一、Dijkstra算法介绍  Dijkstra(迪杰斯特拉)算法是求解单源最短路径的经典算法,其原理也是基于贪心策略的。二、Dijkstra算法原理  Dijkstra算法设置一个集合SSS记录已求得的最短路径的顶点,初始时把源点v0v_{0}v0​放入SSS,集合SSS每并入一个新顶点viv_{i}vi​,都要修改源点v0v_{0}v0​到集合V−SV-SV−S中顶点当前的最短路径长度值。  在构造的过程中还设置了两个辅助数组:(1)dist[]:记录从源点v0v_{0}v0​到其他各顶点当

2022-02-08 17:59:25 4661

原创 Kruskal算法(java)

一、Kruskal算法介绍  Kruskal算法是一种构造最小生成树的算法。时间复杂度为O(∣E∣log∣E∣)O(|E|log|E|)O(∣E∣log∣E∣)。Kruskal算法适合于边稀疏而顶点较多的图。二、Kruskal算法原理  (1)初始时为只有n个顶点而无边的非连通图T,每个顶点自成一个连通分量。  (2)按照边的权值由小到大的顺序,不断选取当前未被选取过且权值最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入T,否则舍弃此边而选择下一条权值最小的边。换句话说,加入的边不能

2022-02-02 17:11:31 2298 2

原创 Prim算法(java)

一、Prim算法介绍  Prim(普利姆)算法是一种构造最小生成树的算法。Prim算法的时间复杂度为O(∣V∣2)O(|V|^2)O(∣V∣2),不依赖于EEE,因此它适用于求解边稠密的图的最小生成树。二、Prim算法原理  (1)初始时从图中任取一顶点加入最小生成树MinTree顶点集合中。  (2)选择一个与当前MinTree中顶点集合距离最近的顶点,并将该顶点和相应的边加入MinTree中,每次操作后MinTree中的顶点数和边数都增1。  (3)重复(2)步骤,直到所有顶点都加入到MinT

2022-02-02 16:48:51 3657

原创 串的模式匹配算法KMP(java)

一、串的模式匹配算法  子串的定位操作通常称为串的模式匹配,它求的是子串(常称模式串)在主串中的位置。下面时一种不依赖于其他串操作的暴力匹配算法,最坏时间复杂度为O(m∗n)O(m*n)O(m∗n)。public static int violenceMatch(String s, String p) { char[] s1 = s.toCharArray(); char[] s2 = p.toCharArray(); int i = 0, j = 0;

2022-01-29 20:19:48 1821 1

原创 动态规划之背包问题(java)

一、动态规划  动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。二、基本思想  (1)将大问题划分为小问题进行解决,从而一步步获得最优解;  (2)动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。  (3)与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。(即下一次求解是在上一次得到的最优解基础上进行的)  (4)可以用一个表来记录所有

2022-01-28 17:49:45 2578

原创 分治算法之汉诺塔问题(java)

一、分治算法  分治算法是将一个规模为NNN的问题分解为KKK个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。二、基本思想  当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以

2022-01-28 14:33:24 1020

原创 数据结构之图的广度优先遍历BFS(java)

一、广度优先遍历  广度优先搜索(Breadth-First-Search, BFS)类似于二叉树的层序遍历算法。基本思想是:  首先访问起始顶点vvv,接着由vvv出发,依次访问vvv的各个未访问过的邻接顶点w1,w2,...,wiw_{1},w_{2},...,w_{i}w1​,w2​,...,wi​,然后依次访问w1,w2,...,wiw_{1},w_{2},...,w_{i}w1​,w2​,...,wi​的所有未被访问过的邻接顶点;再从这些访问过的顶点出发,访问它们所有未被访问过的邻接顶点,直

2022-01-25 17:05:24 354

原创 数据结构之图的深度优先遍历DFS(java)

一、深度优先遍历  深度优先搜索(Depth-First-Search,DFS)类似于树的先序遍历。它的基本思想如下:  首先访问图中某一起始顶点vvv,然后由vvv出发,访问与vvv邻接且未被访问的任一顶点w1w_{1}w1​,再访问与w1w_{1}w1​,邻接且未被访问的任一顶点w2w_{2}w2​……重复上述过程。当不能再继续向下访问时,依次退回到最近被访问的顶点,若它还有邻接顶点未被访问过,则从该点开始继续上述搜索过程,直至图中所有顶点均被访问过为止。package com.haiyang

2022-01-25 12:44:37 448

原创 数据结构之图的创建(邻接矩阵存储)

package com.haiyang.datastructure.graph;import java.util.ArrayList;import java.util.Arrays;/** * 图的初始化 * * @author haiYang * @create 2022-01-23 16:06 */public class GraphDemo { public static void main(String[] args) { int n = 5;

2022-01-23 16:34:25 559

原创 数据结构之平衡二叉树的创建(java)

package com.haiyang.datastructure.avl;/** * @author haiYang * @create 2022-01-22 16:31 */public class AVLTreeDemo { public static void main(String[] args) { int[] ints = {10, 11, 7, 6, 8, 9}; AVLTree avlTree = new AVLTree();

2022-01-22 17:49:27 317

原创 数据结构之二叉排序树的创建和删除(java)

一、二叉排序树的定义  二叉排序树(也称二叉查找树)或者是一棵空树,或者是具有下列特性的二叉树:  1)若左子树非空,则左子树上所有结点的值均小于根结点的值。  2)若右子树非空,则右子树上所有结点的值均大于根结点的值。  3)左、右子树也分别是一棵二叉排序树。  根据二叉排序树的定义,左子树结点值<根结点值<右子树结点值,所以对二叉排序树进行中序遍历,可以得到一个递增的有序序列。二、二叉排序树的查找  二叉排序树的查找是从根结点开始,沿某个分支逐层向下比较的过程。若二叉排序

2022-01-22 15:25:45 926

原创 数据结构哈夫曼树的应用之文件的压缩和解压(java)

package com.haiyang.datastructure.huffmancode;import com.sun.org.apache.bcel.internal.generic.NEW;import java.io.*;import java.util.*;/** * @author haiYang * @create 2022-01-19 15:31 */public class HuffmanCode { //标记最后一个数的位数 static int l

2022-01-21 17:08:23 604

原创 数据结构之哈夫曼树及编码的实现(java)

package com.haiyang.datastructure.huffmancode;import java.util.*;/** * @author haiYang * @create 2022-01-19 15:31 */public class HuffmanCode { public static void main(String[] args) { String content = "The most heated arguments often oc

2022-01-20 16:15:55 420

原创 数据结构之堆排序(java)

package com.haiyang.datastructure.sort;import java.util.Arrays;/** * @author haiYang * @create 2022-01-18 14:09 */public class HeapSort { //堆排序 public static void heapSort(int[] arr){ int temp=0; //将序列初始化为大顶堆 for (in

2022-01-18 14:57:32 457

原创 数据结构之中序线索二叉树的构建及遍历(java)

package com.haiyang.datastructure.threadbinarytree;/** * @author haiYang * @create 2022-01-15 15:45 */public class ThreadedBinaryTree { public static void main(String[] args) { TTreeNode root = new TTreeNode(1, "haiyang"); TTreeNod

2022-01-17 17:32:38 272

原创 数据结构之二叉树的遍历(java)

package com.haiyang.datastructure.binarytree;/** * @author haiYang * @create 2021-12-28 9:14 */public class BinaryTreeDemo { public static void main(String[] args) { TreeNode root = new TreeNode(1, "haiyang"); TreeNode node1 = new

2022-01-17 11:27:56 369

原创 数据结构之散列表(java)

1、散列表的基本概念(1)散列函数:一个把查找表中的关键字映射成该关键字对应的地址的函数,记为 Hash(key)=AddrHash(key)=AddrHash(key)=Addr(这里的地址可以是数组下标、索引或内存地址等)。  散列函数可能会把两个或两个以上的不同关键字映射到同一地址,称这种情况为冲突,这些发生碰撞的不同关键字称为同义词。(2)散列表:根据关键字而直接进行访问的数据结构。也就是说,散列表建立了关键字和存储地址之间的一种直接映射关系。  理想情况下,对散列表进行查找的时间复杂度为O

2021-12-27 15:32:59 433

原创 数据结构常用查找算法(java)

1、线性查找package com.haiyang.datastructure.search;/** * @author haiYang * @create 2021-12-25 15:22 */public class SeqSearch { public static void main(String[] args) { int[] arr = new int[]{1, 4, 61, 31, 8564, 131, 13, 1, 6413, 1, 4};

2021-12-26 13:35:36 454

原创 数据结构常用排序算法

1、冒泡排序package com.hrbeu.datastructure.sort;import java.util.Arrays;/** * @author haiYang * @create 2021-12-22 14:51 */public class BubbleSort { public void bubbleSort(int[] arr){ int temp = 0; boolean flag = false;//用于代码优化,在某一行

2021-12-25 14:56:48 294

原创 struts2类型转换

概述  从一个 HTML 表单到一个 Action 对象,类型转换是从字符串到非字符串。HTTP 没有 “类型” 的概念。每一项表单输入只可能是一个字符串或一个字符串数组。 在服务器端, 必须把 String 转换为特定的数据类型。  在 struts2 中,把请求参数映射到action属性的工作由Parameters拦截器负责,它是默认的defaultStack拦截器中的一员。 Parameters 拦截器可以自动完成字符串和基本数据类型之间转换。类型转换错误  如果类型转换失败:若 A

2021-12-22 13:09:22 117

原创 数据结构栈的应用:中缀表达式转后缀表达式

一、中缀表达式转后缀表达式算法思想:(1)从左向右开始扫描中缀表达式;(2)遇到数字时,加入后缀表达式(3)遇到运算符时:  a.若为 '(',入栈;  b.若为 ')',则依次把栈中的运算符加入后缀表达式,直到出现'(',从栈中删除'(';  c.若为除括号外的其他运算符,当其优先级高于除'('外的栈顶运算符时,直接入栈。否则从栈顶开始,依次弹出比当前处理的运算符优先级高和优先级相等的运算符,直到一个比它优先级低的或遇到了一个左括号为止。(4)当扫描的中缀表达式结束时,栈中的所有运算符依次出

2021-12-22 12:59:53 868

空空如也

空空如也

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

TA关注的人

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