Hashtable和HashMap的区别:
1.Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类;
2.Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决:
Map Collections.synchronizedMap(Map m)
这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。
3.在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。
Hashtable类函数介绍:
此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null
对象都可以用作键或值。
为了成功地在哈希表中存储和检索对象,用作键的对象必须实现 hashCode
方法和 equals
方法。
Hashtable
的实例有两个参数影响其性能:初始容量 和加载因子。容量 是哈希表中桶 的数量,初始容量 就是哈希表创建时的容量。注意,哈希表的状态为 open:在发生“哈希冲突”的情况下,单个桶会存储多个条目,这些条目必须按顺序搜索。加载因子 是对哈希表在其容量自动增加之前可以达到多满的一个尺度。初始容量和加载因子这两个参数只是对该实现的提示。关于何时以及是否调用 rehash 方法的具体细节则依赖于该实现。
构造方法摘要 | |
---|---|
Hashtable() 用默认的初始容量 (11) 和加载因子(0.75)构造一个新的空哈希表。 | |
Hashtable(int initialCapacity) 用指定初始容量和默认的加载因子(0.75)构造一个新的空哈希表。 | |
Hashtable(int initialCapacity, float loadFactor) 用指定初始容量和指定加载因子构造一个新的空哈希表。 | |
Hashtable(Map<? extends K,? extends V> t) 构造一个与给定的 Map 具有相同映射关系的新哈希表。 |
方法摘要 | |
---|---|
void | clear() 将此哈希表清空,使其不包含任何键。 |
Object | clone() 创建此哈希表的浅表复制。 |
boolean | contains(Object value) 测试此映射表中是否存在与指定值关联的键。 |
boolean | containsKey(Object key) 测试指定对象是否为此哈希表中的键。 |
boolean | containsValue(Object value) 如果此 Hashtable 将一个或多个键映射到此值,则返回 true。 |
Enumeration<V> | elements() 返回此哈希表中的值的枚举。 |
Set<Map.Entry<K,V>> | entrySet() 返回此 Hashtable 中所包含的键的 Set 视图。 |
boolean | equals(Object o) 按照 Map 接口的定义,比较指定 Object 与此 Map 是否相等。 |
V | get(Object key) 返回此哈希表中指定键所映射到的值。 |
int | hashCode() 按照 Map 接口的定义,返回此 Map 的哈希码值。 |
boolean | isEmpty() 测试此哈希表是否没有键映射到值。 |
Enumeration<K> | keys() 返回此哈希表中的键的枚举。 |
Set<K> | keySet() 返回此 Hashtable 中所包含的键的 Set 视图。 |
V | put(K key, V value) 将指定 key 映射到此哈希表中的指定 value 。 |
void | putAll(Map<? extends K,? extends V> t) 将指定 Map 的所有映射关系复制到此 Hashtable 中,这些映射关系将替换此 Hashtable 拥有的、针对当前指定 Map 中所有键的所有映射关系。 |
protected void | rehash() 增加此哈希表的容量并在内部对其进行重组,以便更有效地容纳和访问其元素。 |
V | remove(Object key) 从哈希表中移除该键及其相应的值。 |
int | size() 返回此哈希表中的键的数量。 |
String | toString() 返回此 Hashtable 对象的字符串表示形式,其形式为 ASCII 字符 ", " (逗号加空格)分隔开的、括在括号中的一组条目。 |
Collection<V> | values() 返回此 Hashtable 中所包含值的 Collection 视图。 |
HashtableJava实例
import java.util.*;
/**
* <p>Title: 哈希表操作</p>
* <p>Description: 这是一个权限认证的例子,使用了哈希表作为数据的存储</p>
*/
public class RoleRight
{
private static Hashtable rightList = new Hashtable();
/**
*<br>方法说明:初始化数据
*<br>输入参数:
*<br>返回类型:
*/
public void init()
{
String[] accRoleList = {"admin","satrap","manager","user","guest"};
String[] rightCodeList = {"10001","10011","10021","20011","24011"};
for(int i=0;i<accRoleList.length;i++)
{
rightList.put(accRoleList[i],rightCodeList[i]);
}
}
/**
*<br>方法说明:获取角色权限代码
*<br>输入参数:String accRole 角色名称
*<br>返回类型:String 权限代码
*/
public String getRight(String accRole)
{
if(rightList.containsKey(accRole))
return (String)rightList.get(accRole);
else
return null;
}
/**
*<br>方法说明:添加角色和代码信息
*<br>输入参数:String accRole 角色名称
*<br>输入参数:String rightCode 角色权限代码
*<br>返回类型:void (无)
*/
public void insert(String accRole,String rightCode)
{
rightList.put(accRole,rightCode);
}
/**
*<br>方法说明:删除角色权限
*<br>输入参数:String accRole 角色名称
*<br>返回类型:void(无)
*/
public void delete(String accRole)
{
if(rightList.containsKey(accRole))
rightList.remove(accRole);
}
/**
*<br>方法说明:修改角色权限代码
*<br>输入参数:String accRole 角色名称
*<br>输入参数:String rightCode 角色权限代码
*<br>返回类型:void(无)
*/
public void update(String accRole,String rightCode)
{
//this.delete(accRole);
this.insert(accRole,rightCode);
}
/**
*<br>方法说明:打印哈希表中角色和代码对应表
*<br>输入参数:无
*<br>返回类型:无
*/
public void print()
{
Enumeration RLKey = rightList.keys();
while(RLKey.hasMoreElements())
{
String accRole = RLKey.nextElement().toString();
print(accRole+"="+this.getRight(accRole));
}
}
/**
*<br>方法说明:打印信息(过载)
*<br>输入参数:Object oPara 打印的信息内容
*<br>返回类型:无
*/
public void print(Object oPara)
{
System.out.println(oPara);
}
/**
*<br>方法说明:主方法,
*<br>输入参数:
*<br>返回类型:
*/
public static void main(String[] args)
{
RoleRight RR = new RoleRight();
RR.init();
RR.print();
RR.print("___________________________");
RR.insert("presider","10110");
RR.print();
RR.print("___________________________");
RR.update("presider","10100");
RR.print();
RR.print("___________________________");
RR.delete("presider");
RR.print();
}
}//end:)~
例子中Enumeration介绍
public interface Enumeration<E>
实现 Enumeration 接口的对象,它生成一系列元素,一次生成一个。连续调用 nextElement
方法将返回一系列的连续元素。
例如,要输出向量 v 的所有元素,可使用以下方法:
for (Enumeration e = v.elements() ; e.hasMoreElements() ;) { System.out.println(e.nextElement());
}
这些方法主要通过向量的元素、哈希表的键以及哈希表中的值进行枚举。枚举也用于将输入流指定到 SequenceInputStream
中。
注:此接口的功能与 Iterator 接口的功能是重复的。此外,Iterator 接口添加了一个可选的移除操作,并使用较短的方法名。新的实现应该优先考虑使用 Iterator 接口而不是 Enumeration 接口。
摘自:
赛迪网
Java api文档
Java编程100例