敏感词过滤 实现 敏感词过滤 我们用的是DFA思想,就是提前构建好一个Trie树(前缀树),让指定词在前缀树中搜索,搜索过程类似于KMP算法,找到了就是敏感词,否则就不是。那么Trie树是什么呢? Trie树 是一个数据结构,一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字...
Java 分支合并框架(Fork/Join) Java的 分支合并框架 是以递归方式将可以并行的任务拆分成更小的任务,然后将每个子任务的结果合并起来生成整体结果。它是ExecutorService接口的一个实现,它把子任务分配给线程池(称为ForkJoinPool)中的工作线程。 该框架由 JDK1.7 提供,思想类似于 分治法,只不过是并行执行。要使用它首先需要创建 RecursiveTask<V> 的一个子类,...
Java 注解 Java在JDK5之后引入了"注解"的概念,实际上就是为了起到简化代码、易于理解的作用,并且通过注解也可以在编译时期发现一些代码格式的错误,更方便的进行开发。注:这里只是简单记录下 Java 注解的相关概念,未详细讨论。且不涉及 Java 8 新加入的注解。后续会更新补充…注解的声明类似于 接口 的声明,但稍有不同// 声明注解使用 @interface 关键字public @in...
Quartz 任务调度 Quartz是一个完全由java编写的开源作业调度框架。为在 Java 应用程序中进行作业调度提供了简单却强大的机制。多用在轮询、定时任务处理等。相对于JDK 自带的Timer 有着更强大的功能。 使用Quartz需要在quartz.jar官网下载相应的jar包(访问可能比较慢) 或者 pom文件导入<groupId>org.quartz-scheduler</...
代理模式(Proxy) 设计模式 代理模式:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。(结构型模式)代码示例:业务需求:银行提供 存钱 和 取钱 的功能1、提供一个银行类的接口,包含 存钱 和 取钱 的功能p...
Guava(十二) 【散列】&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;散列码也可称作哈希函数,即我们在存储数据时,数据和关键字是按照一定的规律存放,以便在查找时能按照这样的规律高效准确的找到对应记录,这里的规律就是由哈希函数确定的。&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JDK对于散列码并没有提供很好有效的方法,因此
Guava(十一) 【数学运算】 Guava 对于数学运算进行了专门的封装,对运算溢出、性能以及可读性等方面做了精心的设计。来看看吧:Guava Math主要处理三种整数类型:int、long和BigInteger。这三种类型的运算工具类分别叫做IntMath、LongMath和BigIntegerMath。一、整数运算有溢出的检查运算:当运算结果溢出时,会抛出运算失败异常而不是忽略溢出。in...
Guava(十) 【缓存】 缓存在很多场景下都是相当有用的。例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存。Guava Cache与ConcurrentMap很相似,但也不完全一样。最基本的区别是ConcurrentMap会一直保存所有添加的元素,直到显式地移除。相对地,Guava Cache为了限制内存占用,通常都设定为自动回收元素。在某些场景下,尽管 Lo...
Guava(九) 【区间】 第二章 提到的RangeSet中有用到 Range区间工具,现在就这里详细了解下。Range就是指所谓的区间,仅支持传入所有实现 Comparable接口的类型,但支持多种区间的定义、计算等操作。一、构建区间由于 Range的构造器被声明为私有类型,因此初始化实例都是通过静态方法实现。静态方法区间类型open(C, C)(a, b)closed(...
Guava(八) 【原生类型】 Java原生类型就是指8中基本类型:byte、short、int、long、float、double、char和boolean。 原生类型不能当作对象或泛型的类型参数使用,就意味着许多通用方法都不能应用于它们。Guava提供了若干通用工具,包括原生类型数组与集合API的交互,原生类型和字节数组的相互转换,以及对某些原生类型的无符号形式的支持。原生类型Gua...
Guava集 最近学了一段时间的Guava,感觉是个不错的工具,在原有的JDK基础上封装、修饰了许多集合、工具以及开发中经常会用到的数据结构等等,使用起来真的有很大的帮助,因此想在这里分享记录下学习的内容,方便后续回顾。 学习内容来源于并发编程网站,有一些内容直接粘贴自这里,还有些自己所写。由于初接触Guava,在某些方面有偏差的还请留言讨论,博客会不定期完善更新和添加新内容。目录一、基本...
Guava(七) 【并发编程】 并发编程是一个难题,但是一个强大而简单的抽象可以显著的简化并发的编写。出于这样的考虑,Guava 定义了 ListenableFuture 接口并继承了JDK concurrent包下的 Future 接口。Guava强烈建议在代码中多使用 ListenableFuture 来代替JDK的 Future, 因为:● 大多数 Futures 方法中需要它。● 转到 List...
Guava(六) 【字符串处理】一、Joiner 连接器 Joiner用于将字符串序列通过指定的分隔符连接起来,另外通过一些属性的设置可以让字符串的连接变的更简单。String join = Joiner.on(",").skipNulls().join(Lists.newArrayList(1, 2, null, 3)); // 1,2,3Joiner.on(";").useForNull("-1...
Guava(五) 【函数式编程】 Guava推出的函数式编程起到简化代码的作用。但过度使用会造成代码的冗长、混乱、可读性差等缺点。此外,还可以了解下Java8中的函数式编程,但仅限于JDK8及以上的版本。 一、Function 函数 Function&amp;lt;F, T&amp;gt; 函数声明了一个 T apply(F input) 的方法,通过对输入F的操作,输出类型T的结果。Function&amp;l...
Guava(四) 【强大的集合工具】 之前的章节中不少次提到了Lists集合工具,通过 Lists.newArrayList(E… elements) 可以很方便的构建ArrayList集合去使用。除了List,Guava对所有的集合类型都有对应的封装,包括JDK没有的新集合类型,并且构造器支持多种类型的参数传递,光这一点就很强大了! 集合 来源 Guava工具类 Colle...
Guava(三) 【不可变集合】 不可变集合就是在初始化时定义好数据,在之后的使用过程中不能再修改的集合。Guava对所有的JDK集合类型和新集合类型都封装了对应的不可变集合。但需要注意的是,所有Guava不可变集合的实现都不接受null值。一、为什么使用不可变集合 Guava给出了使用原因: 不可变对象有很多优点,包括: ● 当对象被不可信的库调用时,不可变形式是安全的; ● 不可变对...
Guava(二) 【新集合类型】 Guava在现有的JDK集合中有新增了Multiset、Multimap、BiMap、Table、ClassToInstanceMap、RangeSet、RangeMap等新集合。这些新集合能够跟JDK集合框架共存,并遵循JDK接口契约。所有新集合的构造器都进行了私有化处理,并通过静态函数生成实例。一、Multiset Multiset多用于统计元素个数,例如统计一...
Guava(一) 【基本工具】 一、Optional 针对Java开发中null的问题,guava设计了Optional类。虽然util包下也有自带的Optional类,但是Guava对其做了更好的处理。Optional 用来表示可能为null的T类型的引用,两个实现类Present(存在)和Absent(不存在)。 那么Optional究竟有什么用呢,我们来看一下主要的方法: 1. Optiona...
Java生成图形验证码 验证码是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试的操作。 图形验证码是最传统的一种的验证码形式,都是由后台进行生成绘制的,生成过程要考虑到机器识别的可能性,因此要添加干扰线来扰乱机器的识别。下面贴下生成图形验证码的Java代码(该代码运行后会生成JFrame窗口...