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使用示例及区别