java中的BitSet使用實戰(zhàn)實例
更新時間:2025年09月22日 17:03:06 作者:有夢想的攻城獅
Java中的BitSet類是一個高效處理位操作的工具類,用于表示可動態(tài)擴展的位向量(bit vector),本文給大家介紹java中的BitSet使用實戰(zhàn)實例,感興趣的朋友一起看看吧
Java中的BitSet類是一個高效處理位操作的工具類,用于表示可動態(tài)擴展的位向量(bit vector)。以下是詳細解析:
一、核心特性
- 動態(tài)擴容:初始容量可指定,超出時自動擴展
- 空間效率:每個位僅占1 bit(傳統(tǒng)boolean數(shù)組占1 byte)
- 線程不安全:非同步實現(xiàn),多線程需自行同步
二、基礎(chǔ)用法
1. 創(chuàng)建實例
BitSet bits1 = new BitSet(); // 默認初始容量(64位) BitSet bits2 = new BitSet(100); // 初始至少容納100位
2. 基本操作
BitSet bits = new BitSet(); // 設(shè)置位 bits.set(3); // 第3位設(shè)為true(索引從0開始) bits.set(5, true); // 顯式設(shè)置true bits.set(10, 20); // 設(shè)置區(qū)間[10,20)為true // 清除位 bits.clear(3); // 清除第3位 bits.clear(5, 15); // 清除區(qū)間[5,15) // 獲取狀態(tài) boolean b = bits.get(3); // 返回false(已被清除) // 翻轉(zhuǎn)位 bits.flip(2); // 第2位取反 bits.flip(0, 10); // 翻轉(zhuǎn)區(qū)間[0,10)
三、高級功能
1. 位運算
BitSet a = new BitSet(); a.set(0, 3); // 0,1,2位為true BitSet b = new BitSet(); b.set(2, 5); // 2,3,4位為true a.and(b); // 與操作:結(jié)果僅2位為true a.or(b); // 或操作:0-4位為true a.xor(b); // 異或操作:0,1,3,4位為true a.andNot(b); // 差集操作:0,1位為true
2. 實用方法
int cardinality = bits.cardinality(); // 統(tǒng)計true位的數(shù)量 int length = bits.length(); // 最高設(shè)置位索引+1 int size = bits.size(); // 實際使用空間(bits) byte[] bytes = bits.toByteArray(); // 轉(zhuǎn)為字節(jié)數(shù)組 long[] longs = bits.toLongArray(); // 轉(zhuǎn)為長整型數(shù)組 BitSet newBits = (BitSet) bits.clone(); // 深拷貝
四、典型應(yīng)用場景
- 海量數(shù)據(jù)標記:存儲千萬級數(shù)據(jù)的開關(guān)狀態(tài)
- 集合運算:快速實現(xiàn)交集/并集/差集操作
- 布隆過濾器:作為底層位數(shù)組實現(xiàn)
- 權(quán)限系統(tǒng):用位掩碼表示權(quán)限組合
- 算法優(yōu)化:如八皇后問題、數(shù)獨求解等
五、性能對比
| 數(shù)據(jù)結(jié)構(gòu) | 內(nèi)存占用(1000元素) | 訪問速度 |
|---|---|---|
| boolean[] | ~1000 bytes | O(1) |
| BitSet | ~125 bytes | O(1) |
| EnumSet | ~20 bytes | O(1) |
六、注意事項
- 索引越界:訪問未設(shè)置的位返回false,不會報錯
- 擴容機制:容量不足時自動翻倍擴展(如64→128→256…)
- 序列化:直接序列化可能因JDK版本產(chǎn)生兼容問題
- 替代方案:對線程安全要求高時可用
ConcurrentBitSet
七、實戰(zhàn)示例
// 查找重復(fù)元素
BitSet seen = new BitSet();
int[] arr = {3, 1, 4, 1, 5, 9, 2, 6};
for (int num : arr) {
if (seen.get(num)) {
System.out.println("重復(fù)值: " + num);
}
seen.set(num);
}
// 輸出:重復(fù)值: 1通過合理使用BitSet,可以在空間效率和操作性能之間取得良好平衡。建議根據(jù)具體場景評估是否適合使用位操作方案。
到此這篇關(guān)于java中的BitSet使用詳解的文章就介紹到這了,更多相關(guān)java bitset使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java利用Spire.PDF實現(xiàn)將PDF文檔轉(zhuǎn)換為Word格式
在日常工作和學(xué)習(xí)中,我們經(jīng)常會遇到PDF文檔,本文將詳細介紹如何才能高效、精準地使用Java實現(xiàn)PDF到Word的自動化轉(zhuǎn)換,感興趣的小伙伴可以了解下2025-09-09
MyBatis-Plus與PageHelper依賴的jsqlparser庫沖突
在升級SpringBoot到3.x版本的同時,升級MyBatis-Plus后發(fā)現(xiàn)PageHelper無法使用,原因是MyBatis-Plus和PageHelper都依賴jsqlparser庫,且PageHelper要求特定版本的jsqlparser,解決方法是在項目中排除這兩個庫的jsqlparser依賴,直接引用jsqlparser4.7版本2024-10-10
Spring Cloud Stream分區(qū)分組原理圖解
這篇文章主要介紹了Spring Cloud Stream的分區(qū)和分組,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03

