zoukankan      html  css  js  c++  java
  • Java深入学习23:HashMap和HashTable

    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

  • 相关阅读:
    android如何播放资源文件夹raw中的视频
    android studio添加三方jar包
    golang自动导入postgresql脚本
    xorm使用pgsql的例子
    python安装psycopg2
    制作u盘启动的工具
    codis须知
    redis3.0自带集群配置
    keepalive配置db层的ha的一些注意点
    phalcon安装笔记
  • 原文地址:https://www.cnblogs.com/wobuchifanqie/p/12758362.html
Copyright © 2011-2022 走看看