Map的基本用法

HashMap

  • 键不可重复、允许key值为null,value也可以为null
 1  // HashMap 基本用法
 2  Map<String, String> hashMap = new HashMap<String, String>();
 3  
 4  // 给创建的hashMap 添加一个键值对
 5  hashMap.put("key1", "AAA");
 6  
 7  // 添加一个键值对,但是键已经在hashMap 中存在了,所以会把键为key1 的值覆盖掉
 8  hashMap.put("key1", "BBB");
 9  
10  hashMap.put("key2", "CCC");
11  hashMap.put("key3", "CCC");
12  
13  // 键值对都允许为null
14  hashMap.put(null, "DDD");
15  hashMap.put("key4", null);
16  
17  System.out.println(hashMap.toString());
18  
19  // 打印内容
20  {key4=null, null=DDD, key3=CCC, key2=CCC, key1=BBB}
  • 底层hash 表
 1 // 继承关系
 2  public class HashMap<K,V> extends AbstractMap<K,V>
 3      implements Map<K,V>, Cloneable, Serializable {
 4      
 5      /* 基本属性 */
 6      static fi  nal int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 默认初始化大小16,扩容为当前容量翻倍
 7      static final float DEFAULT_LOAD_FACTOR = 0.75f;// 负载因子0.75
 8      transient int size;// 元素数量
 9      int threshold;// 判断是否需要调整hashmap 容量
10      
11  }

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

  • 线程不安全

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

 

丨HashTable

  • 键不可重复、不允许key值为null,value也不可以为null
 1 // HashTable 基本用法
 2  Map hashTable = new Hashtable();
 3  
 4  hashTable.put("key1", "AAA");
 5  hashTable              .put("key1", "BBB");
 6  hashTable.put("key2", "CCC");
 7  hashTable.put("key3", "CCC");
 8  
 9  // 键值对都不允许为null,会报错
10  // hashTable.put(null, "value4");
11  // hashTable.put("key5", null);
12  
13  System.out.println(hashTable.toString());
14  
15  
16  // 打印内容
17  {key3=value3, key2=value2, key1=value1}
  • 底层hash 表
 1 // 继承关系
 2  public class Hashtable<K,V>
 3      extends Dictionary<K,V>
 4      implements Map<K,V>, Cloneable, java.io.Serializable {
 5      
 6      private transient int count; // 元素数量,扩容为当前容量翻倍再加一
 7      private int threshold; // 判断是否需要调整hashtable 容量
 8          
 9      // 默认初始化大小11,负载因子0.75
10      public Hashtable() {
11          this(11, 0.75f);
12     }
13      
14  }
  • 线程安全

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

1 public synchronized V get(Object key) {
2         // 省略代码
3     }  

丨TreeMap

  • 键不可重复,值可重复
 1 // TreeMap 基本用法
 2   Map<String, String> treeMap = new TreeMap<String, String>();
 3  
 4  treeMap.put("key1", "AAA");
 5  
 6  // 会覆盖掉key1 之前的AAA 值为BBB
 7  treeMap.put("key1", "BBB");
 8  
 9  // 允许值重复
10  treeMap.put("key2", "CCC");
11  treeMap.put("key3", "CCC");
12  
13  // 允许值为null
14  treeMap.put("key4", null);
15  
16  // 不允许键为null,会报错
17  //treeMap.put(null, "DDD");
18  
19  System.out.println(treeMap.toString());
20  
21  
22  // 打印内容
23  {key1=BBB, key2=CCC, key3=CCC, key4=null}
  • 底层二叉树
1 // 继承关系
2  public class TreeMap<K,V>
3      extends AbstractMap<K,V>
4      implements NavigableMap<K,V>, Cloneable, java.io.Serializable{
5  }      

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

下方是我的公众号,回复 “666” 领取超多面试资料!!!

原文地址:https://www.cnblogs.com/xxss/p/13234095.html