java中BitArray用来模拟时间序列或位图等功能

本文介绍了如何使用Java中的BitArray来模拟时间序列或位图功能,特别是针对业务需求中类似Redis的Bitmap数据结构。通过讨论不同实现方式的效率,如long的移位操作、boolean数组的arrayCopy和set,以及使用tailSet方法,文章强调在不超过long的64位限制时,使用long移位是最简单高效的选择。对于超过64位的情况,其他方法的优缺点进行了分析。
摘要由CSDN通过智能技术生成

业务需求需要一种类似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

    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值