zoukankan      html  css  js  c++  java
  • java集合框架之 Map

    show Me the code!

    常用的Map 下 有treeMap,hashmap,hashtable,linkhashMap,下列代码就对以上四种做了比较 并简单说明其底层实现。

    public class MyMap {
        public static void testaddTreeMap(){
            TreeMap<String,Object> treeMap = new TreeMap<String, Object>();
            treeMap.put("赵云",23);
            treeMap.put("曹操",24);
            treeMap.put("马超",25);
            treeMap.put("司马懿",26);
            treeMap.put("2",0);
            treeMap.put("1",0);
            treeMap.put("3",null);
            for(Map.Entry<String, Object> entry : treeMap.entrySet()) {
                System.out.println(entry.getKey() + ": " +entry.getValue());
            }
    //1: 0 2: 0 3: null 司马懿: 26 曹操: 24 赵云: 23 马超: 25 --treeMap 
    //--特点:key值有序 非线程安全 父类:AbstractMap 允许value为null key 禁止为null");
        MyMap.testaddTreeMap();
    // 底层实现是平衡二叉树(红黑树)对key 进行排序 如果需要key 有序即可使用,这里多给treeMap 设置一个2与1的key 结果表明对key进行了排序
    
    
        }
        public static void testHashMap(){
            Map<String, Object> hashMap = new HashMap<String, Object>();
            hashMap.put("赵云",23);
            hashMap.put("曹操",24);
            hashMap.put("马超",25);
            hashMap.put("司马懿",26);
            hashMap.put(null,null);
            for(Map.Entry<String, Object> entry : hashMap.entrySet()) {
                System.out.println(entry.getKey() + ": " +entry.getValue());
            }
    //null: null 司马懿: 26 曹操: 24 马超: 25 赵云: 23
    //  --hashMap  --:特点:无序,非线程安全,父类:AbstractMap- 允许 null  key/value;
        }
    MyMap.testHashMap(); 
    /**底层实现:是散列表(数组配合单链表实现)HashMap会先用key的hash值来检查是否发生了hash碰撞,也就是对应的位置是否为空,
    这个没问题。问题是当发生了hash碰撞时,就会比较该位置上存储的每一个key是否与新存入的相等,如果相等就替换之,否则就在该位置的索引+1的位置增加一个值。*/
    
    public static void testLinkedHashMap(){
            LinkedHashMap<String,Object> linkedHashMap = new LinkedHashMap<String, Object>();
            linkedHashMap.put("赵云",23);
            linkedHashMap.put("曹操",24);
            linkedHashMap.put("马超",25);
            linkedHashMap.put("司马懿",26);
            linkedHashMap.put(null,null);
            linkedHashMap.put("2",1);
            linkedHashMap.put("1",1);
            for(Map.Entry<String, Object> entry : linkedHashMap.entrySet()) {
                System.out.println(entry.getKey() + ": " +entry.getValue());
            }
    //赵云: 23 曹操: 24 马超: 25 司马懿: 26  null: null 2: 1 1: 1
    //"-linkHashMap--特点:有序!(这里的有序不是指排序!而是根据插入的顺序返回) 非线程安全, 父类hashMap 允许 null key/value;
      //MyMap.testLinkedHashMap();//与hashMap的实现一致,唯一不同采用了双向循环链表,加入before指针,所以可以轻易的找到上一个节点实现有序
    
    
        }
        public static     void  testHashTable(){
            Hashtable<String,Object> hashtable = new Hashtable<String, Object>();
            hashtable.put("赵云",23);
            hashtable.put("曹操",24);
            hashtable.put("马超",25);
            hashtable.put("司马懿",26);
    //        hashtable.put(null,null);
            for(Map.Entry<String, Object> entry : hashtable.entrySet()) {
                System.out.println(entry.getKey() + ": " +entry.getValue());
            }
          //马超: 25 司马懿: 26 赵云: 23 曹操: 24
          //--HashTable --特点:无序,线程安全,父类dirtory,禁止 null key/value;
            //MyMap.testHashTable(); //底层实现与hashMap一致 只是在所有方法上加了synchronized    }
    
        public static void main(String[] args) {
    
     }
    }

    hashMap 底层数据结构展示图

    hashMap 是由数组与单链表组合而成,而linkhashmap 大致与上相同,但唯一不同他采用的双向循环链表所以,除了上图的next 还有个before 所以这样就可以找到前一个元素实现有序。

  • 相关阅读:
    支付相关备忘
    大文件跨服务器传送
    redis与memcache区别总结
    linux grep 查找字符串
    db2 连接报错connect。 ERRORCODE=-4499, SQLSTATE=08001(转载)
    linux查看匹配内容的前后几行(转)
    weblogic线程阻塞性能调优(图解)转
    ThreadPool has stuck threads
    Shell脚本中调用另外一个脚本的方法
    MUTT+MSMTP利用163服务器发送邮件
  • 原文地址:https://www.cnblogs.com/lanSeGeDiao/p/9146433.html
Copyright © 2011-2022 走看看