Bitset是Java中的一种数据结构。Bitset中主要存储的是二进制位,做的也是位运算,每一位只用来存储0,1值,主要用于对数据的标记。
BitSet是位操作的对象,值只有0或1(即true 和 false),内部维护一个long数组,初始化只有一个long segement,所以BitSet最小的size是64;随着存储的元素越来越多,BitSet内部会自动扩充,一次扩充64位,最终内部是由N个long segement 来存储。
Bitset的基本原理是,用1位来表示一个数据是否出现过,0为没有出现过,1表示出现过。默认情况下,BitSet所有位都是0即false。
JDK选择long数组作为BitSet的内部存储结构是出于性能的考虑,在and和or的时候减少循环次数,提高性能。
应用场景:海量数据去重、排序、压缩存储
优点:按位存储,内存占用空间小
缺点:线程不安全
基本操作:
BitSet bitSet1 = new BitSet(); BitSet bitSet2 = new BitSet(); for(int i=0; i<15; i++){ if(i%3 != 0 && i%5 != 0) bitSet1.set(i); if(i%2 == 0) bitSet2.set(i); } bitSet1.and(bitSet2); //交集 bitSet1.or(bitSet2); //并集 bitSet1.andNot(bitSet2); //返回左BitSet中,不在右BitSet的数据 bitSet1.xor(bitSet2); //返回左右BitSet中,不在左右BitSet的数据 bitSet1.intersects(bitSet2); //两边都有位值为true的数据,则返回true bitSet1.set(100); //标识索引为100的位有数据 System.out.println(bitSet1.get(100)); //获取索引为100的位是否有数据 System.out.println(bitSet1.size()); //集合大小,64的倍数 System.out.println(bitSet1.length()); //数据集的长度 System.out.println(bitSet1.cardinality()); //位值为true的个数 bitSet1.set(100); //返回指定index及其后的第一个位值为true的index,找不到返回-1 System.out.println(bitSet1.nextSetBit(0)); System.out.println(bitSet1.nextSetBit(14)); System.out.println(bitSet1.nextSetBit(15)); //返回指定index及其前的第一个位值为true的index,找不到返回-1 System.out.println(bitSet1.previousSetBit(200)); System.out.println(bitSet1.previousSetBit(14)); System.out.println(bitSet1.previousSetBit(0));
去重排序:
ThreadLocalRandom rnd = ThreadLocalRandom.current(); //数据初始化 int arrayLength = 10; int[] array = new int[arrayLength]; for(int i=0; i<arrayLength; i++){ array[i] = rnd.nextInt(arrayLength * 10); } System.out.println(Arrays.toString(array)); //将数据放入BitSet中,会去重 BitSet bitSet = new BitSet(); for(int i=0; i<array.length; i++){ bitSet.set(array[i]); } //递增排序显示 int i = 0; for(i=bitSet.nextSetBit(0); i>=0; i=bitSet.nextSetBit(i+1)){ System.out.print(i + ", "); } System.out.println(); //递减排序显示 for(i=bitSet.previousSetBit(bitSet.length()); i>=0; i=bitSet.previousSetBit(i-1)){ System.out.print(i + ", "); } System.out.println();
相关推荐
RoaringBitmap, 在Java中,一个更好的压缩 bitset RoaringBitmap Bitsets,也称为位图,通常用作快速数据结构。 不幸的是,他们可以使用太多的内存。 为了补偿,我们经常使用压缩位图。咆哮位图是压缩位图,它比传统...
位集是一种特殊的数据结构,它使用二进制位来表示一系列布尔值,通常用于存储有限集合的成员资格。Go的`bitset`包实现了这个概念,提供了快速的插入、删除和查询操作,对于处理大量布尔状态或者节省内存非常有用。在...
在C++编程中,数据结构是至关重要的一个领域,它涉及到如何有效地组织和管理数据,以便于高效地访问和操作。...通过实践和深入研究,你可以更好地掌握这些数据结构的使用方法和内部机制,从而成为更优秀的C++程序员。
在编程领域,数据结构是构建高效算法...这些头文件的使用,可以帮助你更高效地编写和实现各种数据结构,提高代码的可读性和可维护性。通过熟练掌握这些头文件中的功能,你可以更好地理解和运用数据结构,提升编程技能。
`C++ bitset` 是一个内置的类型,用于在内存中高效存储和操作位序列。在C++标准库中,`<bitset>` 头文件提供了`std...通过这样的实践,开发者可以更好地理解C++标准库的工作原理,并能根据特定需求定制自己的数据结构。
在整个项目实施过程中,还需要关注数据结构的优化,比如使用Set来避免重复计算,使用优先队列(PriorityQueue)来实现最小堆优化搜索效率,或者使用BitSet进行位运算以节省空间。此外,良好的编程习惯,如代码注释、...
Java中BitSet类是Java集合框架的一部分,它是一种用于处理位操作的高级数据结构。BitSet可以看作是一个只存储布尔值的数组,但相比于原始的布尔数组,BitSet更加内存高效,因为它以64位的块(word)来存储多个布尔值...
Java 数据结构详细教程 Java 数据结构是 Java 编程语言中的一种基本组成部分,它提供了强大的数据结构来存储和管理数据。在 Java 中的数据结构主要包括枚举、位集合、向量、栈、字典、哈希表、属性等接口和类。 ...
Java 作为一种广泛使用的开发语言,其工具包(Java API)为开发者提供了丰富的数据结构支持,使得程序员能够高效地处理各种复杂的数据。在Java早期版本中,一些基础数据结构包括枚举(Enumeration)、位集合(BitSet...
因为 BitSet 使用 long 数组作为内部存储结构的,所以可以处理大规模的数据。另外,BitSet 还可以使用逻辑与、逻辑或和逻辑异或操作来进行数据统计和分析。 BitSet 的应用举例 例如,在阿里的实习面试中,有一个...
bitset是Java中的一种数据结构,通过使用bitset可以实现毫秒级查询。下面我们将详细讲解如何使用bitset实现毫秒级查询。 bitset的内部实现是long数组,每一个位的默认值为false(0)。bitset的长度可以按需增长,...
Java语言提供了丰富的数据结构,这些数据结构在编程中扮演着重要的角色,帮助我们高效地组织和管理数据。以下是关于标题和描述中提到的几个关键数据结构的详细说明: 1. 枚举(Enumeration) 枚举在Java中是一种...
本篇博客深入探讨了 C++ 中的两种重要数据结构——BitSet 和 BloomFilter。我们首先介绍了它们的基本概念和使用场景,然后详细分析了它们的实现方法,包括高效接口设计和性能优化策略。接着,我们通过对比这两种数据...
java bitset 高级数据结构 源码解析 适合 0-3 年开发人员,进阶、面试必备知识!
- **内存效率**:bitset.js通过紧凑的数据结构减少了内存占用,相比于使用布尔数组,对于大量数据,它可以显著减少内存消耗。 - **计算效率**:通过高效的位运算,bitset.js能够快速完成位级操作,尤其是在进行...
在这个“最最适用的Java数据结构全集”中,你将找到一系列关于如何在Java中实现和使用各种数据结构的源代码。让我们深入探讨一下这些核心概念。 1. **数组(Array)**:数组是最基础的数据结构,它允许我们在内存中...
13. **堆栈和队列的实现** - 使用数组或链表可以实现栈和队列,Java中的`java.util.Stack`和`java.util.Queue`接口提供了抽象层,便于实现不同的数据结构。 14. **跳表(Skip List)** - 跳表是一种可以快速查找的...
本文将详细介绍 Java 中的传统数据结构接口和类,包括枚举(Enumeration)、位集合(BitSet)、向量(Vector)、栈(Stack)、字典(Dictionary)、哈希表(Hashtable)以及属性(Properties)。此外,还将简要介绍 ...
数据结构是计算机科学中至关重要的一个分支,主要研究如何高效地组织和管理数据,以便进行快速的查询、插入、删除等操作。在这个深圳大学自动化专业的数据结构(PPT)学习教案中,重点讲解了集合和字典这两种数据结构...