Java深入学习23:HashMap和HashTable
package interview; /* * *@Description: *@Author:TYJ *@Date: create in 2020/4/23 7:54 */ import java.lang.reflect.Method; import java.util.HashMap; import java.util.Hashtable; public class HashMapAndHashTable { private static String mapKey = "mapKey"; private static String mapValue = "mapValue"; private static String tableKey = "tableKey"; private static String tableValue = "tableValue"; public static void test(){ HashMap<String,Object> map = new HashMap<>(); Hashtable<String,Object> table = new Hashtable<>(); //1-继承类不同 //HashMap继承自AbstractMap类。但二者都实现了Map接口。HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V> //Hashtable继承自Dictionary类,Dictionary类是一个已经被废弃的类。Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V> //2-线程安全问题 //HashMap线程不安全 //HashTable线程安全 //3-contains方法 //HashMap是没有contains方法的,而包括containsValue和containsKey方法; //hashtable则保留了contains方法,效果同containsValue,还包括containsValue和containsKey方法。 map.containsKey(mapKey); map.containsValue(mapValue); table.contains(tableValue);//和containsValue方法相同 table.containsKey(tableKey); table.containsValue(tableValue); //4-是否允许null; //Hashmap是允许key和value为null值的,用containsValue和containsKey方法判断是否包含对应键值对; //HashTable键值对都不能为空,否则包空指针异常。 map.put(null,null);//no error //table.put(null,null);//error //5-扩容方式不同 //HashMap 哈希扩容必须要求为原容量的2倍,而且一定是2的幂次倍扩容结果,而且当size的值超过75%的时候()每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入; //Hashtable扩容为原容量2倍加1; try { Class<? extends HashMap> mapClass = map.getClass(); Method capacity = mapClass.getDeclaredMethod("capacity"); capacity.setAccessible(true); System.out.println("capacity: " + capacity.invoke(map) + "; size: " + map.size()); for(int i = 0; i<12 ; i++){ map.put("key"+i,i); } System.out.println("capacity: " + capacity.invoke(map) + "; size: " + map.size()); } catch (Exception e) { e.printStackTrace(); } //6-计算hash值方式不同 //7-解决hash冲突方式不同(地址冲突) } public static void main(String[] args) { test(); } }
end