java.util.BitSet處理海量數(shù)據(jù)【轉(zhuǎn)】

Java.util.BitSet可以按位存儲(chǔ)。 計(jì)算機(jī)中一個(gè)字節(jié)(byte)占8位(bit)伏恐,我們java中數(shù)據(jù)至少按字節(jié)存儲(chǔ)的, 比如一個(gè)int占4個(gè)字節(jié)。 如果遇到大的數(shù)據(jù)量璧针,這樣必然會(huì)需要很大存儲(chǔ)空間和內(nèi)存。 如何減少數(shù)據(jù)占用存儲(chǔ)空間和內(nèi)存可以用算法解決渊啰。 java.util.BitSet就提供了這樣的算法探橱。

比如有一堆數(shù)字,需要存儲(chǔ)绘证,source=[3,5,6,9] 用int就需要4*4個(gè)字節(jié)隧膏。 。 如果用java.util.BitSet嚷那,則會(huì)少很多胞枕,其原理是:

先找出數(shù)據(jù)中最大值maxvalue=9

聲明一個(gè)BitSet bs,它的size是maxvalue+1=10

遍歷數(shù)據(jù)source,bs[source[i]]設(shè)置成true.

最后的值是:

[0,0,0,1,0,1,1,0,0,1]3569

這樣一個(gè)本來(lái)要int型需要占4字節(jié)共32位的數(shù)字現(xiàn)在只用了1位魏宽! 比例32:1

這樣就省下了很大空間腐泻。

BitSet是位操作的對(duì)象,值只有0或1即false和true湖员,最常用的地方是用戶贫悄、系統(tǒng)開(kāi)關(guān),原理是內(nèi)部維護(hù)了一個(gè)long數(shù)組娘摔,初始只有一個(gè)long窄坦,所以BitSet最小的size是64,當(dāng)隨著開(kāi)關(guān)越來(lái)越多,會(huì)動(dòng)態(tài)擴(kuò)充鸭津,最終內(nèi)部是由N個(gè)long來(lái)存儲(chǔ)彤侍,這些對(duì)操作都是透明的。

final BitSet bs = new BitSet();

默認(rèn)的構(gòu)造函數(shù)聲明一個(gè)64位的BitSet逆趋,值都是false盏阶。 如果你要用的位超過(guò)了默認(rèn)size,它會(huì)再申請(qǐng)64位,而不是報(bào)錯(cuò)

public void set(int pos): 位置pos的字位設(shè)置為true闻书。

public void set(int bitIndex, boolean value) 將指定索引處的位設(shè)置為指定的值名斟。

public void clear(int pos): 位置pos的字位設(shè)置為false。

public void clear() : 將此 BitSet 中的所有位設(shè)置為 false魄眉。

public int cardinality() 返回此 BitSet 中設(shè)置為 true 的位數(shù)砰盐。

public boolean get(int pos): 返回位置是pos的字位值。

public void and(BitSet other): other同該字位集進(jìn)行與操作坑律,結(jié)果作為該字位集的新值岩梳。

public void or(BitSet other): other同該字位集進(jìn)行或操作,結(jié)果作為該字位集的新值晃择。

public void xor(BitSet other): other同該字位集進(jìn)行異或操作冀值,結(jié)果作為該字位集的新值。

public void andNot(BitSet set) 清除此 BitSet 中所有的位,set - 用來(lái)屏蔽此 BitSet 的 BitSet

public int size(): 返回此 BitSet 表示位值時(shí)實(shí)際使用空間的位數(shù)宫屠。

public int length() 返回此 BitSet 的“邏輯大小”:BitSet 中最高設(shè)置位的索引加 1列疗。

bites.toByteArray();

bites.toLongArray();

BitSet.valueOf(byte[]);

//一個(gè)字符串中用了哪些字符@TestpublicvoidcharCalc(){finalString wordstr ="hello, world 你好嗎";finalBitSet bs =newBitSet();for(charc : wordstr.toCharArray()){? ? ? ? ? ? bs.set(c);//System.out.println("-------------");}? ? ? ? System.out.println(bs.size());? ? ? ? System.out.println(bs.length());for(inti=0; i maxnum)break;? ? ? ? ? ? ? ? bs.set(x);? ? ? ? ? ? ? ? j++;? ? ? ? ? ? }? ? ? ? }for(inti=2;i<=maxnum;i++){if(!bs.get(i))? System.out.println(i);? ? ? ? }? ? }

