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

posted on 2020-04-23 17:36  我不吃番茄  阅读(193)  评论(0编辑  收藏  举报