Hashtable,Hashmap,Propeties
2014-01-10 15:31
435 查看
我们先看2个类的定义
[java] view plaincopypublic class Hashtable extends Dictionary implements Map, Cloneable, java.io.Serializable [java] view plaincopypublic class HashMap extends AbstractMap implements Map, Cloneable, Serializable 可见Hashtable 继承自 Dictiionary 而 HashMap继承自AbstractMap Hashtable的put方法如下[java] view plaincopypublic synchronized V put(K key, V value) { //###### 注意这里1 // Make sure the value is not null if (value == null) { //###### 注意这里 2 throw new NullPointerException(); } // Makes sure the key is not already in the hashtable. Entry tab[] = table; int hash = key.hashCode(); //###### 注意这里 3 int index = (hash & 0x7FFFFFFF) % tab.length; for (Entry e = tab[index]; e != null; e = e.next) { if ((e.hash == hash) && e.key.equals(key)) { V old = e.value; e.value = value; return old; } } modCount++; if (count >= threshold) { // Rehash the table if the threshold is exceeded rehash(); tab = table; index = (hash & 0x7FFFFFFF) % tab.length; } // Creates the new entry. Entry e = tab[index]; tab[index] = new Entry(hash, key, value, e); count++; return null; } 注意1 方法是同步的 注意2 方法不允许value==null 注意3 方法调用了key的hashCode方法,如果key==null,会抛出空指针异常 HashMap的put方法如下 [java] view plaincopypublic V put(K key, V value) { //###### 注意这里 1 if (key == null) //###### 注意这里 2 return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); //###### 注意这里 return null; } 注意1 方法是非同步的注意2 方法允许key==null 注意3 方法并没有对value进行任何调用,所以允许为null补充: Hashtable 有一个 contains方法,容易引起误会,所以在HashMap里面已经去掉了 当然,2个类都用containsKey和containsValue方法。 HashMap Hashtable父类 AbstractMap Dictiionary是否同步 否 是k,v可否null 是 否 HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步(Collections.synchronizedMap)。 Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。 一些资料建议,当需要同步时,用Hashtable,反之用HashMap。但是,因为在需要时,HashMap可以被同步,HashMap的功能比Hashtable的功能更多,而且它不是基于一个陈旧的类的,所以有人认为,在各种情况下,HashMap都优先于Hashtable。 关于Properties 有时侯,你可能想用一个hashtable来映射key的字符串到value的字符串。DOS、Windows和Unix中的环境字符串就有一些例子,如key的字符串PATH被映射到value的字符串C:\WINDOWS;C:\WINDOWS\SYSTEM。Hashtables是表示这些的一个简单的方法,但Java提供了另外一种方法。 Java.util.Properties类是Hashtable的一个子类,设计用于String keys和values。Properties对象的用法同Hashtable的用法相象,但是类增加了两个节省时间的方法,你应该知道。 Store()方法把一个Properties对象的内容以一种可读的形式保存到一个文件中。Load()方法正好相反,用来读取文件,并设定Properties对象来包含keys和values。 注意,因为Properties扩展了Hashtable,你可以用超类的put()方法来添加不是String对象的keys和values。这是不可取的。另外,如果你将store()用于一个不包含String对象的Properties对象,store()将失败。作为put()和get()的替代,你应该用setProperty()和getProperty(),它们用String参数。
相关文章推荐
- 看nginx内存管理的一些感想
- 嵌入式 linux下sleep函数到底是线程休眠还是进程休眠
- Hadoop解决两个问题
- bash 常用语法
- 开源力量公开课第46期—Linux虚拟化的技术
- Linux中关于文件权限的一些小结
- 16个销售单个商品的电子商务网站设计示例
- CURLOPT_HEADERFUNCTION
- [转]Linux终端快捷键
- 每个Linux用户都应该了解的命令行省时技巧
- Apache CXF实战之一 Hello World Web Service
- 学习鸟哥的Linux私房菜笔记(16)——Ubuntu中建立ftp服务
- 学习鸟哥的Linux私房菜笔记(16)——Ubuntu中建立ftp服务
- 当while里有ssh,注意点
- ubuntu opengrok 安装使用
- Hadoop 安全机制认证---Kerberos
- Linux内核映像中的内核配置信息生成与获取详解
- linux 双线-自动选择指定出口-(策略Route和iptable)
- 利用管道实现Shell多进程
- 转载_如何从NFS启动Linux及原理