丨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” 领取超多面试资料!!!