currenthashmap和hashtable
时间: 2023-06-01 07:01:45 浏览: 115
hashtable的使用
### 回答1:
currenthashmap和hashtable都是Java中的Map接口的实现类,用于存储键值对。它们的主要区别在于线程安全性和迭代器的实现方式。
Hashtable是线程安全的,所有的方法都是同步的,因此在多线程环境下使用是安全的。但是,这也会导致性能下降,因为每个线程都需要等待其他线程完成它们的操作。
ConcurrentHashMap是线程安全的,但是它使用了一种不同的方式来实现线程安全。它将Map分成了多个段(Segment),每个段都有自己的锁。这样,在多线程环境下,每个线程只需要等待它所需要的那个段的锁,而不需要等待其他线程的锁,从而提高了性能。
另外,ConcurrentHashMap的迭代器是弱一致性的,也就是说,它不保证在迭代过程中能够看到所有的修改。而Hashtable的迭代器是强一致性的,它保证在迭代过程中能够看到所有的修改。
### 回答2:
CurrentHashMap和Hashtable都是Java中的映射数据结构,用于将一组键值对映射到内存中的桶中。虽然它们都具有类似的结构和功能,但它们之间也存在一些差异。
线程安全:
Hashtable是线程安全的,它在所有的公共方法上使用了同步关键字,因此在多线程环境下使用起来比较安全。而CurrentHashMap使用了一种更加高效的并发控制方式,它将表格分成不同的段(segment)进行加锁,使得同一时间内只有部分作为写操作的段才会被锁定,提高了并发度。
迭代器:
对于Hashtable,迭代器是通过Enumeration接口来实现的,Enumeration接口并没有提供删除操作。而CurrentHashMap则是使用Map.Entry接口来实现迭代器,它提供了更强大的迭代方式,同时也可以在遍历时进行删除操作。
空值:
Hashtable不允许null键和null值。而CurrentHashMap则允许null键和null值。
扩容:
Hashtable进行扩容时,需要将它的所有元素都重新计算哈希值、分配新的存储空间,并将元素重新保存到新的存储空间中。这个过程非常耗时。而CurrentHashMap对扩容进行了优化,将原始表格复制到新的存储空间中时,只需要复制需要扩容的段(segment)即可,大大减少了复制时间。
内存消耗:
由于Hashtable使用了同步关键字,对于每个方法的调用都会占据一定的内存空间。而CurrentHashMap则只会在写操作时加锁,因此在大多数情况下,CurrentHashMap比Hashtable更加节省内存。
总之,虽然两者都是映射数据结构,但是它们又存在一些不同点。在使用时应根据自己的需求和环境选择合适的实现方式。
### 回答3:
CurrentHashMap和Hashtable是Java中的两个常用的Map实现。
首先,Hashtable是Java中的旧版本,而CurrentHashMap是从Java 1.5版本开始引入的。它们两个都是线程安全的,但是CurrentHashMap的性能要比Hashtable更好。
Hashtable的线程安全是通过在每个方法上都加上了synchronized关键字来实现的。这样一来,在多线程访问的时候,任何方法都只有一个线程能够访问,而其他线程需要等待。这样的话,对于性能要求高的应用程序来说,可能会降低程序的运行速度。
相比之下,CurrentHashMap采用了一种锁分离的机制来实现线程安全。锁分离的意思是,CurrentHashMap将map中的不同部分分别锁定,这样,当一个线程访问map中的某个部分时,其他线程就可以同时访问map中的其他部分,从而提高了程序的并发性能和运行速度。同时,CurrentHashMap还可以设置concurrency level(并发级别)来控制最大的同时访问的线程数,也能够提高程序的性能。
除此之外,Hashtable是不允许null作为key或value的,而CurrentHashMap则可以允许null。另外,Hashtable和CurrentHashMap在迭代器上的表现也有所不同。Hashtable迭代器是通过Enumeration实现的,而CurrentHashMap的则不是。当前HashMap的迭代器更加稳定,而Hashtable的迭代器在迭代过程中如果发生变化可能会抛出ConcurrentModificationException异常。
总之,Hashtable和CurrentHashMap都是线程安全的Map实现,但是CurrentHashMap由于锁分离的机制,性能更好。此外,CurrentHashMap还允许null作为key或value,并且更加稳定。
阅读全文