新聞中心
Hashtable實(shí)例有兩個(gè)參數(shù)影響其效率:容量和裝載因子。裝載因子在CLDC實(shí)現(xiàn)中始終是75%(而在其它版本中這個(gè)值是可以指定的)。當(dāng)Hashtable中包含的實(shí)體數(shù)超過裝載因子和當(dāng)前容量的一個(gè)結(jié)合值(這可能通過相應(yīng)的算法得出)時(shí),就通過調(diào)用rehash方法來增加容量。

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比磴口網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式磴口網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋磴口地區(qū)。費(fèi)用合理售后完善,10年實(shí)體公司更值得信賴。
J2ME Hashtable的實(shí)現(xiàn)原理
首先看一下Hashtable的用法。
Hashtable有2個(gè)構(gòu)造函數(shù)
- publicHashtable(intinitialCapacity);//指定容量大小
- publicHashtable(){
- this(11);//默認(rèn)的容量是11,為什么是11,而不是10呢?
- }
Demo1
- HashtablesTable=newHashtable();
- sTable.put("wuhua","wuhua");
- sTable.remove("wuhua");
- sTable.clear();
上面是簡單的用法。
Hashtable源代碼解讀
在了解源代碼之前,我們先來了解下一些java不常用的關(guān)鍵字。
transient
當(dāng)串行化某個(gè)對(duì)象時(shí),如果該對(duì)象的某個(gè)變量是transient,那么這個(gè)變量不會(huì)被串行化進(jìn)去。也就是說,假設(shè)某個(gè)類的成員變量是transient,那么當(dāng)通過ObjectOutputStream把這個(gè)類的某個(gè)實(shí)例保存到磁盤上時(shí),實(shí)際上transient變量的值是不會(huì)保存的。因?yàn)楫?dāng)從磁盤中讀出這個(gè)對(duì)象的時(shí)候,對(duì)象的該變量會(huì)沒有被賦值。另外這篇文章還提到,當(dāng)從磁盤中讀出某個(gè)類的實(shí)例時(shí),實(shí)際上并不會(huì)執(zhí)行這個(gè)類的構(gòu)造函數(shù),而是讀取這個(gè)類的實(shí)例的狀態(tài),并且把這個(gè)狀態(tài)付給這個(gè)類的對(duì)象。
Transient這個(gè)關(guān)鍵字很重要,來看下源代碼里面有幾處是用到這個(gè)關(guān)鍵字的。
- privatetransientHashtableEntrytable[];
- privatetransientintcount;
源代碼中只有上面兩個(gè)字段的定義是用到的,但是這兩個(gè)字段是用于存儲(chǔ)style="COLOR:#000000"target=_blank>存儲(chǔ)Hashtable的容器字段,因此可以說Hashtable是不允許序列化的。#p#
內(nèi)部類
Hashtable有2個(gè)內(nèi)部類
HashtableEntry--用于存放key-value,nextElement的類。
- classHashtableEntry{
- inthash;
- Objectkey;
- Objectvalue;
- HashtableEntrynext;
- }
HashtableEnumerator遍歷的枚舉類。
- classHashtableEnumeratorimplementsEnumeration{
- booleankeys;
- intindex;
- HashtableEntrytable[];
- HashtableEntryentry;
- HashtableEnumerator(HashtableEntrytable[],booleankeys){
- this.table=table;
- this.keys=keys;
- this.index=table.length;
- }
- publicbooleanhasMoreElements(){
- if(entry!=null){
- returntrue;
- }
- while(index-->0){
- if((entry=table[index])!=null){
- returntrue;
- }
- }
- returnfalse;
- }
- publicObjectnextElement(){
- if(entry==null){
- while((index-->0)&&((entry=table[index])==null));
- }
- if(entry!=null){
- HashtableEntrye=entry;
- eentry=e.next;
- returnkeys?e.key:e.value;
- }
- thrownewNoSuchElementException(
- /*#ifdefVERBOSE_EXCEPTIONS*/
- ///skipped"HashtableEnumerator"
- /*#endif*/
- );
- }
- }
代碼寫的是相當(dāng)?shù)暮喗?。有一些比較技巧性的用法也是相當(dāng)?shù)牟诲e(cuò),比如:
- if(entry==null){
- while((index-->0)&&((entry=table[index])==null));
- }這段寫的是相當(dāng)?shù)暮?,可見作者的功力,循環(huán)變量table
- while(index-->0)
- //循環(huán)變量,查看是否有下一個(gè)元素,
- if((entry=table[index])!=null){
- returntrue;
- }
- }
了解了Hashtable的數(shù)據(jù)存放格式,我們看看存放的關(guān)鍵邏輯在put,remove,get方法中存在。
- intindex=(hash&0x7FFFFFFF)%tab.length;
這樣的函數(shù),這個(gè)函數(shù)的意義上,根據(jù)散列值來獲取對(duì)象的存儲(chǔ)位置。
【編輯推薦】
- J2ME數(shù)據(jù)結(jié)構(gòu)中Hashtable和Vector的使用
- 技術(shù)分享 用OTA下載本機(jī)J2ME程序至手機(jī)
- 解析J2ME各大應(yīng)用平臺(tái)環(huán)境
- MotorolaJ2ME開發(fā)時(shí)需要注意的幾個(gè)細(xì)節(jié)
- Java2平臺(tái)J2SE、J2EE、J2ME三大版本的區(qū)別
本文題目:深入探究J2ME Hashtable實(shí)現(xiàn)原理
標(biāo)題路徑:http://m.5511xx.com/article/dphsceh.html


咨詢
建站咨詢
