转载:为什么要使用 slf4j 而不是 log4j

每一个 java 程序员都知道日志对于任何一个 java 应用程序,尤其是服务端程序是至关重要的,而很多程序员也已经熟悉各种不同的日志库,如 java.util.logging、Apache log4j,以及 logback 等。但如果你还不知道 slf4j(Simple logging facade for Java)的话,那么是时候去在你项目中学习使用 slf4j 了。

在这篇文章中,我们将学习为什么使用 slf4j 比 log4j 或者 java.util.logging 要优秀。自从上次我写 java 程序员的 10 个日志技巧已经有一段时间了,我已经不记得我写的关于日志的一切了。

阅读全文

理清 CountDownLatch 与 CyclicBarrier 的区别

对于刚接触同步器的同学来说,CountDownLatch 和 CyclicBarrier 应该是两个比较容易混淆的组件,它们都能表示让多个线程等待某个特定事件的语义,不过在功能上还是存在一些差别,实际上它们的 主要区别在于参与的线程是否需要阻塞相互等待一起到达事件的位置,然后再继续向下执行 。官方对这两个组件的定义分别如下:

  • CountDownLatch : A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.
  • CyclicBarrier : A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.

看了之后是不是更加迷惑?下面我们通过举例来理清这二者的区别。

阅读全文

转载:Cookies 中的那些事儿

HTTP cookies,通常称之为 “cookie”,已经存在很长时间了,但是仍然没有被充分理解。首要问题是存在许多误解,认为 cookie 是后门程序或病毒,却忽视了其工作原理。第二个问题是,对于 cookie 的操作缺少统一的接口。尽管存在这些问题,cookie 仍旧在 Web 开发中扮演者重要的角色,以至于如果没有出现相应的代替品就消失的话,我们许多喜欢的 Web 应用将变的不可用。

阅读全文

二叉树遍历算法的非递归实现

二叉树遍历中的前、中、后,说的都是双亲结点,而左孩子结点和右孩子结点始终是先左再右。基于递归实现二叉树的遍历算法较为简单,如果放弃递归策略而以非递归的方式实现,则所有的遍历实现都需要借助于 栈结构

前序遍历

前序遍历算法的遍历次序是 “中-左-右”。

阅读全文

模式匹配:KMP 算法

KMP 算法是在给定字符串中检索目标字符串的算法,该算法由 Knuth、Morris 和 Pratt 三人在 Brute-Force 算法的基础上提出的模式匹配改进算法。该算法消除了 Brute-Force 在进行匹配时,只要遇到不相等字符就需要回退到本次比较起始位置的后一个位置继续开始新一轮的比较的缺点,这样的回退就把过程中所有的比较操作的时间付出全部给否定了,KMP 算法则正是需要在匹配失败时,利用之前的匹配结果,再不回退的情况下开始新的一轮比较,KMP 总会将目标字符串向前移动到合适的位置,保证当前指针前的字符串都是匹配的。

阅读全文