哈希表
- 哈希表又被称为散列表,是根据关键码key直接访问内存存储位置的数据结构,即通过关于
- key的函数,映射到一个地址来访问数据,这样加快查找速度
- 数组 查找容易,删除和插入不易
- 链表 查找不易,删除和插入容易
- 哈希表则是对二者的综合,使得作为一个查找容易、插入和删除也容易的数据结构
HashMap源码分析
1)类的继承关系
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
HashMap允许空值和空键
HashMap是非线程安全
HashMap元素是无序 LinkedHashMap TreeMap
(HashTable不允许为空 线程安全)
2)类的属性
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; 16 默认初始容量 用来给table初始化
static final int MAXIMUM_CAPACITY = 1 << 30;
static final float DEFAULT_LOAD_FACTOR = 0.75f; //扩容机制
static final int TREEIFY_THRESHOLD = 8; //链表转为红黑树的节点个数
static final int UNTREEIFY_THRESHOLD = 6;//红黑树转为链表的节点个数
static final int MIN_TREEIFY_CAPACITY = 64;
static class Node<K,V> implements Map.Entry<K,V>
transient Node<K,V>[] table; //哈希表中的桶
transient Set<Map.Entry<K,V>> entrySet; //迭代器遍历的时候
transient int size;
int threshold;
final float loadFactor;
3)类中重要的方法 (构造函数 put remove resize)
构造函数中并未给桶进行初始化
HashMap迭代器实现
1)由于哈希表数据分布是不连续的,所以在迭代器初始化的过程中需要找到第一个非空的位置点,
避免无效的迭代
2)当迭代器的游标到达某一个桶链表的末尾,迭代器的游标需要跳转到下一个非空的位置点
HashMap面试题整理:
- 1)JDK1.7与JDK1.8HashMap有什么区别和联系
- 2)用过HashMap没?说说HashMap的结构(底层数据结构 + put方法描述)
- 3)说说HashMap的扩容过程
- 4)HashMap中可以使用自定义类型作为其key和value吗?
- 5)HashMap中table.length为什么需要是2的幂次方
- 6)HashMap与HashTable的区别和联系
- 7)HashMap、LinkedHashMap、TreeMap之间的区别和联系?
- 8)HashMap与WeakHashMap的区别和联系
- 9)WeakHashMap中涉及到的强弱软虚四种引用
- 10)HashMap是线程安全的吗?引入HashTable和ConcurrentHashMap