hashmap和hashtable和current
时间: 2023-04-21 09:05:50 浏览: 95
HashMap和Hashtable都是Java中的集合类,用于存储键值对。它们的主要区别在于线程安全性和性能方面。HashMap是非线程安全的,而Hashtable是线程安全的,但在多线程环境下性能较差。另外,HashMap允许键和值为null,而Hashtable不允许。
Current是一个Java并发包中的类,用于管理线程的执行。它提供了一些方法,如线程池、定时器等,可以帮助开发者更好地管理线程。Current可以提高程序的性能和可维护性,但需要开发者有一定的并发编程经验。
相关问题
hashmap hashtable hashset current hashmap 初始空间及怎么扩容
HashMap 和 HashSet 内部都是采用哈希表实现的,而 Hashtable 则是其线程安全的版本。它们的初始空间大小都是 16,默认负载因子为 0.75,即当哈希表中元素的数量超过容量的 75% 时,会自动进行扩容。
HashMap 和 HashSet 的扩容机制是:当元素数量达到容量的 75% 时,会创建一个新的容量是原来 2 倍的哈希表,将原来哈希表中的元素重新分配到新的哈希表中。这个过程需要遍历原来哈希表中的每一个元素,并重新计算其在新哈希表中的位置,这个过程会比较耗时。
Hashtable 的扩容机制与 HashMap 和 HashSet 不同,它是在元素数量达到容量的 2 倍时进行扩容。在进行扩容时,会创建一个新的容量是原来 2 倍加 1的哈希表,将原来哈希表中的元素重新分配到新的哈希表中。这个过程同样需要遍历原来哈希表中的每一个元素,并重新计算其在新哈希表中的位置。
current hashmap组成
Java 中的 ConcurrentHashMap 是线程安全的哈希表实现,它是在 JDK 1.5 中引入的,并且相比于 Hashtable 和 SynchronizedMap,它具有更高的并发性能。
ConcurrentHashMap 主要由以下组成部分:
1. 数组:ConcurrentHashMap 内部使用一个数组来存储键值对。
2. 链表和红黑树:当 hash 冲突发生时,ConcurrentHashMap 内部会使用链表来存储具有相同 hash 值的键值对。在 JDK 1.8 中,当链表长度超过阈值时,ConcurrentHashMap 会将链表转换为红黑树,以提高查找效率。
3. Segment:ConcurrentHashMap 内部将数组分为多个段(Segment),每个段都是一个独立的哈希表,每个段都有自己的锁。这样,不同的线程可以同时访问不同的段,从而提高并发性能。
4. CAS:ConcurrentHashMap 内部使用 CAS(Compare and Swap)操作来保证线程安全性。CAS 是一种乐观锁机制,它允许多个线程同时读取数据,但只允许一个线程写入数据。如果多个线程同时尝试写入数据,只有一个线程能够成功,而其他线程需要重新尝试。
综上所述,ConcurrentHashMap 主要由数组、链表和红黑树、Segment 和 CAS 等组成。这些组成部分共同保证了 ConcurrentHashMap 的线程安全性和并发性能。
阅读全文