Java(13)—Bitset类

0x01 定义

一个Bitset类创建一种特殊类型的数组来保存位值。BitSet中数组大小会随需要增加默认是64比特,而且里面的值默认都是false。这是一个特殊的类来源于 java.util.BitSet。

0x02 支持函数

和数组的差不多,但是是无法进行赋值的。下面给出一个总表。

1.void and(BitSet set)

对此目标位 set 和参数位 set 执行逻辑与操作。

2.void andNot(BitSet set)

清除此 BitSet 中所有的位,其相应的位在指定的 BitSet 中已设置。

3.int cardinality( )

返回此 BitSet 中设置为 true 的位数。

4.void clear( )

将此 BitSet 中的所有位设置为 false。

5.void clear(int index)

将索引指定处的位设置为 false。

6.void clear(int startIndex, int endIndex)

将指定的 startIndex(包括)到指定的 toIndex(不包括)范围内的位设置为 false。

7.Object clone( )

复制此 BitSet,生成一个与之相等的新 BitSet。

8.boolean equals(Object bitSet)

将此对象与指定的对象进行比较。

9.void flip(int index)

将指定索引处的位设置为其当前值的补码。

10.void flip(int startIndex, int endIndex)

将指定的 fromIndex(包括)到指定的 toIndex(不包括)范围内的每个位设置为其当前值的补码。

11.boolean get(int index)

返回指定索引处的位值。

12.BitSet get(int startIndex, int endIndex)

返回一个新的 BitSet,它由此 BitSet 中从 fromIndex(包括)到 toIndex(不包括)范围内的位组成。

13.int hashCode( )

返回此位 set 的哈希码值。

14.boolean intersects(BitSet bitSet)

如果指定的 BitSet 中有设置为 true 的位,并且在此 BitSet 中也将其设置为 true,则返回 true。

15.boolean isEmpty( )

如果此 BitSet 中没有包含任何设置为 true 的位,则返回 true。

16.int length( )

返回此 BitSet 的"逻辑大小":BitSet 中最高设置位的索引加 1。

17.int nextClearBit(int startIndex)

返回第一个设置为 false 的位的索引,这发生在指定的起始索引或之后的索引上。

18.int nextSetBit(int startIndex)

返回第一个设置为 true 的位的索引,这发生在指定的起始索引或之后的索引上。

19.void or(BitSet bitSet)

对此位 set 和位 set 参数执行逻辑或操作。

20.void set(int index)

将指定索引处的位设置为 true。

21	void set(int index, boolean v)

将指定索引处的位设置为指定的值。

22.void set(int startIndex, int endIndex)

将指定的 fromIndex(包括)到指定的 toIndex(不包括)范围内的位设置为 true。

23.void set(int startIndex, int endIndex, boolean v)

将指定的 fromIndex(包括)到指定的 toIndex(不包括)范围内的位设置为指定的值。

24.int size( )

返回此 BitSet 表示位值时实际使用空间的位数。

25.String toString( )

返回此位 set 的字符串表示形式。

26.void xor(BitSet bitSet)

对此位 set 和位 set 参数执行逻辑异或操作。

0x03 使用场景

当实际问题涉及到海量数据进行一些统计工作,比如日志分析、用户数统计等
应用于这一格特性的原因是,如果全部是用值来存储,一个int类型占用的大小是4个字节,但是使用Bitset来存储的话可能就几个比特。打一个简单的例子。

场景一:比如我们需要存储的系列数字列表:

array[] num = [2,5,7,9]

这里一个数字占四个字节,总共占了16个字节。下面我们来使用BitSet来存储。假设BitSet 的一个列表为 Bity。
方法:Bity[num[i]] = 1,i为对num数组的遍历。

package com.BitSet;
import java.util.BitSet;

public class Bit {
    public static void main(String[] args) {
        int[] num ={2,5,7,9};
        BitSet Bit1 = new BitSet(10);

        for (int i = 0; i < num.length; i++)
        {
            Bit1.set(num[i]);
        }
        System.out.println(Bit1+"\nTure的总数为"+Bit1.cardinality());
    }
}

运行结果:
在这里插入图片描述

场景二:阿里的实习面试中的一道题:有1千万个随机数,随机数的范围在1到1亿之间。现在要求写出一种算法,将1到1亿之间没有在随机数中的数求出来?
来源:Java BitSet使用场景和示例
.

package com.BitSet;
import javax.swing.*;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.List;
import java.util.Random;

public class Bit {
    public static void main(String[] args) {
        int All = 0;
        Random random=new Random();
        BitSet bitSet=new BitSet(100000000);

        for(int i=0;i<10000000;i++) {
            int randomResult = random.nextInt(100000000);
            bitSet.set(randomResult);//直接设置对应的位置
        }
        for (int i = 0; i < 100000000; i++)
        {
        	//不为True
            if(!bitSet.get(i))
            {
                All++;
            }
        }
        System.out.println("不在范围内的数有"+All);
    }
}

实验结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值