@@ -376,9 +376,9 @@ Output:
376
376
377
377
### 1.5.1. HashMap 和 Hashtable 的区别
378
378
379
- 1 . ** 线程是否安全:** ` HashMap ` 是非线程安全的,` HashTable ` 是线程安全的,因为 ` HashTable ` 内部的方法基本都经过` synchronized ` 修饰。(如果你要保证线程安全的话就使用 ` ConcurrentHashMap ` 吧!);
380
- 2 . ** 效率:** 因为线程安全的问题,` HashMap ` 要比 ` HashTable ` 效率高一点。另外,` HashTable ` 基本被淘汰,不要在代码中使用它;
381
- 3 . ** 对 Null key 和 Null value 的支持:** ` HashMap ` 可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个;HashTable 不允许有 null 键和 null 值,否则会抛出 ` NullPointerException ` 。
379
+ 1 . ** 线程是否安全:** ` HashMap ` 是非线程安全的,` Hashtable ` 是线程安全的,因为 ` Hashtable ` 内部的方法基本都经过` synchronized ` 修饰。(如果你要保证线程安全的话就使用 ` ConcurrentHashMap ` 吧!);
380
+ 2 . ** 效率:** 因为线程安全的问题,` HashMap ` 要比 ` Hashtable ` 效率高一点。另外,` Hashtable ` 基本被淘汰,不要在代码中使用它;
381
+ 3 . ** 对 Null key 和 Null value 的支持:** ` HashMap ` 可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个;Hashtable 不允许有 null 键和 null 值,否则会抛出 ` NullPointerException ` 。
382
382
4 . ** 初始容量大小和每次扩充容量大小的不同 :** ① 创建时如果不指定容量初始值,` Hashtable ` 默认的初始大小为 11,之后每次扩充,容量变为原来的 2n+1。` HashMap ` 默认的初始化大小为 16。之后每次扩充,容量变为原来的 2 倍。② 创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 ` HashMap ` 会将其扩充为 2 的幂次方大小(` HashMap ` 中的` tableSizeFor() ` 方法保证,下面给出了源代码)。也就是说 ` HashMap ` 总是使用 2 的幂作为哈希表的大小,后面会介绍到为什么是 2 的幂次方。
383
383
5 . ** 底层数据结构:** JDK1.8 以后的 ` HashMap ` 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。
384
384
@@ -438,7 +438,7 @@ Output:
438
438
439
439
实现 ` NavigableMap ` 接口让 ` TreeMap ` 有了对集合内元素的搜索的能力。
440
440
441
- 实现` SortMap ` 接口让 ` TreeMap ` 有了对集合中的元素根据键排序的能力。默认是按 key 的升序排序,不过我们也可以指定排序的比较器。示例代码如下:
441
+ 实现` SortedMap ` 接口让 ` TreeMap ` 有了对集合中的元素根据键排序的能力。默认是按 key 的升序排序,不过我们也可以指定排序的比较器。示例代码如下:
442
442
443
443
``` java
444
444
/**
@@ -617,9 +617,9 @@ static int hash(int h) {
617
617
618
618
** 两者的对比图:**
619
619
620
- ** HashTable :**
620
+ ** Hashtable :**
621
621
622
- ![ HashTable全表锁 ] ( https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/HashTable全表锁.png )
622
+ ![ Hashtable全表锁 ] ( https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/HashTable全表锁.png )
623
623
624
624
<p style =" text-align :right ;font-size :13px ;color :gray " >https://www.cnblogs.com/chengxiao/p/6842045.html></p >
625
625
@@ -633,7 +633,7 @@ static int hash(int h) {
633
633
634
634
![ Java8 ConcurrentHashMap 存储结构(图片来自 javadoop)] ( ./images/java8_concurrenthashmap.png )
635
635
636
- JDK1.8 的 ` ConcurrentHashMap ` 不在是 ** Segment 数组 + HashEntry 数组 + 链表** ,而是 ** Node 数组 + 链表 / 红黑树** 。不过,Node 只能用于链表的情况,红黑树的情况需要使用 ** ` TreeNode ` ** 。当冲突链表达到一定长度时,链表会转换成红黑树。
636
+ JDK1.8 的 ` ConcurrentHashMap ` 不再是 ** Segment 数组 + HashEntry 数组 + 链表** ,而是 ** Node 数组 + 链表 / 红黑树** 。不过,Node 只能用于链表的情况,红黑树的情况需要使用 ** ` TreeNode ` ** 。当冲突链表达到一定长度时,链表会转换成红黑树。
637
637
638
638
### 1.5.10. ConcurrentHashMap 线程安全的具体实现方式/底层具体实现
639
639
0 commit comments