map三部曲之第一步
HashMap
-
键不可重复、允许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}
-
底层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的容量,最好给它一个默认初始值,避免进行多次扩容。
-
线程不安全
HashMap的线程是不安全的,多线程环境中推荐是ConcurrentHashMap。
HashTable
-
键不可重复、不允许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}
-
底层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); } }
-
线程安全
HashTable 实现方法上添加了synchronized 关键字来确保线程同步,所以相对于HashTable,HashMap的性能会高一些。
例如:get 方法
public synchronized V get(Object key) { // 省略代码 }
TreeMap
-
键不可重复,值可重复
// 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}
-
底层二叉树
// 继承关系 public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.Serializable{ }
本篇针对map 的基础用法进行了讲解,后续我会对map 进行深入讲解,
下方是我的公众号,回复 “666” 领取超多面试资料!!!