Map的基本用法

map三部曲之第一步

在这里插入图片描述

HashMap
  1. 键不可重复、允许key值为null,value也可以为null

    // HashMap 基本用法
    Map<String, String> hashMap = new HashMap<String, String>();
    
    // 给创建的hashMap 添加一个键值对
    hashMap.put("key1", "AAA");
    
    // 添加一个键值对,但是键已经在hashMap 中存在了,所以会把键为key1 的值覆盖掉
    hashMap.put("key1", "BBB");
    
    hashMap.put("key2", "CCC");
    hashMap.put("key3", "CCC");
    
    // 键值对都允许为null
    hashMap.put(null, "DDD");
    hashMap.put("key4", null);
    
    System.out.println(hashMap.toString());
    
    // 打印内容
    {key4=null, null=DDD, key3=CCC, key2=CCC, key1=BBB}
    
  2. 底层hash 表

    // 继承关系
    public class HashMap<K,V> extends AbstractMap<K,V>
        implements Map<K,V>, Cloneable, Serializable {
        
        /* 基本属性 */
        static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 默认初始化大小16,扩容为当前容量翻倍
        static final float DEFAULT_LOAD_FACTOR = 0.75f;	// 负载因子0.75
        transient int size;	// 元素数量
        int threshold;	// 判断是否需要调整hashmap 容量
        
    }
    

    备注: HashMap的扩容操作是一项很耗时的任务,所以如果能估算Map的容量,最好给它一个默认初始值,避免进行多次扩容。

  3. 线程不安全

    HashMap的线程是不安全的,多线程环境中推荐是ConcurrentHashMap。

HashTable
  1. 键不可重复、不允许key值为null,value也不可以为null

    // HashTable 基本用法
    Map hashTable = new Hashtable();
    
    hashTable.put("key1", "AAA");
    hashTable.put("key1", "BBB");
    hashTable.put("key2", "CCC");
    hashTable.put("key3", "CCC");
    
    // 键值对都不允许为null,会报错
    // hashTable.put(null, "value4");
    // hashTable.put("key5", null);
    
    System.out.println(hashTable.toString());
    
    
    // 打印内容
    {key3=value3, key2=value2, key1=value1}
    
  2. 底层hash 表

    // 继承关系
    public class Hashtable<K,V>
        extends Dictionary<K,V>
        implements Map<K,V>, Cloneable, java.io.Serializable {
        
        private transient int count; // 元素数量,扩容为当前容量翻倍再加一
        private int threshold; // 判断是否需要调整hashtable 容量
        
        // 默认初始化大小11,负载因子0.75
        public Hashtable() {
            this(11, 0.75f);
        }
        
    }
    
  3. 线程安全

    HashTable 实现方法上添加了synchronized 关键字来确保线程同步,所以相对于HashTable,HashMap的性能会高一些。

    例如:get 方法

    public synchronized V get(Object key) {
           // 省略代码
        }
    
TreeMap
  1. 键不可重复,值可重复

    // TreeMap 基本用法
     Map<String, String> treeMap = new TreeMap<String, String>();
    
    treeMap.put("key1", "AAA");
    
    // 会覆盖掉key1 之前的AAA 值为BBB
    treeMap.put("key1", "BBB");
    
    // 允许值重复
    treeMap.put("key2", "CCC");
    treeMap.put("key3", "CCC");
    
    // 允许值为null
    treeMap.put("key4", null);
    
    // 不允许键为null,会报错
    //treeMap.put(null, "DDD");
    
    System.out.println(treeMap.toString());
    
    
    // 打印内容
    {key1=BBB, key2=CCC, key3=CCC, key4=null}
    
  2. 底层二叉树

    // 继承关系
    public class TreeMap<K,V>
        extends AbstractMap<K,V>
        implements NavigableMap<K,V>, Cloneable, java.io.Serializable{
    }
    

    本篇针对map 的基础用法进行了讲解,后续我会对map 进行深入讲解,

下方是我的公众号,回复 “666” 领取超多面试资料!!!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值