自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(142)
  • 资源 (4)
  • 收藏
  • 关注

原创 gin的简单使用

包括获取参数,组装参数,文件的上传和下载package ginstudyimport ( "fmt" "github.com/gin-gonic/gin" "log" "net/http")//第一个Gin程序func GinHello(c *gin.Context) { c.JSON(200, gin.H{"message": "pong"})}// get方法获取参数并输出func GetParam(c *gin.Context) { //获取请求的全路径 fm.

2020-12-15 11:53:36 1091

原创 linux 下安装mysql

linux下mysql的安装非常费时,极容易出错,这里记录一下本次安装mysql的过程。本次安装,使用的是源码的方式安装。linux版本使用的是centos6。源码安装参考链接Linux下源码包安装MySQL感谢作者分享!注意:因为博客作者疏忽,/usr/local这个路径经常写错,以至于本人将mysql安装到/usr/ocal这个路径下,参考时需要注意。安全模式不需要密码,使用安全模式登入mysql之后,使用下面的方式设置新密码:set password for 用户名@..

2020-11-29 15:59:40 263 1

原创 使用阻塞队列实现并发数据安全

最近一段时间在学习golang,golang的一个亮点,就是并发编程。在并发编程中,虽然也支持显式的对并发代码进行加锁(这一点看来和java并无太大区别)。但go推荐使用channel进行线程间的通信,channel是一个线程安全的阻塞队列,使用channel,可以实现多线程(协程)之间的数据一致性。在java中,多线程实现数据一致性,一般会使用 synchronized或者volatile或者Lock,那么能不能使用java中的阻塞队列来保证数据的并发安全呢?下面是一段使用多线程求和的代码,使用s

2020-11-20 20:02:57 379

原创 go语言实现文件的读写和拷贝

package file_utilsimport ( "bufio" "fmt" "io" "io/ioutil" "os")// 打开文件func OpenFile(filePath string) { file,err:=os.Open(filePath) if err==nil{ fmt.Println("该文件不为空") }else{ fmt.Println(filePath,"不存在!") } fmt.Println(file) err=file.C.

2020-11-12 00:12:13 331

原创 自定义实现ReentrantLock

关于线程的CAS操作,借助了JDK中的 sun.misc.Unsafe类,该类如果直接调用,会抛出安全异常。这里使用反射技术创建sun.misc.Unsafe类的对象。使用JDK中的ConcurrentLinkedQueue作为队列。代码如下:import sun.misc.Unsafe;import java.lang.reflect.Field;import java.util.concurrent.ConcurrentLinkedQueue;import java.util.co

2020-09-05 15:18:46 279

原创 分治思想解决汉诺塔的问题

