我以为我会junit,原来我还不会

junit从某种程度上来说应该是很简单的一项技术,但是正所谓会者不难,难者不会,如果没有好好地用过,总会有些你以为是对的地方,其实他是错的。
对于有7年java开发经验的我来说,不完全会写junit,实在是汗颜。
以前的项目基本都没怎么要求写junit,所以我一直误以为junit简单到就是在Test中调一下相关方法,只要跑出绿色结果就好了,直到这一次需要相对正式的junit时,才发现这样是不对的,以下是从错到对的一个记录。

继续阅读全文 »

java stream api熟悉和理解

前言

stream api和lambda表达式都是java8出来的,都可以简化代码,也经常会配合着使用。
对于上边的说法,网上是这么说的,但是我自己写的时候,总觉得好像有的时候确实简洁很多,但也有时候似乎反而更麻烦。
所以,根据我目前的理解,我觉得可能它有它的适用场景,但并不能说用它就一定好,但是以后会不会改变这种看法也很难说。
就我目前的了解,stream api主要用在对list集合及数组的操作,最大的优势在于各种中间操作。
stream api是把集合等数据转化成stream,然后提供了一系列的api,尤其是很多返回stram的中间操作api。
单纯的描述可能不好理解,下边是一些基础的示例和对比。

继续阅读全文 »

lambda表达式基础

前言

早在JAVA8出来的时候,我实际就已经了解过一点点lambda表达式和stream流,但是由于写惯了原来的那种风格,再加上当时的项目中也没有什么人使用,所以只是一扫而过,没有深入了解,也没有进行任何的练习,甚至还有那么一点抵触,觉得lambda读起来太不好懂。

继续阅读全文 »

java基础之多线程总结二(CAS和各种常用锁)

CAS

在java中,对很多常见的需要加锁的操作进行了封装,例如Atomic开头的一些类,这些类是线程安全的,但是内部却不是用synchronized加锁实现,而是CAS。
例如AtomicInteger的’incrementAndGet()’方法最终调用的实际是下边这个方法

1
2
3
4
@HotSpotIntrinsicCandidate
public final native boolean compareAndSetInt(Object o, long offset,
int expected,
int x);

继续阅读全文 »