深入探究J2ME Hashtable实现原理

开发 前端
这里向大家描述一下J2ME Hashtable的实现原理,ME版本的Hashtable和SE版本的最大的区别是泛型的支持,前者本身不支持泛型。但是也有些细微的差别。

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是不允许序列化的。#p#

内部类

  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. J2ME数据结构中Hashtable和Vector的使用
  2. 技术分享 用OTA下载本机J2ME程序至手机
  3. 解析J2ME各大应用平台环境
  4. MotorolaJ2ME开发时需要注意的几个细节
  5. Java2平台J2SE、J2EE、J2ME三大版本的区别

 

 

责任编辑:佚名 来源: it168.com
相关推荐

2010-09-30 13:06:33

Myeclipse J

2010-09-30 09:16:04

cookieJ2ME

2010-09-30 11:04:53

J2MERMS

2010-09-29 08:57:04

J2ME前景

2010-09-29 09:54:09

J2ME应用程序

2010-09-30 08:49:17

cookieJ2ME

2010-09-29 15:56:02

J2ME对话框

2010-09-29 15:11:34

J2MEAndroid

2010-09-29 14:50:50

HashtableJ2ME

2010-09-30 11:11:07

J2ME

2010-10-09 15:07:09

J2MEWeb服务

2010-09-29 09:19:39

J2ME开发工具

2010-10-09 16:28:51

J2MEDisplay类

2009-07-07 11:10:01

JSP实现通信

2010-09-30 10:11:49

J2ME PolishEclipse

2009-03-22 09:38:03

Android移植J2ME

2009-06-23 11:30:16

RMSJ2ME

2010-09-30 13:28:55

J2ME图形

2010-09-30 09:56:26

J2ME Polish

2009-06-08 21:34:09

J2EEJ2SEJ2ME
点赞
收藏

51CTO技术栈公众号