java.util
接口 Map<K,V>
类型参数:
K - 此映射所维护的键的类型
V - 映射值的类型
所有已知子接口:
Bindings, ConcurrentMap<K,V>, ConcurrentNavigableMap<K,V>, LogicalMessageContext, MessageContext, NavigableMap<K,V>, SOAPMessageContext, SortedMap<K,V>
所有已知实现类:
AbstractMap, Attributes, AuthProvider, ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, HashMap, Hashtable, IdentityHashMap, LinkedHashMap, PrinterStateReasons, Properties, Provider, RenderingHints, SimpleBindings, TabularDataSupport, TreeMap, UIDefaults, WeakHashMap
主要分析一下:HashMap, TreeMap, Hashtable, SortedMap, ConcurrentHashMap
|
HashMap |
HashTable |
|
|
|
数据结构 |
Entry<?,?>[] table Size |
Entry<K,V>[] table count |
|
|
|
初始值 |
初始容量默认 16,加载因子是 0.75 |
初始容量默认 11,加载因子是 0.75 |
|
|
|
是否有序 |
无序 |
无序 |
|
|
|
安全性 |
不安全 |
安全 |
|
|
|
扩容机制 |
当前容量的两倍扩容 |
当前容量的两倍+1扩容 |
|
|
|
性能分析 |
插入慢,查询、删除速度一样(计算获得index,遍历table) |
rehash时性能慢,插入慢,查询、删除速度一样(计算获得index,遍历table) |
|
|
|
容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。
加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度。
当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。
1,HashMap 基于哈希表的 Map 接口的实现。
Put():添加方法
- 1,初始化哈希表
- 2,计算hash值
- 3,rehash容量2倍扩容
- 4,计算索引
hash表的数据结构为:链表式数组。
Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;
Entry<K,V> |
说明 |
K key |
key |
V value |
value |
int hash |
key的hash值 |
Entry<K,V> next |
Next Entry |
索引冲突处理方式为将新值放在第一位,并将next指向旧值.
Get():查询方法
计算Key的Hash值遍历获取当前key的value
Remove():删除方法
使用建议:
- 创建线程安全的HashMap方式如下:
Map m = Collections.synchronizedMap(new HashMap(...));
- 指定map大小
在知道map大小情况下,建议在创建时指定map大小
- 遍历方式
使用for循环遍历,效率高于Iterator
2,HashTable
Put():添加方法
- Rehash容量2倍+1 扩容
3,TreeMap
基于红黑树(Red-Black tree)的 NavigableMap实现。该映射根据其键的自然顺序进行排序。
Put():添加方法
//修复红黑树
/** From CLR */
private void fixAfterInsertion(Entry<K,V> x) {
x.color = RED;
while (x != null && x != root && x.parent.color == RED) {
if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
Entry<K,V> y = rightOf(parentOf(parentOf(x)));
if (colorOf(y) == RED) {
setColor(parentOf(x), BLACK);
setColor(y, BLACK);
setColor(parentOf(parentOf(x)), RED);
x = parentOf(parentOf(x));
} else {
if (x == rightOf(parentOf(x))) {
x = parentOf(x);
rotateLeft(x);
}
setColor(parentOf(x), BLACK);
setColor(parentOf(parentOf(x)), RED);
rotateRight(parentOf(parentOf(x)));
}
} else {
Entry<K,V> y = leftOf(parentOf(parentOf(x)));
if (colorOf(y) == RED) {
setColor(parentOf(x), BLACK);
setColor(y, BLACK);
setColor(parentOf(parentOf(x)), RED);
x = parentOf(parentOf(x));
} else {
if (x == leftOf(parentOf(x))) {
x = parentOf(x);
rotateRight(x);
}
setColor(parentOf(x), BLACK);
setColor(parentOf(parentOf(x)), RED);
rotateLeft(parentOf(parentOf(x)));
}
}
}
root.color = BLACK;
}
相关推荐
Java集合专题总结:HashMap和HashTable源码学习和面试总结 本文总结了Java集合专题中的HashMap和HashTable,涵盖了它们的源码学习和面试总结。HashMap是一种基于哈希表的集合类,它的存储结构是一个数组,每个元素...
5. 源码分析: 查看`HashTable`和`HashMap`的源码,可以发现两者在内部实现上也有所不同。`HashTable`直接使用了数组+链表的方式,而`HashMap`在Java 8及以后版本引入了红黑树优化,当链表长度达到一定阈值(8)时...
然而,HashMap与HashTable的主要区别在于线程安全性:HashTable是线程安全的,而HashMap则不是。 JDK1.8之后,HashMap进行了性能优化,引入了红黑树的数据结构。当链表的长度超过一个阈值(默认为8)时,HashMap会...
### HashMap源码分析 #### 一、概述 `HashMap`是Java编程语言中非常重要的一个数据结构,它属于`java.util`包的一部分,是`Map`接口的一个具体实现类。`HashMap`允许存储键值对,并且支持使用`null`作为键或值,这...
【Java容器之Hashtable源码分析】 在Java编程中,`Hashtable`是一个古老的容器类,它继承自`Dictionary`接口,并实现了`Map`接口,同时也实现了`Cloneable`和`Serializable`接口。`Hashtable`与`HashMap`类似,都是...
#### 二、HashMap线程安全问题分析 在多线程环境中,`HashMap`的主要线程安全问题包括但不限于: 1. **链表死循环问题**:在JDK 1.7中,当多个线程同时进行`put`操作时,可能会出现链表死循环的情况,这是一个严重...
本文主要讲述了 Java 中的并发编程,包括 atomic 包的介绍、CAS 算法的原理、ABA 问题的解决方案,以及 collections 中的 HashMap、HashTable 和 ConcurrentHashMap 的源码分析。 Atomic 包的介绍 ----------------...
10. **面试常见问题**:面试中常问的问题包括HashMap的扩容机制、哈希冲突解决策略、线程安全性、迭代器的使用等,还可能涉及HashMap的源码分析。 通过深入学习和理解HashMap,不仅可以提高代码的编写效率,也能在...
HashMap是Java编程语言中最常用的集合类之一,尤其在面试中,HashMap的相关知识是考察...这套学习资料应该包含了HashMap的实例分析、源码解读、常见面试题以及实战演练等内容,确保你全面掌握这一核心Java数据结构。
Java集合框架是Java编程中非常重要的部分,它提供了一种高效、灵活的数据组织方式。本文主要探讨了几个关键...通过对源码的深入分析,我们可以更好地掌握Java集合框架的工作原理,并根据实际需求选择最适合的数据结构。
Java并发系列之ConcurrentHashMap源码分析 ConcurrentHashMap是Java中一个高性能的哈希表实现,它解决了HashTable的同步问题,允许多线程同时操作哈希表,从而提高性能。 1. ConcurrentHashMap的成员变量: ...
因此本文将重点分析HashMap。 HashMap实现了Map接口,允许放入null元素,除该类未实现同步外,其余跟Hashtable大致相同,跟TreeMap不同,该容器不保证元素顺序,根据需要该容器可能会对元素重新哈希,元素的顺序...
本文将深入探讨HashMap的基本特性、哈希表数据结构以及JDK 1.7版本中的HashMap源码分析。 首先,HashMap的基本特性如下: 1. **允许null值**:HashMap允许键和值为null,而Hashtable则不允许。 2. **非线程安全**...
hashmap源码 to-be-architect to be a Java architect,you should learn these.This page is updated irregularly. Java基础 深入分析 Java SPI 机制和原理 并发编程专题 Executors线程池 线程池ThreadPoolExecutor...
集合源码分析 JAVA: 基本语法 static 修饰变量 方法 静态块(初始化块 构造函数 ) 静态内部类() 静态导包 final() transient() foreach循环原理() volatile底层实现() equals和hashcode(, ) string,stringbuffer和...
这种设计使得它在处理高并发场景时,性能远超传统的线程安全容器如`Hashtable`。在实际开发中,`ConcurrentHashMap`常被用于构建高性能的并发数据结构,例如在Spring框架中,就广泛使用`ConcurrentHashMap`作为缓存...
集合源码分析 开发面试常见问题整理 算法题:这个一般不难,剑指offer或者LeetCode easy题目,喜欢考排序,链表,树(红黑树、二叉排序树、完全二叉树、B+树区别) Java基础:集合类、HashMap/HashTable/...
文档内容丰富,既包括了Java的基本语法、源码分析、多线程处理、IO流操作、设计模式、常用框架、数据库技术、数据结构与算法、JVM原理、Web开发技术,也包括了Linux操作系统、Redis数据库、UML绘图以及JDK的新特性等...