- 博客(222)
- 资源 (18)
- 收藏
- 关注
原创 Redux快速入门笔记
ReactNativeReact Native 结合了 Web 应用和 Native 应用的优势,可以使用 JavaScript 来开发 iOS 和 Android 原生应用。在 JavaScript 中用 React 抽象操作系统原生的 UI 组件,代替 DOM 元素来渲染等[2]。React Native 使你能够使用基于 JavaScript 和 React 一致的开发体验在本地平台上构建世界一流的应用程序体验。React Native 把重点放在所有开发人员关心的平台的开发效率上——开发者只需学
2021-12-31 10:54:32 597
原创 Android插件化换肤
目标1、启动时能够自动加载皮肤包2、能动态进行皮肤切换3、能支持在线下载皮肤思路利用Android App加载资源的流程,来加载第三方皮肤包。皮肤包加载流程1、C++层读取资源文件(类似于一个数据库表,有属性名、id和对应资源/路径的对应关系) private static native long nativeLoad(@FormatType int format, @NonNull String path, @PropertyFlags int flags,
2021-12-26 00:52:39 672
原创 React、Jsx实现原理
记录1、jsx由babel.js渲染,它可以将jsx语法渲染成对应的js语法。2、我们使用ReactDOM.render(新建的DOM,被渲染的DOM在body中对应的标签)函数来渲染Dom,而新建的DOM我们一般使用jsx语法来完成,babel是如何渲染的呢?我们来看一个示例:<div className="box"> <div className="header"> <h2 title="标题">我是标题1</h2> <h2 tit
2021-09-26 20:07:10 421
原创 红黑树
1 描述在之前描述的AVL树中,对于删除某个元素导致树不平衡的情况,需要进行旋转调整,使之恢复平衡。然而,该过程可能需要沿着parent关系经历O(logn)次旋转操作才可使得整棵树平衡。因此,在此基础上设计出来另外一种数据结构–红黑树,它的添加和删除的旋转操作都是O(1)级别,但需要牺牲一些平衡性。文章省略了对于B树,AVL树的一些性质和操作的描述,可参考AVL树、B树。1.1性质红黑树需满足以下几条性质:结点是RED或者BLACK根结点是BLACK叶子结点外(这里指外部的空节点)都是B
2020-06-07 16:35:43 313
原创 B树
1 描述B树中的一个结点存放多个元素,并允许存在多个子结点,元素与子结点的对应关系为N+1关系,如下图所示。上图秒速了一棵4阶B树(度最多为4),当前元素大于左子树中的任意元素,小于右子树中的任意元素。1.1 性质假设我们要构造一棵m阶B树,其存在如下性质:根节点元素个数:1≤x≤m-1非根节点元素个数:⌈m/2⌉-1≤x≤m-1根节点子节点个数:2≤y≤m非根节点子节点个数:⌈m/2⌉≤y≤m2 操作流程对于任意一棵B树,需要符合1.1中的性质。在插入和删除元素的过程中有可能破坏
2020-06-05 20:02:11 267
原创 AVL树
描述AVL树是在儿叉搜索树的基础上衍生出来的数据结构。在儿叉搜索树中,高度取决于结点数据的大小的排序和插入顺序,在某些情况下,儿叉排序树的高度非常高,甚至退化成链表,使得其查找效率低下。因此,AVL树引入“平衡因子”的概念,平衡因子=左子树高度-右子树的高度。AVL树规定平衡因子的绝对值不大于1来保证二叉树的平衡。操作流程添加结点情况添加一个结点对其父节点影响不会导致其失衡,而可能导致祖父结点失衡(可能所有祖父结点),因此只需让高度最低的失衡结点恢复平衡即可使得整棵树平衡,旋转操作次数为O(1)。
2020-06-03 06:39:12 226
原创 二叉排序树
描述在二叉树的基础上衍生出的数据结构,对任意结点左右孩子节点之间都有顺序,如:左孩子<当前节点<右孩子节点。因此,提高了有序数据的搜索速率,类似于二分搜索法。关于二叉树的在之前的章节中有描述。具体参考:二叉树的描述与实现接口设计public interface BSTree<E> { //添加元素 void add(E element); //删除元素 void remove(E element); //是否包含当前元素 boolean contains(E e
2020-06-03 03:26:42 193
原创 二叉树
二叉树一个节点有两个后继,称为左右孩子,左右孩子有序不能相互跌倒。二叉树又衍生出多种不同的形态,如红黑树、二叉排序树、B-树、AVL树等。
2020-06-03 01:42:23 214
原创 ActiveMQ之快速上手
JMS规范ActiveMQ遵循JMS规范,是实现JMS接口的消息中间件,其遵循如下规范。Provider(MessageProvider):生产者Consumer(MessageConsumer):消费者PTP:Point to Point,即点对点的消息模型Pub/Sub:Publish/Subscribe,即发布/订阅的消息模型Queue:队列目标,只对单个用户消费Topic:主...
2020-03-28 19:31:28 236
原创 二叉树的递归与非递归方式的先序、中序、后序、层序遍历算法(Java版本)
介绍本文提供了二叉树的构造、递归与非递归方式的遍历算法,其中递归方式较为简单。但在实际应用中,递归的遍历方式适用于递归深度不高的算法中,其一般使用非递归方式来解决。二叉树建树实验一:输入测试数据序列:A B # D # # C # #构造二叉树示意图:非递归遍历二叉树的原理递归方式遍历二叉树较为简单,本文不做过多描述。非递归方式需要用到栈作为辅助数据结构来实现,非递归遍历二叉...
2020-01-07 17:20:55 2012
原创 图的深度、广度优先、最小生成树、最短路径算法(Java版本)
介绍本文提供了图的邻接表、邻接矩阵的Java实现,包括深度优先算法、广度优先算法、prim算法和地杰斯特拉算法。原理分析输入图:深度优先遍历:广度优先遍历:注意:邻接矩阵和邻接表同样的输入遍历的结果可能会不完全一样,原因邻接表的构造并非将小编号的结点连接在靠前的位置,因此导致遍历结果和邻接矩阵不相同,但其在逻辑上仍然满足图的深度优先遍历。另外,最小生成树和最短路径当图中存在两...
2020-01-06 19:46:45 1286 1
原创 迷宫问题
介绍迷宫问题一般深度优先遍历或者广度优先遍历解决,辅助数据结构使用栈或者队列。使用栈解决该问题时,将栈顶能达到的一个位置入栈,若发现该路不通,则退栈,通过栈顶元素继续访问其他可达到的位置,直到走完整个迷宫。若使用非循环队列,将队头能到达的所有位置入队,并记录该位置的前驱为队头元素,最后通过队列的元素的前驱记录可得到整个迷宫的路线。问题描述...
2020-01-05 11:35:21 4556 2
原创 手写Jedis
简介Redis缓存技术常备作为互联网架构中的热点技术,常用来提升系统的性能,常被应用在一些读多写少的场景。Jedis基于Java实现,通过Jedis底层的协议,我们很简单就可以访问Redis服务器,如Redis中的Set、keys、get等命令。本文将简单模拟Jedis的实现。原理Redis使用RESP协议,其描述如下:Jedis协议地址验证:我们可以手写一个ServerSocket...
2019-11-13 22:04:07 195
原创 Java中的Semaphore
介绍Semaphore是Java提供的另一种锁机制,称为信号量,它可允许指定数量的多个线程同时拥有一个信号量。区别于锁的关键在于,锁是为了保证资源的安全而设计的,而信号量是为了限制资源的并发数,对性能进行考虑而设计。设计原理它通过维护一个计数器来限制访问的线程的数量,若增加一个线程的访问时,信号量减一,直到信号量为0时,则无法加入新的访问的线程,这些线程将等待信号量的增加,如大于0,则等待的...
2019-11-07 20:44:09 549
原创 一种安全高效的文件传输协议设计
介绍随着3G、4G、5G的发展,使得文件传输变得轻而易举,我们可以随时随地地进行文件传输,与好友之间,与云服务器之间。文件的传输,意味着一个数据信息需要在网络上暴露,当受到恶意攻击时,导致数据泄露,造成一些不可磨灭的灾难。因此,文件的安全传输是一个值得探讨的问题。1、加密技术,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已知的加密信息,但因不知解密的方法,仍然无法了解信息内...
2019-11-01 19:44:20 2221 4
原创 HDFS简单使用
介绍 HDFS作为Hadoop生态系统下一个一个分布式文件系统,具有高容错性特点,适合部署在廉价的机器上,提供了高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS是一个主从结构(namenode和datanode),其内部机制为...
2019-10-31 20:36:32 234
原创 基数排序
介绍基数排序是一种相当快的排序算法,它用少量空间换取时间,其思想类似于桶排序,基数排序从个位开始,到十位、百位、千位、等,每次确定某一位的顺序,直到整个序列有序。示例在这里插入图片描述代码实现(Java和C)Java实现package test;import java.util.Arrays;import java.util.LinkedList;import java.uti...
2019-10-05 20:36:11 154
原创 词典快速匹配方案
介绍对于构造了几百万上千万的集合中,快速查找对应的元素是一种常见的应用场景,因此本文将探讨一种如何在一个大集合中快速查找对应元素的方法。查找方案哈希查找和字典树是两种高性能的查找方法。其中字典树使用最长前缀匹配法,其查找速度非常快,但由于更新时需要调整整个树,导致其更新速度较慢,因此字典树不适用于动态集合。而哈希查找解决了更新速度慢的问题,因此本文主要介绍基于哈希查找的词典匹配方法。本文将...
2019-10-04 21:16:35 1694
原创 高性能的多对少集合映射调整方法
介绍当一大一小两个集合存在关联关系时,每次小的集合中元素的位置调整,需遍历大集合来调整其对应的关联关系,开销较大,本文介绍一种方法,使得无需调整大集合也能保持其对应的关联关系。原理通过引入中间集合来记录大集合到小集合的映射关系,大集合中的元素始终指向中间集合中的元素,当小集合中的元素位置发生调整时,无需遍历修改大集合,而只需修改中间集合即可保持大集合与小集合的映射关系。测试实现#incl...
2019-09-20 16:17:55 303
原创 Counting Bloom Filter
介绍Bloom过滤器常被用作判断集合元素的从属关系,用来绕过对集合的遍历,加速集合的查找。然而,标准的Bloom过滤器使用一个比特向量来记录元素的从属情况,使得其无法直接支持元素的删除。本文将介绍一种Counting Bloom Filter,使用多个bit位来代替标准bloom过滤器中的一个bit位,从而可对每个槽位上映射的次数计数,使其可支持删除。实现方法插入:1、初始化空集(所有位置...
2019-08-14 11:20:55 531
原创 BloomFilter
介绍布鲁姆过滤器常用作对元素和集合的从属关系进行判定,用来绕过在集合中查找对应元素的过程。本文将介绍一种最简单的基于比特向量的布鲁姆过滤器,并提供Java代码。实现方法插入:1、初始化空集2、插入集合元素a,经过4个不同哈希函数映射到4个位置,将其置13、插入元素b操作同上4、插入元素c操作同上查询:1、查询元素c2、经过4个不同的哈希函数映射到4个不同的位置3、若发现有1...
2019-08-08 18:46:10 408 1
原创 IP策略组
介绍往往会遇到需要添加IP黑名单和IP白名单的情况来允许和禁止其他主机的访问,一种方法是通过设置防火墙策略,另一种方法就是设置IP策略组,本文主要描述如何通过命令行来设置IP策略组。实现sql注入后发现是做了安全策略的话,下文可能对你有帮助。别见笑。本文如可得以传播,实在荣幸。By XblueIP安全策略从win2k到2003都有的,图形界面的没什么好说的,如何在命令行下控制IPSec呢...
2019-07-02 18:14:32 802
原创 开机自动以管理身份员启动
Windows系统中开机自动启动步骤1、检查TaskScheduler服务是否开启2、添加TaskScheduler任务,控制面板-系统和安全-管理工具-任务计划程序具体设置参考:https://blog.csdn.net/ganshuyu/article/details/44647441https://jingyan.baidu.com/article/a681b0de6a322c3...
2019-07-02 18:05:07 910
原创 手写Dubbo
介绍Dubbo作为一种RPC框架,极大的提高了程序的开发效率,其底层采用NIO模型,因此其支持IO密集的RPC远程服务。本文剖析了Dubbo的实现了,首先了其核心部分的代码,主要有服务提供者,服务消费者,以及注册中心三个部分。底层采用Netty和Http两种通信协议,实现了类似真实Dubbo的一个简易版框架。本实验中Dubbo的三个组成部分事实上,Dubbo有4个组成部分,但是本实验为了简单...
2019-06-03 22:34:10 395
原创 netty之helloworld示例
介绍Netty是基于NIO,实现了对NIO的封装。netty常用来做RPC通信,对于传统的NIO而言,API的使用及其不便,在每次读写后都需要flip()操作才能保证整个字节数组的正确读写,因此Netty作者对此实现了封装,他希望netty用户专注于业务代码,而其余部分交给netty来实现。关于netty入门的代码在我的github上可以下载。Netty设计NIO单线程模型NIO线程池...
2019-05-20 10:54:44 670 1
原创 NIO
介绍在传统的Socket网络模型中,通常使用Blocking IO的形式进行读写,所谓的Blocking IO即BIO,实际上是一种阻塞IO模型。其模型可以概括为,在接收到另一端的数据之前,一直是阻塞状态以等待连接建立和数据接收,只有当连接建立完毕或接收到数据之后,才进一步进行操作,整个过程,线程一直被占用,浪费了大量的CPU资源。从而在JDK1.4之后,提出一种NIO(Non-bloking ...
2019-05-09 19:12:25 139
原创 Java闭锁2(Callable接口的模拟与应用)
介绍Java中一共有4种创建线程的方式,继承Thread、实现Runnable接口、实现Callable接口,通过线程池创建。在以上4种线程的创建方式中,如果你了解果前两种线程的创建方法,那我们是可以模拟实现Callable接口提供的功能的。它旨在通过异步操作之后,主线程能接收异步操作返回的值。笔者在之前的文章中介绍过什么是闭锁,以及如何模拟实现CountDownLatch闭锁,若不知道该内容的...
2019-05-08 10:57:25 227
原创 Java闭锁
介绍一种常见的场景,当一个用户请求服务器,服务器为了响应,要进行一系列的操作,有可能需要去调用多个接口,等待各个接口返回结果,而各个接口之间相互独立,为了提高效率,一般会使用异步的方式。当所有异步线程都执行完毕后,通知主线程,主线程进一步执行下一步的逻辑,最终响应。那么主线程如何知道所有线程都完成了呢?本文介绍一种闭锁,让多个线程执行完后通知主线程,若未执行完,主线程阻塞,等待其执行完毕后再进行...
2019-05-07 23:10:57 1295
原创 动态代理与注解(Spring IOC、AOP核心)
介绍Spring两大核心,IOC和AOP,其中都用到了动态代理,常用于日志记录,性能统计,安全控制,事物处理,异常处理等,主要将与业务无关的逻辑从代码中抽离出来复用,实现解耦。动态代理是在静态代理的基础上产生的,博主之前介绍过静态代理模式。静态代理模式对弊端是被代理对象需要实现其公共接口以及接口的所有方法。试想若在一个系统中要给所有对象的所有方法都加上日志记录,让所有代理对象都去实现其接口是不...
2019-04-28 23:56:44 1338
原创 一个简单排他锁的原理与实现
介绍本文将介绍如何应用AbstractQueuedSynchronizer实现一个简单的Lock锁。至于AbstractQueuedSynchronizer的原理在博主其他文章中有介绍,本文重点讲述其应用。AbstractQueuedSynchronizer使用一个队列维护所有的等待锁释放的线程,队列中的每个结点通过自旋的方式来争抢锁,当同步结点释放锁,唤醒next结点。在自旋中,该线程序判断当...
2019-04-26 12:58:57 2452
原创 1、从零开始在Eclipse上写一个应用Hbase的程序
一、介绍本文主要介绍如何开发一个使用Hbase的程序,对于Hbase的安装与卸载请参考厦门大学实验室林子雨推荐的Hbase安装教程,在Hbase之前需先搭建Hadoop平台。安装详情请参考:http://dblab.xmu.edu.cn/blog/install-hbase/本文将详细介绍Hbase使用流程,若遇到Hbase架构上的问题,可参考博主其他Hbase相关博客。二、Hbase表结...
2019-04-25 13:29:39 693
原创 桶排序
介绍桶排序常被应用在数据规模一定,允许少量空间开销的情况下,假设待排序数组长度为m,待排序数据范围长度为n,则其时间复杂度为O(m+n),空间复杂度为O(m+n)算法思想桶排序通过统计每个元素前面元素的个数来进行排序。如一个元素e前面有6个元素,那么自身肯定排在第7位。通过一个例子来说明:假设有待排序数据:1,1,7,3,3,8,3,2,1,4,6,8,7如下图所示:1、用bitma...
2019-04-15 20:36:47 146
原创 RAMClouds
背景1、京东高并发解决方案:对于京东这么一个大的平台来说,高并发成为其需解决的比不可少的一个问题,他们通过负载均衡,缓存,消息队列,分表分库等技术来解决高并发问题,但其受限于DB的规模,换句话说,DB成为了整个架构的瓶颈。对于业务层来说,最终的数据始终来自于DB,其需要维护Redis集群与DB缓存的一致性,代价巨大,由于DB层使用的是磁盘来持久化数据,导致每个DB吞吐量小,所以需通过分表分库...
2019-04-15 17:10:38 204
原创 一个简单的线程池的实现
介绍线程池技术是用来解决高并发,合理利用服务器资源的技术,另外线程池技术无需每次重新创建一个线程,提高了任务的执行效率。如同多线程异步发起请求。本文介绍一个简单线程池的实现,启用多个Worker(extends Runnable)线程,用一个任务(extends Runnable)队列来维护所有的任务,每执行一个任务,即在Worker中调用任务的run()方法即可。代码实现线程池抽象pu...
2019-04-03 23:49:39 341 1
原创 实现一个简单的连接池
介绍数据库连接是一种关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池不仅避免了并发数过多导致连接数溢出的问题,而且能够有效的利用连接资源,对数据库的操作无需每次建立连接,只需从池中获取连接即可。代码实现(Java)...
2019-04-03 11:04:54 506 1
原创 老是弹出Xftp5安装的问题
问题描述笔者电脑之前装了个xftp6,不小心把xftp5卸载了,但是没有卸载干净,导致电脑经常自动弹出xftp5安装向导,让你寻找一个.msi文件,提示找不到,安装失败,取消也取消不了。如图:解决方案1、下载msicuu.exe,即windows install clean up2、用管理员方式运行,安装3、打开软件4、选中xftp5,点击remove即可5、重启windows...
2019-03-27 14:50:53 11625 9
原创 Java常用正则表达式
常用正则表达式a 单独的字母就表示这个字母\\d 表示数字\\D 表示[^\\d]\\W 非[a-zA-Z0-9]\\w 表示[a-zA-Z0-9]的字母 相当于[^\\W]\\u 表示16进制字符/t 表示制表符/n 换行符/f 换页/e 转义字符[abc] 表示a|b|c[^abc] 除了a|b|c[a-zA-Z0-9] 表示a-z或A-Z或0-9中的一个字符[a-...
2019-03-23 19:03:40 244
原创 一致性哈希算法
介绍在分布式缓存中,每台缓存主机中存放的缓存数据不同,因此在读取缓存数据时,应该将请求正确转发到对应的缓存服务器。传统的做法是先给目标主机编号,如0~(N-1),当收到请求时,计算请求标识符fid的哈希值fHash,之后将请求转发到fHash%N号的主机上。但当增加一台主机时,将会将请求转发哦大fHash%(N+1)的主机上,从而会使得大部分缓存失效,从而导致缓存雪崩。为了解决该问题,只需要将...
2019-03-21 20:21:24 136
原创 阿里消息队列RocketMQ简单部署
简介RocketMQ是阿里巴巴开源的消息队列,主要用作削峰,解耦,异步。本文主要讲如何部署阿里RocketMQ,具体概念请自行百度。可参考:https://www.jianshu.com/p/2838890f3284安装JDK安装1、安装JDK2、配置JDK环境变量3、安装RocketMQ4、配置RocketMQ环境变量主要安装过程为以上4步,下面附上linux上安装jdk的...
2019-03-16 21:04:14 1880
原创 设计模式-解释器模式
UML类图使用场景命令行的解析和执行,歌谱解析,翻译软件等等。代码实现该类用来存放一些全局信息public class Context { private String input; private String output; public String getInput() { return input; } public void setInput(String i...
2019-03-15 19:56:58 122
windows install clean up
2019-03-27
hadoop-eclipse-plugin-2.6.0.jar
2019-03-17
jdbc_mysql.jar
2016-10-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人