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

  • 相关阅读:
    Mybatis主配置文件常见使用讲解
    Mybatis导入原生配置文件
    分页查询时,使用cookie保存上次的查询条件。jQuery实现方法以及中间遇到的坑
    jQuery实现checkbox即点即改,批量计数,以及中间遇到的坑
    ()IT 职场经验)一位10年Java工作经验的架构师的经验分享,感觉很受用。
    SpringMVC的Controller
    Spring MVC执行原理和基于Java的配置过程
    集成学习综述笔记
    generalization error
    Failed to install 'unknown package' from GitHub: schannel: failed to receive handshake, SSL/TLS connection failed
  • 原文地址:https://www.cnblogs.com/wobuchifanqie/p/12758362.html
Copyright © 2011-2022 走看看