//現(xiàn)在有1千萬(wàn)個(gè)隨機(jī)數(shù),隨機(jī)數(shù)的范圍在1到1億之間±缩澹現(xiàn)在要求寫出一種算法作彤,將1到1億之間沒(méi)有在隨機(jī)數(shù)中的數(shù)求出來(lái)@Testpublicvoidfindrandom(){

System.out.println("開(kāi)始生成隨機(jī)數(shù) "+newDate());finalint[] numbers =newint[10000000];for(inti=0;i

numbers[i] = RandomUtils.nextInt(1,100000001);

}

System.out.println("生成隨機(jī)數(shù)完畢 "+newDate());////////////////////////finalBitSet bs =newBitSet(numbers.length);for(intn : numbers){

bs.set(n);

}

System.out.println("設(shè)置位圖完畢 "+newDate());for(inti=1;i<100000001;i++){if(!bs.get(i))? System.out.println(i);//沒(méi)有在隨機(jī)數(shù)中//if(bs.get(i)) System.out.println(i);? //在隨機(jī)數(shù)中}

System.out.println("打印完畢 "+newDate());

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市乌逐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌创葡,老刑警劉巖浙踢,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異灿渴,居然都是意外死亡洛波,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門骚露,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蹬挤,“玉大人,你說(shuō)我怎么就攤上這事棘幸⊙姘猓” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吨悍。 經(jīng)常有香客問(wèn)我扫茅,道長(zhǎng),這世上最難降的妖魔是什么育瓜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任葫隙,我火速辦了婚禮,結(jié)果婚禮上躏仇,老公的妹妹穿的比我還像新娘恋脚。我一直安慰自己,他們只是感情好焰手,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布糟描。 她就那樣靜靜地躺著,像睡著了一般册倒。 火紅的嫁衣襯著肌膚如雪蚓挤。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天驻子,我揣著相機(jī)與錄音灿意,去河邊找鬼。 笑死崇呵,一個(gè)胖子當(dāng)著我的面吹牛缤剧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播域慷,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼荒辕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了犹褒?” 一聲冷哼從身側(cè)響起抵窒,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叠骑,沒(méi)想到半個(gè)月后李皇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宙枷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年掉房,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慰丛。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卓囚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诅病,到底是詐尸還是另有隱情哪亿,我是刑警寧澤粥烁,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站锣夹,受9級(jí)特大地震影響页徐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜银萍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一变勇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贴唇,春花似錦搀绣、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瓶您,卻和暖如春麻捻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呀袱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工贸毕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夜赵。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓明棍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親寇僧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子摊腋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法嘁傀,內(nèi)部類的語(yǔ)法兴蒸,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法细办,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,598評(píng)論 18 399
  • 一类咧、 1、請(qǐng)用Java寫一個(gè)冒泡排序方法 【參考答案】 public static void Bubble(int...
    獨(dú)云閱讀 1,353評(píng)論 0 6
  • 【程序1】 題目:古典問(wèn)題:有一對(duì)兔子蟹腾,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子,小兔子長(zhǎng)到第三個(gè)月后每個(gè)月又生一對(duì)兔...
    葉總韓閱讀 5,128評(píng)論 0 41
  • Java經(jīng)典問(wèn)題算法大全 /*【程序1】 題目:古典問(wèn)題:有一對(duì)兔子区宇,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子娃殖,小兔子...
    趙宇_阿特奇閱讀 1,850評(píng)論 0 2
  • 酷狗做到今天已經(jīng)11年了,PC端跟移動(dòng)端達(dá)到了4億月活躍的規(guī)模议谷,能做到這樣是不容易的炉爆,為什么能做到這樣呢,我想跟我...
    丶追殺那只熊閱讀 1,092評(píng)論 0 5