JAVA 实现 Bitmap

public class MyBitmap {

    private byte[] buckets;

    public MyBitmap( int maxNum ) {
        this.init( maxNum );
    }

    private void init(int maxNum){
        int maxBucketIndex = this.getBucketIndex(maxNum);
        this.buckets = new byte[ maxBucketIndex + 1];
    }

    public void add(int num){
        int bucketIndex = this.getBucketIndex(num);
        int bitIndex = this.getBucketInnerBitIndex(num);
        this.buckets[ bucketIndex ] |= 1 << bitIndex;
    }
    
    public boolean contains(int num){
        int bucketIndex = this.getBucketIndex(num);
        int bitIndex = this.getBucketInnerBitIndex(num);
        return ( this.buckets[ bucketIndex ] & 1 << bitIndex ) != 0;
    }

    private int getBucketIndex(int num){
        return num >> 3;
    }
    
    private int getBucketInnerBitIndex(int num){
        return num & 0x07;
    }
}

测试类:

import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args) {
        MyBitmap bitmap = new MyBitmap( 1000 );
        List<Integer> ids = new ArrayList<>();
        ids.add( 1 );
        ids.add( 2 );
        ids.add( 3 );
        ids.add( 15 );
        ids.add( 23 );
        ids.add( 24 );
        ids.add( 25 );
        ids.add( 30 );
        ids.add( 49 );
        ids.add( 50 );
        for( Integer id:ids ){
            bitmap.add( id );
        }
        for( int i=1;i<=50;i++ ){
           if(  bitmap.contains( i ) ){
               System.out.println( i + "存在" );
           }else {
               System.out.println( i + "不存在" );
           }
        }
    }
}

输出:

1存在
2存在
3存在
4不存在
5不存在
6不存在
7不存在
8不存在
9不存在
10不存在
11不存在
12不存在
13不存在
14不存在
15存在
16不存在
17不存在
18不存在
19不存在
20不存在
21不存在
22不存在
23存在
24存在
25存在
26不存在
27不存在
28不存在
29不存在
30存在
31不存在
32不存在
33不存在
34不存在
35不存在
36不存在
37不存在
38不存在
39不存在
40不存在
41不存在
42不存在
43不存在
44不存在
45不存在
46不存在
47不存在
48不存在
49存在
50存在

测试 bitmap 和 hashSet 查询元素的速度:



import java.util.HashSet;
import java.util.Set;


public class Test {


    private static final int SIZE = 5000000;


    public static void main(String[] args) {
        System.out.println( "SIZE = " + SIZE );
        MyBitmap bitmap = new MyBitmap(SIZE);
        Set<Integer> set = new HashSet<>();

        // 装载元素
        for (int i = 0; i < SIZE; i++) {
            bitmap.add( i );
            set.add( i );
        }

        // 预热阶段
        for (int i = 0; i < 20; i++) {
            test_bitmap( bitmap );
            test_hashSet( set );
        }

        // 测试阶段
        long t1 = System.currentTimeMillis();
        test_bitmap( bitmap );
        long t2 = System.currentTimeMillis();
        test_hashSet( set );
        long t3 = System.currentTimeMillis();
        System.out.println( "位图耗时:" + ( t2 - t1 ) + "毫秒" );
        System.out.println( "hashSet耗时:" + ( t3 - t2 ) + "毫秒" );
    }

    public static Integer test_bitmap( MyBitmap bitmap ){
        int count_exist = 0;
        for (int i = 0; i < SIZE; i++) {
            if( bitmap.contains( i ) ){
                count_exist++;
            }
        }
        return count_exist;
    }

    public static Integer test_hashSet( Set<Integer> set ){
        int count_exist = 0;
        for (int i = 0; i < SIZE; i++) {
            if( set.contains( i ) ){
                count_exist++;
            }
        }
        return count_exist;
    }
}

测试输出:

SIZE = 1000000
位图耗时:1毫秒
hashSet耗时:4毫秒


SIZE = 5000000
位图耗时:3毫秒
hashSet耗时:28毫秒

SIZE = 10000000
位图耗时:6毫秒
hashSet耗时:200毫秒

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值