Hashtable实例有两个参数影响其效率:容量和装载因子。装载因子在CLDC实现中始终是75%(而在其它版本中这个值是可以指定的)。当Hashtable中包含的实体数超过装载因子和当前容量的一个结合值(这可能通过相应的算法得出)时,就通过调用rehash方法来增加容量。
J2ME Hashtable的实现原理
首先看一下Hashtable的用法。
Hashtable有2个构造函数
- publicHashtable(intinitialCapacity);//指定容量大小
- publicHashtable(){
- this(11);//默认的容量是11,为什么是11,而不是10呢?
- }
Demo1
- HashtablesTable=newHashtable();
- sTable.put("wuhua","wuhua");
- sTable.remove("wuhua");
- sTable.clear();
上面是简单的用法。
Hashtable源代码解读
在了解源代码之前,我们先来了解下一些java不常用的关键字。
transient
当串行化某个对象时,如果该对象的某个变量是transient,那么这个变量不会被串行化进去。也就是说,假设某个类的成员变量是transient,那么当通过ObjectOutputStream把这个类的某个实例保存到磁盘上时,实际上transient变量的值是不会保存的。因为当从磁盘中读出这个对象的时候,对象的该变量会没有被赋值。另外这篇文章还提到,当从磁盘中读出某个类的实例时,实际上并不会执行这个类的构造函数,而是读取这个类的实例的状态,并且把这个状态付给这个类的对象。
Transient这个关键字很重要,来看下源代码里面有几处是用到这个关键字的。
- privatetransientHashtableEntrytable[];
- privatetransientintcount;
源代码中只有上面两个字段的定义是用到的,但是这两个字段是用于存储style="COLOR:#000000"href="http://storage.it168.com/"target=_blank>存储Hashtable的容器字段,因此可以说Hashtable是不允许序列化的。#p#
内部类
Hashtable有2个内部类
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*/
- );
- }
- }
代码写的是相当的简介。有一些比较技巧性的用法也是相当的不错,比如:
- if(entry==null){
- while((index-->0)&&((entry=table[index])==null));
- }这段写的是相当的好,可见作者的功力,循环变量table
- while(index-->0)
- //循环变量,查看是否有下一个元素,
- if((entry=table[index])!=null){
- returntrue;
- }
- }
了解了Hashtable的数据存放格式,我们看看存放的关键逻辑在put,remove,get方法中存在。
- intindex=(hash&0x7FFFFFFF)%tab.length;
这样的函数,这个函数的意义上,根据散列值来获取对象的存储位置。
【编辑推荐】
- J2ME数据结构中Hashtable和Vector的使用
- 技术分享 用OTA下载本机J2ME程序至手机
- 解析J2ME各大应用平台环境
- MotorolaJ2ME开发时需要注意的几个细节
- Java2平台J2SE、J2EE、J2ME三大版本的区别