程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> 深入探究J2ME Hashtable實現原理

深入探究J2ME Hashtable實現原理

編輯:J2ME

Hashtable實例有兩個參數影響其效率:容量和裝載因子。裝載因子在CLDC實現中始終是75%(而在其它版本中這個值是可以指定的)。當Hashtable中包含的實體數超過裝載因子和當前容量的一個結合值(這可能通過相應的算法得出)時,就通過調用rehash方法來增加容量。

J2ME Hashtable的實現原理

首先看一下Hashtable的用法。

Hashtable有2個構造函數

  1. publicHashtable(intinitialCapacity);//指定容量大小  
  2. publicHashtable(){  
  3. this(11);//默認的容量是11,為什麼是11,而不是10呢?  

Demo1

  1. HashtablesTable=newHashtable();  
  2. sTable.put("wuhua","wuhua");  
  3. sTable.remove("wuhua");  
  4. sTable.clear(); 

上面是簡單的用法。

Hashtable源代碼解讀

在了解源代碼之前,我們先來了解下一些Java不常用的關鍵字。

transIEnt

當串行化某個對象時,如果該對象的某個變量是transient,那麼這個變量不會被串行化進去。也就是說,假設某個類的成員變量是transient,那麼當通過ObjectOutputStream把這個類的某個實例保存到磁盤上時,實際上transIEnt變量的值是不會保存的。因為當從磁盤中讀出這個對象的時候,對象的該變量會沒有被賦值。另外這篇文章還提到,當從磁盤中讀出某個類的實例時,實際上並不會執行這個類的構造函數,而是讀取這個類的實例的狀態,並且把這個狀態付給這個類的對象。

TransIEnt這個關鍵字很重要,來看下源代碼裡面有幾處是用到這個關鍵字的。

  1. privatetransIEntHashtableEntrytable[];  
  2. privatetransIEntintcount; 

源代碼中只有上面兩個字段的定義是用到的,但是這兩個字段是用於存儲style="COLOR:#000000"href="http://storage.it168.com/"target=_blank>存儲Hashtable的容器字段,因此可以說Hashtable是不允許序列化的。

這裡向大家描述一下J2ME Hashtable的實現原理,ME版本的Hashtable和SE版本的最大的區別是泛型的支持,前者本身不支持泛型。但是也有些細微的差別。

AD:


內部類

Hashtable有2個內部類

HashtableEntry--用於存放key-value,nextElement的類。

  1. classHashtableEntry{  
  2. inthash;  
  3. Objectkey;  
  4. Objectvalue;  
  5. HashtableEntrynext;  
  6. }  

HashtableEnumerator遍歷的枚舉類。

  1. classHashtableEnumeratorimplementsEnumeration{  
  2. booleankeys;  
  3. intindex;  
  4. HashtableEntrytable[];  
  5. HashtableEntryentry;  
  6.  
  7. HashtableEnumerator(HashtableEntrytable[],booleankeys){  
  8. this.table=table;  
  9. this.keys=keys;  
  10. this.index=table.length;  
  11. }  
  12.  
  13. publicbooleanhasMoreElements(){  
  14. if(entry!=null){  
  15. returntrue;  
  16. }  
  17. while(index-->0){  
  18. if((entry=table[index])!=null){  
  19. returntrue;  
  20. }  
  21. }  
  22. returnfalse;  
  23. }  
  24.  
  25. publicObjectnextElement(){  
  26. if(entry==null){  
  27. while((index-->0)&&((entry=table[index])==null));  
  28. }  
  29. if(entry!=null){  
  30. HashtableEntrye=entry;  
  31. eentry=e.next;  
  32. returnkeys?e.key:e.value;  
  33. }  
  34. thrownewNoSuchElementException(  
  35. /*#ifdefVERBOSE_EXCEPTIONS*/  
  36. ///skipped"HashtableEnumerator"  
  37. /*#endif*/  
  38. );  
  39. }  
  40. }  
  41.  

代碼寫的是相當的簡介。有一些比較技巧性的用法也是相當的不錯,比如:

  1. if(entry==null){  
  2. while((index-->0)&&((entry=table[index])==null));  
  3. }這段寫的是相當的好,可見作者的功力,循環變量table  
  4. while(index-->0)  
  5. //循環變量,查看是否有下一個元素,  
  6. if((entry=table[index])!=null){  
  7. returntrue;  
  8. }  

了解了Hashtable的數據存放格式,我們看看存放的關鍵邏輯在put,remove,get方法中存在。

  1. intindex=(hash&0x7FFFFFFF)%tab.length;  
  2.  

這樣的函數,這個函數的意義上,根據散列值來獲取對象的存儲位置。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved