1、Hashtable和Hashtable区别
1)使用null值区别
Hashtable
中,key
和value
都不允许出现null
值。但是如果在Hashtable
中有类似put(null,null)
的操作,编译同样可以通过,因为key
和value
都是Object
类型,但运行时会抛出NullPointerException
异常,这是JDK的规范规定的。
HashMap
中,null
可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null
。当get()
方法返回null
值时,可能是 HashMap
中没有该键,也可能使该键所对应的值为null
。因此,在HashMap
中不能由get()
方法来判断HashMap
中是否存在某个键, 而应该用containsKey()
方法来判断。
2)代码实现区别
Hashtable
继承自Dictionary
类,而HashMap
是Java1.2引进的Map interface
的一个实现。
3)线程安全
HashMap
是非synchronized
,而Hashtable
是synchronized
,说明Hashtable
是线程安全的,多个线程可以共享一个Hashtable
;而如果没有正确的同步的话,多个线程是不能共享HashMap
的。Java 5提供了ConcurrentHashMap
,它是HashTable
的替代,比HashTable
的扩展性更好。(在多个线程访问Hashtable
时,不需要自己为它的方法实现同步,而HashMap
就必须为之提供外同步(Collections.synchronizedMap
)
4)访问速度
由于HashMap
非线程安全,在只有一个线程访问的情况下,效率要高于HashTable
。
2、使用示例代码
1)HashMap使用
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
public class HashMapUse {
public static void main(String[] args) {
HashMap<String, String> hashMap = new HashMap<String, String>();
hashMap.put("c", "c编程");
hashMap.put("java", "java编程");
hashMap.put("python", "python编程");
System.out.println(hashMap);
System.out.println("cn" + hashMap.get("c"));
System.out.println(hashMap.containsKey("c"));
System.out.println(hashMap.keySet());
System.out.println(hashMap.isEmpty());
//hashMap.remove("c");
//System.out.println(hashMap.containsKey("c"));
//使用Iterator遍历HashMap
Iterator it = hashMap.keySet().iterator();
while (it.hasNext()) {
String key = (String) it.next();
System.out.println("key:" + key);
System.out.println("value:" + hashMap.get(key));
}
//使用Entry遍历HashMap
Set<Entry<String, String>> sets = hashMap.entrySet();
for (Entry<String, String> entry : sets) {
System.out.println(entry.getKey() + ", ");
System.out.println(entry.getValue());
}
}
}
2) Hashtable使用
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapTable {
public static void main(String[] args) {
Hashtable table = new Hashtable();
table.put("table_key_1", "table_value_1");
table.put("table_key_2", "table_value_2");
//HashMap 和Hashtable 中元素在遍历的时候是后进先出,栈的结构
for( Enumeration e = table.keys(); e.hasMoreElements(); ){
String key = (String)e.nextElement();
System.out.println( key + "=====" + table.get(key));
}
Hashtable<String,String> hashtable=new Hashtable<String,String>();
hashtable.put("1", "aa");
hashtable.put("2", "bb");
hashtable.put("3", "cc");
System.out.println(hashtable.get("3"));
System.out.println(hashtable.get("2"));
//第一种hashtable遍历方式
System.out.println("第一种遍历方式");
for(Iterator<String> iterator=hashtable.keySet().iterator();iterator.hasNext();){
String key=iterator.next();
System.out.println("key-----"+key);
System.out.println("value--------"+hashtable.get(key));
}
//第二种hashtable遍历方式
System.out.println("第二种遍历方式");
for(Iterator<Entry<String, String>> iterator=hashtable.entrySet().iterator();iterator.hasNext();){
Entry<String,String> entry=iterator.next();
System.out.println("key---------"+entry.getKey());
System.out.println("value------------"+entry.getValue());
}
//第三种hashtable遍历方式
System.out.println("第三种遍历方式");
for(Map.Entry<String, String> entry: hashtable.entrySet()){
System.out.println("key---------"+entry.getKey());
System.out.println("value--------"+entry.getValue());
}
//第四种遍历方式
System.out.println("第四种遍历方式");
Enumeration<String> e=hashtable.keys();
while(e.hasMoreElements()){
String key=e.nextElement();
System.out.println("key-----"+key);
System.out.println("value-------"+hashtable.get(key));
}
//第五中遍历方式(获取所有的值)
System.out.println("第五种遍历方式");
Enumeration<String> e2=hashtable.elements();
while (e2.hasMoreElements()) {
String string = (String) e2.nextElement();
System.out.println(string);
}
}
相关文档:
Java 静态(static) Map字典初始化方法及示例代码
Java 使用for和while循环遍历hashmap的方法及示例代码
Java使用hashmap中的数据初始化hashmap并执行put数据的简洁代码
Java hashmap computeIfAbsent()使用方法及示例代码
Java中 static final修饰hashmap静态成员变量初始化方法
Java SynchornizedMap(Map)和ConcurrentHashMap使用示例及区别