/** * 1,关于分治算法: * 2,使用分治思想解决汉诺塔的问题 * 3,解决汉诺塔问题的思路:无论有多少个盘,都可以分成两部分,最下面的1个盘和该盘上面的所有盘(假设这些盘都在A上)。 * step1:将1个盘上面的所有盘移动到B上。 * step2:将最下面的1个盘移动到C上。 * step3:将B上面的所有盘移动到C上(如何将B上面的盘移动到C上,) */public class Hanoitower { public static void main(Str.

2020-07-22 11:21:49 172

转载 红黑树简介

1,红黑树定义和性质红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质:性质1:每个节点要么是黑色,要么是红色。 性质2:根节点是黑色。 性质3:每个叶子节点(NIL)是黑色,在Java中,叶子结点是为null的结点。 性质4:每个红色结点的两个子结点一定都是黑色。 性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。从性质5又可以推出:性质5.1:如果一个结点存在黑子结点,那么该结点肯定有两个子结点2,节点的插入红黑树插入节点,默认是红色。需要变色

2020-07-22 11:14:28 206

转载 克鲁斯卡尔(Kruskal)算法之最小生成树

/** * 克鲁斯卡尔(Kruskal)算法实现最小生成树 */public class Kruskal{ //边的个数 private int edgeNum; //顶点数组 private char[] vertexs; //邻接矩阵 private int[][] matrix; //表示两个顶点不能联通 private static final int INF = Integer.MAX_VALUE; public .

2020-07-22 10:53:32 190

原创 有序数组查找算法:二分法和插值法

/** * 有序数组的值查找 */public class Search { public static void main(String[] args) { int[] arr={1,2,3,4,5,6,7,8,9,10}; //int i = binarySearch3(arr, 3); int i = binarySearch(arr, 91); System.out.println(i); } /**.

2020-07-22 10:39:26 311

原创 使用KMP算法进行字符串查找

/** * KMP算法解决字符匹配问题 */public class KMP { public static void main(String[] args) { String str1="ABABACEF"; String str2="BAC"; //System.out.println(foolWay2(str1,str2)); // System.out.println(kmpSearch(str1,str2,kmpNext.

2020-07-22 10:36:01 650

原创 普里姆(Prim)算法之最小生成树

涉及到的图如下:普利姆算法简介:普利姆(Prim)算法求最小生成树,也就是在包含n个顶点的连通图中,找出只有(n-1)条边包含所有n个顶点的连通子图,也就是所谓的极小连通子图普利姆的算法如下:设G=(V,E)是连通网,T=(U,D)是最小生成树,V,U是顶点集合,E,D是边的集合若从顶点u开始构造最小生成树,则从集合V中取出顶点u放入集合U中,标记顶点v的visited[u]=1若集合U中顶点ui与集合V-U中的顶点vj之间存在边,则寻找这些边中权值最小的边,但不能构成回路,将顶点

2020-07-18 18:50:32 1091

原创 弗洛伊德(Floyd)算法求最短路径

涉及到的图如下:代码如下:/** * 1,弗洛伊德算法实现 加全权图中的 寻求最短路径可以用来求解任意一点,到其他任意一点之间的最短距离。 * 2,设置顶点vi到顶点vk的最短路径已知为Lik,顶点vk到vj的最短路径已知为Lkj,顶点vi到vj的路径为Lij,则vi到vj的最短路径为:min((Lik+Lkj),Lij),vk的取值为图中所有顶点,则可获得vi到vj的最短路径 * 至于vi到vk的最短路径Lik或者vk到vj的最短路径Lkj,是以同样的方式获得 * 3,参考链接:

2020-07-18 12:07:49 4415

转载 骑士周游(马踏棋盘)算法java实现

马踏棋盘算法也被称为骑士周游问题将马随机放在国际象棋的8×8棋盘Board[0~7][0~7]的某个方格中,马按走棋规则(马走日字)进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格棋盘如下:代码如下:/** * 骑士周游/,马踏棋盘算法 * 参考链接:https://www.jianshu.com/p/62f44b5f2e1b */public class HorseChessBoard{ //棋盘的行 private static int X;

2020-07-18 10:08:00 494

原创 无向图的创建和深度优先遍历,广度优先遍历

声明:下面的代码只是一个最基础的实现,没有经过严格的测试图有两种表示方式,一种是邻接矩阵(二维数组),另一种是邻接表(数组+链表)。下面的例子是针对于邻接链表实现的上面的两幅图,第一副是无向图,第二幅是用邻接链表表示的无向图。代码如下:/** * 图用来表示多对多的关系,数组和链表有前驱和后继,可以认为是一对一的关系。树是一对多的关系。 * 图的基本元素:顶点,边,路径,有向图,无向图,带权图(又称之为网),其他概念参考:https://www.cnblogs.com.

2020-07-16 09:18:29 2620

原创 平衡二叉树

声明:下面的代码只是一个最基础的实现,没有经过严格的测试。/** * 平衡二叉树(AVL) * 1,可以保证查询效率,它是一棵空树或者它的左右两个子树的高度差不超过1,并且左右两个子树都是一颗平衡二叉树。 * 2,实现方式有:红黑树,AVL算法,替罪羊树,Treap,伸展树等。 * 3,平衡二叉树是一种特殊的二叉排序树。除了满足二叉排序树的特性之外,必须在添加新节点时,通过判断左右子树的高度 * 通过左旋转或者右旋转来满足平衡二叉树的特性,即左右两个子树的高度差不能超过1 */publi

2020-07-15 12:00:08 119

原创 二叉排序树

声明:下面的代码只是一个最基础的实现,没有经过严格的测试。/** * 二叉排序树(BST) * 定义:对于任何一个非叶子节点,要求左子节点的值比父节点小,右子节点的值比父节点值大。如果有相同的值,可以在 * 左节点或者右节点 */public class BinarySortTree { public Node root; public static void main(String[] args) { BinarySortTree tree = new B

2020-07-15 11:58:41 101

原创 赫夫曼树

赫夫曼树是一种二叉树。在通信领域的编码和文件的压缩中,会用到赫夫曼树的相关概念下面的代码是创建一个赫夫曼树声明:下面的代码只是一个最基础的实现,没有经过严格的测试。/** * 赫夫曼树:给定n个权值作为n个叶子节点,构造一颗二叉树,若该树的带权路径最小(WPL), * 这样的二叉树称之为赫夫曼树。 */public class HuffmanTree { public static void main(String[] args) { int[] arr=.

2020-07-15 11:57:03 109

原创 二叉树的基本定义

包括二叉树的前序遍历,中序遍历和后序遍历。下面的代码是一个基本的二叉树,非二叉排序树和平衡二叉树声明:下面的代码只是一个最基础的实现,没有经过严格的测试。/** * 二叉树 * 树的遍历参考:https://www.cnblogs.com/zhi-leaf/p/10813048.html */public class BinaryTree { public static void main(String[] args) { BinaryTree tree .

2020-07-15 11:53:07 349

原创 有序数组的值查找

下面的代码分三部分:递归的方式实现二分查找,非递归的方式实现二分查找,插值查找/** * 有序数组的值查找 */public class Search { public static void main(String[] args) { int[] arr={1,2,3,4,5,6,7,8,9,10}; int i = insertSearch(arr, 0, arr.length - 1, 7); //int i = binarySear

2020-07-15 11:49:26 348

原创 常见的8中排序算法

包含冒泡排序,选择排序,插入排序,希尔排序,快速排序,归并排序,基数排序,堆排序声明:下面的代码只是一个最基础的实现,没有经过严格的测试。/** * 排序 */public class Sort { public static void main(String[] args) { int[] arr=new int[8000000]; for (int i = 0; i < arr.length; i++) { arr[i

2020-07-15 11:46:48 205

原创 栈的链表实现(包含单向链表的实现)

栈是一个先入后出的有序数据结构(FILO)栈的操作操作只能是在栈顶(Top)或者栈底(Bottom)进行声明:下面的代码只是一个最基础的实现,没有经过严格的测试。public class MyLinkedStack<E> { public static void main(String[] args) { MyLinkedStack<String> myLinkedStack = new MyLinkedStack(); myL

2020-07-15 11:43:15 172

原创 栈的数组实现

栈是一个先入后出的有序数据结构(FILO)栈的操作操作只能是在栈顶(Top)或者栈底(Bottom)进行声明:下面的代码只是一个最基础的实现,没有经过严格的测试。/** * 使用数组模拟栈 */public class MyArrayStack<E> { private int top=-1; private int maxSize; private Object[] arr; public MyArrayStack(int maxSize)

2020-07-15 11:41:03 140

原创 并发工具类:CountDownLatch,Semaphore,CyclicBarrier,Exchanger简单使用

public class ConcurrentTest { private static int THREAD_COUNT=10; private static ExecutorService threadPool=Executors.newFixedThreadPool(THREAD_COUNT); public static void main(String[] args) { countDownLatchTest(); } /** * 1,CountDownLatch允.

2020-06-13 11:30:03 148

原创 ReentrantLock简单介绍和使用ReentrantLock实现生产者消费者模式

/** * 1,ReentrantLock和synchronized都是可重入锁,Reentrant的本意就是“可重入的”。可重入锁顾名思义,就是在拥有锁的情况下可以调用其它需要本锁的方法或者代码块 * (同一个锁对象) *,2,synchronized只能实现非公平锁,ReentrantLock可以实现公平锁和非公平锁。公平锁或者非公平锁,顾名思义就是线程获取锁的顺序是否和加锁的顺序一致。ReentrantLock * 默认的构造方法创建的是非公平锁,ReentrantLock(true)创建..

2020-05-20 18:34:23 321

原创 使用BlockingQueue实现生产者消费者模式

package ProducerAndConsumer;import java.util.Iterator;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingQueue;/...

2020-04-25 21:45:44 595

原创 使用wait和notify实现生产者消费者模式

package ProducerAndConsumer;import java.util.ArrayList;import java.util.List;/** * 1,线程中的wait,notifyAll和notify方法,必须是同一个锁对象才有意义。java的每个对象,维持两个队列,一个是线程就绪队列,一个是 * 线程阻塞队列。 * 2,调用对象的wait方法,则该线程被置入...

2020-04-25 14:08:29 465 1

原创 java多线程之线程同步

多线程进行同步的几种方式: 1,ExecutorService中的awaitTermination方法,实现线程池中同步 2,CountDownLatch,线程计数,调用await方法阻塞直到子线程执行结束 3,Thread的join方法,阻塞直到线程结束

2020-04-11 18:10:30 232

原创 java多线程之线程池

package Thread;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.SynchronousQueue...

2020-04-07 20:39:41 161

原创 Java多线程之Callable、Future、FutureTask

package Thread;import java.util.Scanner;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future...

2020-04-07 20:37:13 165

原创 mysql知识点整理

1.Mysql版本目前主流的版本是5.x, 5.0-5.1:版本4的延续,是对版本4的升级维护,5.4-5.x:mysql整合了三方公司的新存储引擎。2. mysql 核心目录(linux)/var/lib/mysql :mysql 安装目录/usr/share/mysql: mysql配置文件/usr/bin: mysql命令目录(mysqladmin,mysqldump等)/et...

2019-12-13 14:47:31 171

原创 Mysql存储引擎选择

InnoDB:如果要提供提交,回滚和崩溃恢复能力的事务安全(ACID兼容)能力,并要求实现并发控制,InnoDB是个很好的选择。MyISAM:如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率;Memory:如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中...

2019-11-22 22:24:25 133

原创 mysql索引

索引是一种用于快速查询行的数据结构,是SQL优化最简单也最重要的方式。1.B-Tree 索引最常见的一种索引,InnoDB,MyISAM,Memory这三种引擎都支持B-Tree索引。索引的本质是一种数据结构。B-Tree索引使用的数据结构是B+树,这种数据结构父节点不存储数据,只存储数值(数据)的范围,而在叶子节点存储数据和指针。1.1 聚簇索引(主键索引)InnoDB引擎的...

2019-10-16 17:41:25 151

原创 redis(八):redis实现分布式锁的两种方式

在分布式系统中,如果多个节点同时操作同一个数据,会造成数据不一致的问题。和多个线程对共享变量进行操作遇到的问题一样。在java多线程中,一般会对操作共享数据的代码进行加锁,java提供了synchronized关键字可以很方便实现代码加锁。而在分布式系统中,有三种方式实现分布式锁:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁1. redis分布式锁...

2019-10-11 18:39:03 210

原创 redis(七):redis分布式算法

1.传统分布式算法假设有4个redis节点,分别是redis0,redis1,redis2,redis3;有20个数据,这20个数据需要尽可能均匀地存储在这4个redis节点上。传统的做法是:将这20个数据(key)进行hash运算(如果是string类型,可以直接哈希。如果是文件,可以对唯一的文件名进行哈希),hash后的值和4(节点数量)进行取余运算,算出来是什么结果就落在哪个节点上。比如...

2019-09-24 22:50:43 864

原创 java自定义HashMap

HashMap的数据结构是数组+链表,之前的博客中有自定义的数组列表和链表,这里的数组和链表就是使用之前自定义的数组列表和链表。实现的方法有put(K k,V v),get(K k),clear(),containsKey(K k),replace(K k,V v),remove(K k),不支持null值。确定数组下标的方式直接用key的hashcode和数组容量进行取余运算,没有使用k...

2019-09-20 19:51:31 1106

原创 java实现自定义ArrayList

通过数组实现了基本的增删改查,通过了基本的测试,但没有进行更严格的测试,没有考虑并发。public class MyArrayList<E> implements Iterable<E> { //ArrayList<String> strings; private static final int DEFAULT_CAPACITY = 10...

2019-09-17 13:58:27 1039

原创 java自定义LinkedList:实现单向链表的增删改查和反转

单向链表的节点由两部分组成,一个是值,一个是下一个节点的引用(指针)。其数据在内存中存储是不连续的,它存储的数据分散在内存中。单向链表向外暴露的只有一个头节点(Head),对链表的所有操作,都是直接或者间接地通过其头节点来进行的。添加元素时,在链表头部添加,效率最高。在链表的中间或尾部添加,效率很低。以下是根据链表的原理进行的简单的实现,不一定严谨和健壮java实现的代码如下...

2019-09-14 16:55:58 461

原创 redis(六):redis主从复制

1.概述redis的主从复制实现多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的(可以通过配置文件配置,使其支持读写,但一般从库都是只读模式),并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。 通过redis的主从复...

2019-08-30 18:47:23 122

原创 redis(五):redis发布与订阅

redis的发布与订阅,和常见的消息中间件功能类似。Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。订阅者需要先订阅频道(channel),然后发布者向改频道发送消息,订阅者就能接收到该频道的消息。常用命令如下:subscribe channel [channel ...]:订阅一个或多个频道 psubscribe p...

2019-08-28 11:57:35 292

原创 redis(四):redis的事务

1.概念可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会被序列化到队列中,按顺序地串行化执行而不会被其它命令插入,其他客户端提交的命令请求不会插入到事务执行命令序列中。redis事务就是在一个队列中,一次性、顺序性、排他性的执行一系列命令。2.和sql数据库的ACID的区别没有隔离级别的概念. 不保证原子性:单条命令是原子性执行的,但事务不保证原子性,且没有回...

2019-08-27 18:18:08 120

dbutils工具

用于快速建立数据库jdbc连接,使用时一般要有配置文件

2017-05-09

c3p0数据库连接池

c3p0数据库连接池,用于建立数据库连接池

2017-05-09

mysql的jdbc驱动

mysql的jdbc驱动,用于java和mysql之间建立连接

2017-05-09

afinal框架

afinal是一个开源的android的orm和ioc应用开发框架,其特点是小巧灵活,代码入侵量少。 在android应用开发中,通过afinal的ioc框架,诸如ui绑定,事件绑定,通过注解可以自动绑定。通过afinal的orm框架,无需任何配置信息,一行代码就可以对android的sqlite数据库进行增删改查操作。同时,afinal内嵌了finalHttp等简单易用的工具,可以轻松的对http请求进行操作。

2015-05-05

空空如也

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

TA关注的人

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