Java
设计之下
曾经做过4年的智能家庭项目,熟悉设备发现、互联互通等技术。后做了2年的敏捷实施与项目管理,目前与朋友一起经营一个创业,从事将于项目的移动互联网项目。
展开
-
Lucene的Smart CN实现分词、停用词、扩展词
Lucene 中提供了 SmartCN 为中文提供分词功能,实际应用中还会涉及到停用词、扩展词(特殊词、专业词)等,因此本文将聚焦在 SmartCN 而暂时不考虑其他中文分词类库。1 简介analyzers-smartcn 是一个用于简体中文索引词的 Analyzer。但是需要注意的它提供的 API 是试验性的,后续版本中可能进行更改。可以它包含了如下两部分:org.apache.lucene.analysis.cn.smart 用于简体中文的分析器,用来建立索引。org.apache.luce.原创 2020-05-24 15:22:08 · 982 阅读 · 0 评论 -
H2 Database 实战(1):简介
H2 是一个使用 Java 编写的数据库,支持内存、文件等多种模式,经常用于项目的测试环境。除此之外,通过 H2 的官网了解到,H2 还提供了丰富的特性。1 关于 H2 的简介H2 提供了丰富的特性,这里罗列了一些引入注意的特性:性能:与 SQLit 相比较,读操作更快,但是在连接、写操作性能都不如 SQLite。功能:支持全文检索,提供了内置全文检索和使用 Apache Luncene 的全文索引对数据类型和SQL有很好的支持,兼容性好,便于移植支持嵌入式数据库、内原创 2020-05-22 16:04:34 · 406 阅读 · 0 评论 -
将H2应用在测试环境中
上面篇文章中介绍了 H2 的一些特性。H2 因其提供了内存数据库的模式,经常应用在测试当中,快速验证某些SQL 操作的结果。本文将 H2 应用于测试中的原因,并使用一个简单的实例说明 H2 在测试中的使用。对 H2 提供的全文索引感兴趣可参考:《H2 提供全文索引功能》1, 为什么将 H2 适合应用在测环境中?代码中的测试需要满足 FIRST 原则: Fast 快的 Independent 独立的 Repeatable 可重复的 Self-validating 自验证的原创 2020-05-22 16:03:46 · 346 阅读 · 0 评论 -
H2 的全文检索功能
在前面的文章中,我们介绍了 H2 的一些特性以及 为什么H2 适合应用在测试环境中。H2 不但可以作为嵌入式数据库、内存数据库使用。在适当的场景下可以选择使用 H2 替换掉 SQLite,还可利用 H2 内存数据库的特点,将它还提供了全文检索的功能。H2 内置了两个全文检索(FullText Search)的实现:**Native FullText Search。**使用 H2 中内置的全文检索,将索引存储在数据库指定的表中。Apache Lucene FullText Search。 H2 使用原创 2020-05-22 16:02:49 · 864 阅读 · 0 评论 -
识别代码中的坏味道(二)
在上一篇文章中,介绍了通过名字就能理解的 8 个坏味道,感兴趣可以查看识别代码中的坏味道(一)。本篇文章将识别代码中的另外 10 个代码坏味道:10个晦涩但是通过简单的即可识别的坏味道。如上图,这 10 个代码坏味道是:发散式变化霰弹式修改依恋情结数据泥球基本类型偏执平行继承体系冗赘类过度耦合信息链异曲同工的类纯数据类01 发散式变化简而言之就是一个类总是因为不同类型的原因发生变化。例如:需要修改数据源时要修改该类,需要修改缓存时还需要修改这个类,甚至当修改某个策略的计算公.原创 2020-05-18 16:41:25 · 602 阅读 · 0 评论 -
ArrayList需要了解的事情
ArrayList 是日常开发经常使用到的容器类。它能够方便的进行数据的查询、替换。但是因为其低层实现的原因在数据容量、性能、线程安全上都存在问题,主要涉及到下面的内容:(1)默认初始容量为 0,如果未指定容量则首次初始的容量为 10;同时其也是有容量限制的;(2)添加元素会涉及到数组扩容和数组元素拷贝,删除数组元素时同样也会涉及到数组的拷贝,这都会影响性能;(3)线程不安全,因为整个Ar...原创 2020-04-28 16:42:22 · 177 阅读 · 0 评论 -
Java多线程:使用 CompletionService 接口避免 Future 的阻塞
01 CompletionService 简介在上一篇内容中,介绍了 Future 的使用,其中也涉及到了 Future 的不足,就是当通过 get() 方法获取线程的返回值的时候,会导致阻塞,由于阻塞很多时候这回倒置性能问题。而 JDK 中提供的另外一个工具类能够帮助我们缓解或是解决阻塞的问题。CompletionService 的作用:CompletionService 接口解决 Fu...原创 2020-04-21 15:32:10 · 742 阅读 · 0 评论 -
Java中线程池实现的两种方式
01 线程池的应用场景(1)应用比如现在收集上的修图软件。一张 1920 x1080 的图片有 200多万个像素点,对整个图片的每个像素点处理一遍也是需要不少的计算量。(2)服务器端服务器端处理大数据、大量请求时如果只是单个线程来进行,也是无法满足需求的。此外,不管是处理应用还是服务器,即使使用了多线程,如果频繁进行创建和销毁线程,最终创建和销毁的时间有可能大于真正执行的时间。将对象复...原创 2020-04-16 18:21:17 · 315 阅读 · 0 评论 -
使用 Phaser 更加灵活的控制阻塞节点的停留
01 PhaserPhaser 与 CountDownLatch、CyclicBarrier 做的事情类似,只是Phaser 提供了更加丰富的API,左右处理同样一个场景时,使用一个 Phaser 对象,并通过调用不同的 API 即可用更简单的方式实现相同的功能。Phaser 主要有以下功能:(1)提供了多个阻塞节点,因此可以组织一个流程中可以组织多个阻塞节点。(2)控制线程直接通过阻塞...原创 2020-04-16 11:22:55 · 246 阅读 · 0 评论 -
CyclicBarrier 实现阶段性同步
01 CyclicBarrierCyclicBarrier 提供了如下功能:(1)向上增加计数的功能(2)阻塞等待功能(3)阶段性同步功能(线程数大于 parties 数量时)(4)支持多次循环实现多个线程一起执行的目的。02 与 CountDownLatch 的比较(1)CountDownLatch 时计数器做减法,而 CyclicBarrier 时通过累加来实现。(2)Co...原创 2020-04-15 16:27:47 · 103 阅读 · 0 评论 -
CountDownLatch实现多线程等待后共同执行
01 CountDownLatchCountDownLatch 通过 count 计数实现屏障设定(阻塞),当满足设定的条件后一个或者多个线程时候一起执行。这里的屏障指的就是一个线程会被阻塞,不再继续向下执行。CountDownLatch 中的计数器会做减法。当执行到它的 await()方法之后,如果计数器不为 0,则阻塞,知道其他线程调用 countDown()之后扣减计数为 0 之后,原...原创 2020-04-15 15:01:35 · 470 阅读 · 0 评论 -
用 Exchanger两个线程之间的通信
01 Exchanger 作用使两个线程之间进行数据传递。(对是两个之间而不是三个或者更多个线程之间)02 常用方法exchange() 阻塞当前线程并等待其他线程来取得数据,若没有其他线程来取数据则一直等待。exchange() 传递数据exchange(V v, long timeout, TimeUnit unit) 在指定的时间内没收到消息,则抛出超时的异常。03 例子p...原创 2020-04-14 23:04:03 · 130 阅读 · 0 评论 -
Semaphore 并发控制
01 SemaphoreSemaphore 的作用就是控制某段程序线程并发执行的数量。这比 sychronized 功能更加强大和方便。Semaphore 有个一个参数为 permits 的构造函数。(permist 指的是同一时间内允许多少个线程同时执行 acquire()和 release()之间的代码。...private final Semaphore semaphore = n...原创 2020-04-14 17:47:55 · 203 阅读 · 0 评论 -
实战 Git 分支策略
项目上总有那么多不尽人意的地方,导致各方面出现问题。分支管理策略就是其中一个经常遇到的问题。例如:(1) 主干开发,发现代码质量不强,导致代码提交后阻塞,等待修复问题。(2)QA 进入了在 Dev 环境对应 Master 分支,由于 Dev 环境一直在合并代码,QA不得不停下来,因为服务有一段时间可能持续在部署。上述问题就会让我们思考应该如何让我们的分支管理对团队更加有效。在常见的分...原创 2020-02-16 21:52:47 · 310 阅读 · 0 评论 -
SpringBoot连接常见设置
Spring Boot 集成了 Servlet 容器,因此我们可以方便的启动一个容器,并访问其中的接口。那么如何控制 Servlet 容器中的线程池呢?可以通过如下配置进行控制server: tomcat: appcect-count: 1 min-space-threads: 1 max-threads: 2 max-connect...原创 2020-02-16 14:01:09 · 299 阅读 · 0 评论 -
实战Arch Unit
在以前的文章中介绍了通过 《实战PMD》、《实战Checkstyle》在代码级守护我们的代码,比通过《实战Jacoco》来了解当前项目的测试覆盖情况。通过得到数据了解我们的项目质量,进行定向的改进。使用这些简单方面的自动化工具比凭空猜想或者全靠人力来接发现代码上的问题,效率高多了。这篇文章将聚焦在Arch Unit上,Arch Unit能通过为我们提供架构的守护。开发前的准备项目...原创 2020-02-15 22:43:33 · 592 阅读 · 1 评论 -
拼接“1亿行字符串”你会遇到什么问题?
本文将涉及到的三方面的内容,如下:1,一个10万次的for循环,4种实现的性能对比2,直接将For循环改为1亿次,遇到的问题3,拓展00. 需求原计划是生成1亿条模拟数据,详细的需求如下:创建1亿条Insert SQL语句,例如: INSERT INTO products (`id`,`code`) value (1, '000000000');其中, id ...原创 2020-01-17 14:31:37 · 212 阅读 · 0 评论 -
DDD提升我的开发效率
2019年参加了"领域驱动设计峰会2019"看到了国内、国外、不同行业在基于DDD的实践分享。成年热学习的一个特点就是带着自己的经验来思考接收到的内容,那么回顾自己接触DDD有一段时间,将自己的经验和思考作用在项目上,真真切切替换了DDD带给我的提升。本片内容将不会聚焦在哪些理论上,而是看看那些些提升我开发效率的技术部分(非具体代码的粒度)。充血模型 代替 贫血模型Domain + D...原创 2019-12-29 18:10:36 · 568 阅读 · 1 评论 -
重构分析21: 被拒绝的遗赠(Refused Bequest)
子类和父类的关系开始很简单,但是随着时间的推移有可能会变的越来越复杂。一个子类通常需要紧密的依赖其父类,但是有时会矫枉过正。这就是继承的两面性,下面我们看看继承可能代码的Code Smell。01 场景复现需求描述这是关于活动(Activity)和票(Ticket)的业务需求:活动的主题(ActityType): session | workshop | read | TDD活动(A...原创 2019-12-22 13:51:17 · 1308 阅读 · 0 评论 -
如何写出好的测试
如何写出好的测试我们知道编写测试能够带来很多好处。那么除了只是停留在编写测试上,我们应该如何编写好的测试呢?这里翻译了一篇2012年Eric Lewis的一篇文章《How to write good tests》。提交历史显示,这篇内容还在一直维护。##正文开始01 保持测试代码的短小可读要实现这一点就必须产品代码进行重构。否则测试端就会因遗留代码而变得腐败。如果测试代码不能很容易的...翻译 2019-12-20 19:00:30 · 146 阅读 · 0 评论 -
Java几种常用的断言风格你怎么选?
日常工作中,不管你是写Unit Test,还是采用TDD的编程方式进行开发,都会遇到断言。而断言的风格常见的会有Assert、BDD风格,对于这些常见的断言风格你怎么选择呢?01 Assert风格JUnit中提供了这样的assert断言风格,例如:@Test void should_be_unlocked_when_insert_coin_given_a_entrance_machi...原创 2019-12-15 14:08:03 · 226 阅读 · 0 评论 -
单纯的使用Optional并不能很好的解决业务中的NPE问题
工作中经常会遇到NPE(NullPointException)问题怎么处理,得到最多的回答就是Optional来处理,但是单纯的使用Optional并不能很好的解决业务中的NP问题。所以整理出日常工作中处理NPE问题的思路,供参考。先看一下思路:01 避免的操作01.01 避免入参使用 Optional日常工作中有是看到如下代码。public void execute(Optional...原创 2019-12-14 17:03:38 · 415 阅读 · 0 评论 -
有限状态机的4中实现对比
有限状态机的4中实现对比在日常工作过程中,我们经常会遇到状态的变化场景,例如订单状态发生变化,商品状态的变化。这些状态的变化,我们称为有限状态机,缩写为FSM( F State Machine).。之所以称其为有限,是因为这些场景中的状态往往是可以枚举出来的有限个的,所以称其为有限状态机。下面我们来看一个具体的场景例子。简单场景:地铁进站闸口的状态有两个:已经关闭、已经开启两个状态。刷卡后...原创 2019-12-14 12:32:13 · 217 阅读 · 0 评论