业务需求需要一种类似redis的bitmap的数据结构,java中有bitArray,但是功能不够全,需要一种移位操作,即,每一秒都把BitArray右移一位,下面来实现,整体感觉跟hashmap arraylist都差不多,顺便多写点注释:
其实经过测试可以知道,对于实现随着时间每一秒推移追加一个bit位的操作,历史记录时间在60s内最好用long的移位直接实现,简单也最高效,但超过long的64位上限就不行了,其次是boolean[]不停的arrayCopy和set,速度慢一点空间占用多一点,最后才是下文代码中的tailSet方法,复杂度高慢的明显但占用空间少。需要综合考虑场景,最好用long直接实现
即:
long l = (l<<1)|1;
代表了时间过了1s,新来的数据标记为1,表示存在数据,超级简单快
//可以继承security包下的BitArray,很多方法用父类,简介
//这里便于理解,部分简单方法直接从源码copy,不继承
//新增了一个成员变量capacity,因为移动意味着实际容量会减少
public class BitArray1 {
// 存储真正的二进制数据
private byte[] repn;
private int length; //整个数据结构的长度
private int capacity;//当前已使用的容量
public BitArray1(int var1) throws IllegalArgumentException {
if (var1 < 0) {
throw new IllegalArgumentException("Negative length for BitArray");
} else {
this.length = var1;
this.repn = new byte[(var1 + 8 - 1) / 8];
}
}
// subscript下标,返回这个位置应该有多少个整的byte
private static int subscript(int var0) {
return var0 / 8;
}
//返回var0 在一个byte内应处的位置,从右往左走的,也就是一个byte内的应有的二进制表示
private static int position(int var0) {
return 1 << 7 - var0 % 8;
}
//var1 要放置的位置,var2放置true还是false