学习
文章平均质量分 78
Benson_CSU
熟悉Java平台开发,对Spring生态系统、MyBatis、Activiti等框架有所涉猎。喜好研究各种新兴技术。
熟悉Android开发
展开
-
Java网络编程——真正的异步IO(AIO)
真正的异步IO(AIO) NIO虽然说是一种新的IO,可以用一个线程来处理IO读写的问题,防止IO读写一直阻塞线程,充分利用线程资源。但实际上NIO还是同步IO,比如说读IO时,数据量很大,线程实际上还是会阻塞在读操作上。而AIO就是真正意义上的异步IO了。 Java在JDK7增加了AIO,分别有三个新的异步通道,AsynchronousFileChannel,As原创 2018-01-25 14:41:38 · 1210 阅读 · 1 评论 -
数据结构——最小生成树Prim算法
最小生成树Prim算法 在保证图连通的情况下,去掉边数最多所得到的树叫做最小生成树。也就是说一个图,去掉一些边后,图仍是连接的,而这时图剩下的边数最少就是最小生成树,这时候图一定是树状结构的。可以用反证法:如果不是树状的,也就是说还有闭环,那么一定可以再去掉一些边使图中的所有闭环被破坏,最终图一定就是树状结构了,但如果已经成为了树状结构,再去掉一条边,那么一定会有至少一个节点不能原创 2018-02-02 22:31:28 · 827 阅读 · 0 评论 -
数据结构——最小生成树Kruskal算法
最小生成树Kruskal算法 上一篇博客讲了最小生成树的Prim算法。而另一种常见的最小生成树算法就是克鲁斯卡尔算法。 Kruskal算法跟Prim算法的思路不一样,Prim算法还是一种树由根到叶子节点的生成方法,也就是生成树慢慢长大,每次都往生成树中添加新的节点,最后让生成树中包含图中的所有节点。而Kruskal算法则是初始时把所有的节点都当成一棵树,通过树的合并原创 2018-02-03 00:01:25 · 823 阅读 · 0 评论 -
数据结构——拓扑排序
拓扑排序 在有向图中,有一种特殊的图,叫作有向无环图,也就是从图中的任意一个节点出发,都不可能回到出发点。有向无环图这种模型也有一定的适用场景,比如说在工程领域,可以把工程的每个小过程建模成图中的节点,由于工程进行时是有方向的,因此要用有向图,工程的进行不能有死循环,否则工程可能会陷入这个死循环中永远也完不成。判断一个工程是否完成可以通过判断工程的如有向图是否是有向无环图来判断,如原创 2018-02-03 01:38:41 · 673 阅读 · 0 评论 -
数据结构——关键路径
关键路径 在拓扑排序一文中讲到了有向无环图,这种有向图可用于对项目工程进度的研究领域,也叫"顶点表示活动图"(Activity On Vertex,AOV图),图中的每个节点都表示工程中的一个子过程,也就是一个活动。而在真正对工程进行研究时,通常一个活动是需要一定耗费的,因此用节点来表示工程中的事件,用边来表示活动更方便。在软件工程中,这些节点表示的事件可以是项目启动、需要分析开始原创 2018-02-03 12:40:21 · 1108 阅读 · 0 评论 -
数据结构——单源最短路径Dijkstra算法
单源最短路径Dijkstra算法 在现实世界中,经常有从一个城市到另一个城市选择最短路径的场景,这种场景也可以是网络数据传输过程中从一个网络节点到另一个网络节点进行路由。可以把这种场景建模成一个有向网,而耗费就是边上的权值,那么这类场景的问题就是在网中一点到另一点的最短路径问题了。 如果已经知道从节点s到节点e的最短路径是(vs,...,vk,ve)那么vs到vk的原创 2018-02-03 14:29:57 · 669 阅读 · 0 评论 -
数据结构——最短路径Floyd算法
最短路径Floyd算法 上一篇博客讲到了Dijkstra算法的原理和用C++的代码实现。Dijkstra算法可以解决任意点到其他点的最短路径问题。在Dijkstra算法中,最后一个循环是个双层循环,在最坏情况下,每个节点都可以指向其他所有节点,那么Dijkstra算法的时间复杂度就是O(n^2)了。如果想让图中每个点到其他所有点的最短路径,就需要把Dijkstra算法执行n次,那么原创 2018-02-03 15:31:03 · 570 阅读 · 0 评论 -
数据结构——二叉排序树
二叉排序树 排序是将一个无序的序列整理成有序的一个过程。这个整理的过程可以使用一些特殊的数据结构来提高效率,比如说二叉排序树。 二叉排序树是一种二叉树,又叫二叉查找树。一棵二叉排序树要么是一棵空树,否则如果根节点有左子树,那么左子树的所有节点的值小于根节点的值,如果右子树不能空,那么右子树上所有节点的值要大于根节点的值。 为什么二叉排序树又叫二叉查找原创 2018-02-03 18:34:09 · 872 阅读 · 0 评论 -
数据结构——平衡二叉树
二叉平衡树 上一篇博客写到了二叉排序树,二叉排序树在最好的情况下,其时间复杂度为O(logn),而在最坏的情况下,二叉排序树变成一个线性表,查找也就变成了顺序查找,时间复杂度为O(n),所以二叉排序树的查找效率取决于树的形状,而树的形状又取决于构造树节点的元素序列,如果这个序列是完全有序的,那边构造出来的二叉排序树就是一个线性表了。如果能把二叉排序树整理得深度尽量小,那么查找的原创 2018-02-03 22:55:30 · 518 阅读 · 0 评论 -
数据结构——哈希
哈希 像C++和Java这种高级语言,都提供了哈希(Hash)的集合库。Hash也是一种数据结构,这种数据结构的特点就是可以储存键值对,每个键都对应着一个值,可以通过键在Hash表中快速查找到这个键所对应的值。Hash表会预先申请一块比较大的内存,当向Hash表中添加键值对时,就直接存入在已经申请的内存中。通常,Hash需要一个Hash函数来确定这个值应该存放在哪里,因为在Hash表原创 2018-02-03 23:27:07 · 403 阅读 · 0 评论 -
数据结构——图的遍历
图的遍历 树常见的遍历方式有先序、中序、后序以及层次遍历,同样,图也有常见的两种遍历方式,分别是深度优先搜索(DFS)和广度优先搜索(BFS)。见名知意,深搜的策略就是从一个节点开始,访问到一个节点就标记一下,向第一个邻接节点方向搜,如果第一个邻接节点已经被标记访问过了,就向每二个邻接节点方向搜等等,再后再向第一个邻接节点的第一个邻接节点搜,这样递归搜索,直到当前访问的节点的所有邻接节原创 2018-02-02 17:08:37 · 634 阅读 · 0 评论 -
Netty学习——TCP粘包/拆包的问题
TCP粘包/拆包的问题TCP粘包的概念 TCP是一个流协议,是通过输入输出流来输入输出数据的,因而底层是不知道业务逻辑。TCP的装包是根据TCP缓冲区的实际情况进行包的划分的,也就是TCP底层如果发现缓冲区的数据已经足够,才会把数据发送出来。这样,我们写到缓冲区中的数据其实是没有任何逻辑的,比如说可能我们写到缓冲区中的数据是1个半的消息(这个时候叫粘包,也就是多个业务逻辑包粘原创 2018-01-26 12:16:48 · 182 阅读 · 0 评论 -
数据结构——二叉树
二叉树线性表、栈和队列都是一种线性的数据结构,数据元素在组织结构上呈现线性排列,从二维视角来看,一个元素向前最多只会有一个元素,向后只最多只会有一个元素。但数据的结构可能更复杂,比如说数据排列可以呈现一种分支的情况,一个元素向某个方向可能有多个分支,这里就需要其他数据结构来描述。树是一种能够一对多的数据结构,可以描述一个节点和多个节点之间的关系。数据结构中的树是一棵倒着的树,树根在原创 2018-02-01 16:28:18 · 280 阅读 · 0 评论 -
数据结构——由前序和中序遍历构造二叉树
由前序和中序遍历构造二叉树 二叉树的前序遍历是先访问二叉树的根节点,再访问左子树节点,最后访问右子树,而中序遍历则是先访问左子树,再访问根节点,最后访问右子树。根据这种访问过程的特性可以发现,先序遍历结果的第一个元素肯定就是树的根节点,根据这种元素可以把中序遍历结果分成两部分,左部分就是二叉树的左子树,右部分就是二叉树的右子树。再根据先序遍历和中序遍历的特性,先序遍历结果的第原创 2018-02-01 18:48:39 · 901 阅读 · 0 评论 -
数据结构——线索二叉树
线索二叉树 线索二叉树的概念 一棵二叉树,最下面一层全是叶子节点,这些叶子节点的左右孩子指针全为NULL,其实是浪费了这些内存。详细计算一下,节点二数为n的二叉树有n+1个空指针。这是怎么算来的呢?其实有个非常简单的算法:有n个节点的二叉树很明显有2n个指针,而这n个节点除了主根节点,其他节点都有一条连线指向这个节点的父节点,反过来来看,这个连线就是父节点指向这个节点的指针,因原创 2018-02-01 21:00:24 · 662 阅读 · 0 评论 -
数据结构——哈夫曼编码
哈夫曼编码 在计算机世界中,任何事物都是二进制的,比如说数字、字符、颜色、声音等等,都是以二进制的形式存的,而在物理设备中用磁极或者电极来表示0或1,并通过电流的形式来传输,传输的过程中有数-模和模-数的转换。由于只有0和1两种数字,因而不同的数据就会用0和1不同的编排来表示,这种编排就叫作编码。编码是计算机中一个非常重要的概念,如果没有编码,就不会有计算机,因为只能处理0和1对于原创 2018-02-02 00:29:10 · 8797 阅读 · 0 评论 -
Netty学习——Netty简单的服务器客户端通信
Netty简单的服务器客户端通信 Netty是一个基于Java NIO的异常网络通信框架。Netty充分利用了Java NIO异常的特点,减少了线程资源的消耗,并且还对缓冲做了复用,大大节约了内存。无论是方便、轻量还是安全方面,Netty在Java网络编程框架中都是首屈一指的,基于Netty进行二次开发网络应用相当的方便,无数的个人企业应用已经证实了这一点。原创 2018-01-26 00:02:47 · 277 阅读 · 0 评论 -
Netty学习——编解码
编解码为什么需要编解码 Java是基于IO流的,不管是文件还是网络数据,Java都把数据的输入输出抽象成了基本的IO流。这样的好处就是易于理解易于操作。然后IO流是只能读写字节的,但是经常我们的数据是储存在内存中的一个对象或者说是一个数据结构实例。因此就需要把这些对象转换成字节后然后再进行数据传输,比如说一个学生类对象,如果转换成字节数组,然后写到一个文件或者输出到网络原创 2018-01-26 13:32:51 · 186 阅读 · 0 评论 -
数据结构——图的储存结构(邻接矩阵)
图的储存结构 线性表是一对一关系,树是一对多关系,而现实生活中还存在一些多对多关系。比如交通网络,多个交通枢纽之间的连线可能错综复杂,一个交通枢纽会连接其他多个交通枢纽,而这个交通枢纽也会被其他多个交通枢纽连接,形成一个网络结构。这种网络结构就像地图上的交通路线一样,所以在数据结构中用图来描述这种多对多的关系。树是一种特化的图,就是图中每个节点都只被一个其他节点连接,而自己这个节点原创 2018-02-02 14:43:43 · 817 阅读 · 0 评论 -
数据结构——图的储存结构(邻接表)
图的储存结构(邻接表) 图用邻接矩阵储存时,是用的一个二维数组,操作这个图的时候就相当于操作这个二维数组。但一但使用数组时就有一个很明显的缺点,那就是动态扩容性,基于邻接矩阵的图不能添加节点,只能添加边。如果图是一个节点非常多的稀疏图,比如说这个n为一亿,那么所需要的内存就是100000000 * 100000000 = 10000000000000000个单位,而其中非常多的内存原创 2018-02-02 16:05:01 · 804 阅读 · 0 评论 -
Netty学习——用Netty实现一个简单的Http服务器
用Netty实现一个简单的Http服务器 Netty默认实现了Http的请求解析与响应封装,可以很方便地利用这些已经利用好的处理器来实现一个简单的Http服务器,或者自己实现更加复杂的Http服务器逻辑。下面是我用Netty实现的一个可以接收Http get或post请求的http服务器,并且可以解析出请求参数,然后生成一个页面,显示出请求参数。package study.net原创 2018-01-26 16:23:46 · 5605 阅读 · 0 评论 -
Netty学习——基于Netty的WebSocket协议开发
基于Netty的WebSocket协议开发WebSocket简介 Java的Socket是Java网络编程的基础,Java的Socket是在应用层的,这和C/C++的Socket不同,C/C++的Socket是可以获取TCP头数据的。Socket是一种全双工的通信方式,也就是说通信双方可以同时互发消息,也叫CS模式,而HTTP协议是一种无状态协议,是基于BS模式的,服务器不能原创 2018-01-27 21:39:54 · 2619 阅读 · 0 评论 -
Spring Security学习——自定义数据源的用户权限验证
自定义数据源的用户权限验证 Spring Security框架提供的基于角色的权限验证,能够解决大部分业务场景的权限问题。但真实的业务场景大部分都是动态的用户,比如说可能会有新用户注册进来,而新用户也要分配相应的角色权限,并且权限的用户名和密码也是用户自定义的,这就要求Spring Security框架能够提供动态的用户信息验证。 前面就说过了,Spring Sec原创 2018-01-29 23:39:54 · 850 阅读 · 0 评论 -
Spring Security学习——基于Java注解的Spring Security配置
基于Java注解的Spring Security配置 Spring在早期版本的时候,全是基于xml配置文件,导致配置极其繁杂。后期的版本中,Spring提供了对基于Java注解的支持。Java注解的Spring使每个Bean类有了自配置的特性,通过在每个类中添加相应的Java注解,就可以标注这些类在系统中的功能,可以大大减少配置文件的管理。当然,Java注解的Spring也原创 2018-01-30 14:52:58 · 932 阅读 · 0 评论 -
Spring Security学习——基于方法调用的权限验证
基于方法调用的权限验证 根据前面的几个例子,发现Spring Security还是非常好用了。而有时候,可能需要这样的应用场景,在业务逻辑层,如果能对某些业务方法进行相关的权限验证就更好了,这样更好理解,并且更细粒度,因为我们能够管理哪些角色可以访问哪些方法中的业务,并且这样在业务开发时将会更加方法。比如在一个学生管理系统中,普通用户也就是普通学生能够查看相应的学生信息、成原创 2018-01-30 16:02:52 · 723 阅读 · 0 评论 -
关于大型系统下数据库的一些思考
关于大型系统下数据库架构的一些思考 最近在读曾宪杰大虾的《大型网站系统与Java中间件实践》这本书,感觉还是很有收获的。这本书主要讲了大型网站系统在建设过程中所面临的一些常见困难,并介绍了一些常用的解决方案。其中作者写的最多的一句话就是要根据实际场景具体分析最后选择解决方案。从书的第一页快看到结尾了(其实这已经是我第三遍看这本书了,基本每隔半年就看一遍,每次看都会有新的体会),也慢慢体...原创 2018-02-28 00:36:57 · 354 阅读 · 0 评论 -
Java内存管理
Java内存管理 学过几年Java的同学肯定都非常关心Java的内存管理,Java内存管理具有一定的自动化能力,不能C++那样申请的内存需要主动释放,Java释放内存是通知垃圾收集器回收的,垃圾收集器是JVM的一个后台线程,也不一定就是一个线程,现在的CMS和G1收集器可以实现并发的垃圾回收了。Java内存的自动...原创 2018-02-19 22:33:28 · 165 阅读 · 0 评论 -
阿里内推总结
阿里内推总结 先说说结果吧,阿里挂了,嗯,和很多小伙伴一样,我也是挂在阿里的HR手里了,阿里的HR是真的恐怖,希望将来要面阿里的小伙伴们,千万要当心HR面。不过,就像我们一个老师铁帅说的,有时候吧,真的要看缘分,可能我和阿里,真的是缘分未到吧,HR挂人肯定也是有她的考量的。今天晚上,收到了头条HR的offer通知,做A...原创 2018-04-04 16:44:10 · 9464 阅读 · 0 评论 -
今日头条内推一面
今日头条内推一面 大半夜的,清明节放假,一室友回家了,一室友在旁边吃鸡,还有一个在玩csgo,用putty连云服务器老是连接失败,很气,还是用virtualbox安装一个centos虚拟机算了,虽然内存有点不够烧,老是爆到70%,但只要不开flash其实也还好。安装期间刚好抽个空来写写头条内推面,也算是回报广大爱技术爱分享...原创 2018-04-05 02:23:00 · 2434 阅读 · 0 评论 -
Java范型与反射
Java范型与反射 Java的泛型是一种伪范型,意思是Java的范型其实只能在编译前有效,编译时编译器会擦除范型信息,因此也可能会出现一些范型导致的错误。 下面是一段经典的获取类型的代码package reflect_test;/** * Created by dengxiaobing on 2018/6/9. */...原创 2018-06-11 16:56:38 · 462 阅读 · 0 评论 -
centos上搭建lamp
centos上搭建lamp 最近江汉大学一学电子商务的发小要学Web开发,就帮他在阿里云上租了一个1核2G的ESC,并帮他搭建一下环境,简单地记录一下。 将jdk的话就yum list java*列出java的相关资源 安装openjdk yum install java-1.8.0-openjdk java-1.8...原创 2018-06-08 02:48:08 · 158 阅读 · 0 评论 -
Spring Security学习——基于角色的权限验证
基于角色的权限验证 在现实世界中,不能的角色对应着不同的权限,比如说用户可以访问用户的模板,但不能访问到后台,管理员可以访问到后台的管理模板,而只有数据库管理员才能直接访问到数据底层管理,比如说一些登录日志和私密数据。Spring Security框架支持基于角色的权限验证,可以在系统中添加多种角色,用户权限验证登陆时,就可以根据输入的登陆信息,判断出输入的用户需要哪个角色,然后根原创 2018-01-29 22:03:36 · 2950 阅读 · 1 评论 -
算法——动规
动规 动规就是动态规则的意思。前面讲到分治算法是把大问题分解成多个独立的小问题来求解,但很多问题分解后子问题并不是独立的,或者说如果要分解成独立的子问题,子问题太多,这样反而降低了性能。在这些不独立的子问题中,有很多数据被重复计算,其实这些重复计算的数据可以通过一个表达式来保存,就可以避免很多重复的计算。 动规用一个表来记录计算过的子问题的答案,通过填表的方式来求得最原创 2018-02-05 20:47:39 · 1581 阅读 · 0 评论 -
数据结构——2-3树
2-3树2-3树的概念 前面讲到了二叉搜索树(BST)和二叉平衡树(AVL),二叉搜索树在最好的情况下搜索的时间复杂度为O(logn),但如果插入节点时,插入元素序列本身就是有序的,那么BST树就退化成一个线性表了,搜索的时间复杂度为O(n)。之所以会变成O(n),是因为树的高度变大了,BST的比较次数最大是等于树的高度的。因此,如果想要减少比较次数,就需要降低树的高度。在插入原创 2018-02-04 14:35:40 · 8229 阅读 · 2 评论 -
数据结构——红黑树
红黑树为什么要红黑树 红黑也是一种二叉平衡树,但红黑树不要求全局平衡,只需要局部平衡,这样的好处是在插入和删除这种改变树形态的操作时效率更高。普通的二叉平衡树要求全局平衡,为之付出的代价会非常大。但红黑树只要求局部平衡,需要查找的性能不是最优的,但也是比较优的,而且平衡的代价也比较小,红黑树对修改的查找效率进行了平衡取舍。2-3树由于有两种节点类型,并且4节点的分裂比较复杂,因此原创 2018-02-04 15:22:12 · 219 阅读 · 0 评论 -
Netty学习——私有协议栈的实现
私有协议栈的实现协议栈 为什么要说是协议栈呢?因为一个网络通信解决方案并不是一个协议就可以完成的,需要多种协议协同使用,才能完成网络通信的功能。比如说HTTP协议栈,就需要TCP/IP协议做支持,再向下还需要一些数据链路层物理层的相关协议。由于这些协议是分层的,下层协议为上层协议提供服务,这就形成了一个栈式结构。私有协议栈 HTTP是一个非常好原创 2018-01-28 17:50:14 · 401 阅读 · 0 评论 -
数据结构——2-3-4树与红黑树
2-3-4树与红黑树2-3-4树 前面讲到了2-3树,2-3树是允许节点最多有三个子节点的树,2-3树中有2节点和3节点,2节点跟普通的二叉树节点一样,3节点AB就是的左子树上的所有节点的值小于A,中子树上所有节点的值大于A而小于B,右子树上节点的值大于B。2-3树是一种平衡树。 2-3-4树跟2-3树差不多,只不过是把节点的最大子节点个数扩充到了4个,所以2-原创 2018-02-04 19:08:44 · 417 阅读 · 0 评论 -
算法——个人对算法的一些理解
个人对算法的一些理解 在学校的同学们之间,算法总是被放在一个非常高的位置,有多高呢?嗯...就是非常非常高啦,高到有人只要能说出几个非常牛掰的和算法有关的名词,比如NP完全问题啦、模拟退火啦就觉得自己是大神了(其实有些人连快排都写不出来,或者写个快排还要先翻翻书)。其实我觉得算法跟数据结构、设计模式一样,都只是一种工具,用这样的工具能快速有效地解决一些实际问题,如果只知道算法,而不懂原创 2018-02-05 14:08:49 · 5369 阅读 · 0 评论 -
算法——分治
分治分治是一种策略,是把一个较大较复杂的问题分解成多个独立的较小较简单的问题,然后再把这些小问题的结果组装成原始问题的结果。把大问题分解成小问题,到底分解成多小的问题呢?一般来说,当问题分解成能直接解决就可以了。很明显,分治要一层层地把大问题分解分更小的问题,所以分治经常使用递归来实现。分治就是把大问题分解成和原问题相同,但规模更小的问题,而递归恰好有这种特性,递归就是自己调用自己原创 2018-02-05 14:57:34 · 330 阅读 · 0 评论 -
算法——快排
快排 上一篇博客说到了分治策略,分治就是分而治之的策略,把大问题分解成多个独立而且与原问题相同的小问题,直到分成可直接解决为止。分治也可用于排序算法,最经典的分治排序就是快排了,快排是很多语言框架的默认排序算法,比如说Java的Arrays中使用的就是一种被称为双轴快排的算法。 快排分为三个步骤: 分解:以元素data[p]为基准把输入原创 2018-02-05 16:54:29 · 298 阅读 · 0 评论