Java 中 Hashtable 和同步映射之间的区别

javaobject oriented programmingprogramming

HashTable 是一个紧凑的抽象数据集,它通过将索引计算为插槽数组来将映射的键转换为值,以实现更快的数据访问。另一方面,同步映射是一个 Java 集合类,主要用于同步特定映射以使其成为线程安全集合,并可应用于整个对象。映射不包含任何空值。

示例


Input :
[ ARB, RDD, KOL, DHKA ]

Output :
Insertion Order of objects in HashTable : 
[ ARB, RDD, KOL, DHKA ]
Insertion Order of objects in Synchronized Map :
[ ARB, RDD, DHKA, KOL ]

使用的方法

在对象级别使用同步

算法

在此算法中,我们声明了一些函数,通过考虑一组值来执行数组列表中的插入顺序。此外,通过使用循环执行迭代,我们将设置长度遍历的时间。

  • 步骤 1 - 启动流程。

  • 步骤 2 - 声明输入输出流。

  • 步骤 3 - 导入内置类和声明的函数。

  • 步骤 4 - 声明一个公共类。

  • 步骤 5 - 设置函数。

  • 步骤 6 - 查找插入顺序。

  • 步骤 7 - 声明一个数组列表并填充它。

  • 步骤 8 - 声明集合值。

  • 步骤 9 - 按照插入方式打印值。

  • 步骤 10 - 声明一个循环来迭代该过程。

  • 步骤 11 - 设置计时器值。

  • 步骤 12 - 运行该过程并获取输出值。

  • 步骤 13 - 终止该过程。

语法

语法将首先使用一些整数值检查树集。之后,我们将声明一个映射集,从这些元素中创建一些身份对,并使用 hasNext () 根据它们的状态对它们进行过滤。


TreeSet < Integer > STTREE = new TreeSet <> () ;
STTREE . add ( 4 ) ;
STTREE . add ( 5 ) ;
STTREE . add ( 6 ) ;
STTREE . add ( 8 ) ;
STTREE . add ( 4 ) ;

IdentityHashMap < Integer, String > ihmap
   = new IdentityHashMap < Integer, String > () ;
ihmap . put ( 10, "ARB" ) ;
ihmap . put ( 20, "RDD" ) ;
ihmap . put ( 30, "ARBRDD" ) ;
ihmap . put ( 40, "KOLDHKA" ) ;
ihmap . put ( 50, "You" ) ;

PRINT THE VALUE HERE ( " IdentityHashMap size : " + ihmap . size () ) ;
PRINT THE VALUE HERE ( " Initial identity hash map :  "     + ihmap ) ;

Hashtable < Integer, String > table  
   = new Hashtable < Integer, String > () ;  
table . put ( 1 , "X" ) ;
table . put ( 2 , "Y" ) ;
table . put ( 3,  "Z" ) ; 
table . put ( 4,  "A" ) ;

for ( Map . Entry m : table . entrySet () )
   Iterator < IdentityHashMap . Entry < Integer, String > >
   itr = ihmap . entrySet () . iterator () ;
while ( itr . hasNext () ) {
   IdentityHashMap . Entry < Integer, String > entry
      = itr . next ( ) ;
   TreeMap < Integer,Integer > MAPTREE 
      = new TreeMap <> () ;
   MAPTREE . put ( 2,5 ) ;
   MAPTREE . put ( 3,6 ) ;
   MAPTREE . put ( 4,6 ) ;
   MAPTREE . put ( 2,3 ) ;
}

Hashtable 和同步 Map 之间的区别

HashTable

同步 Map

HashTable 使用表来存储数据。

此结构使线程能够通过并发访问来维护其安全性。

元素按任意方式排序。

它遵循手动同步,错误率低。

它在恒定的时间范围内工作。

具有高性能的 API 友好流程开销。

HashTable 是一个同步过程,通过提供线程安全性来实现映射接口,这会带来潜在的进程成本。另一方面,SynchronizedMap 使用内置的继承结构包装当前的映射类,以确保正在运行的线程的安全性。

使用对象级同步方法

在这种方法中,我们使用了 set 接口的对象级同步过程。对象级同步是用户想要在类的提供实例上执行特定块的过程。

示例

在示例 1 (A) 中,我们输入了一些数据元素作为整数和字符串,以便使用 getKey () 和 getValue () 函数将它们同步到映射中。


import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;
import java.util.*;
public class ARBRDD{
   public static void main ( String args [] ){
      HashMap < Integer, String > hmap = new HashMap < Integer, String > () ;
      hmap . put ( 2, "A" ) ;
      hmap . put ( 44, "R" ) ;
      hmap . put ( 1, "B" ) ;
      hmap . put ( 4, "RDD" ) ;
      hmap . put ( 88, "XYZ" ) ;
      
      Map map = Collections . synchronizedMap ( hmap ) ;
      Set set = map . entrySet () ;
      synchronized ( map ){
         Iterator i = set . iterator () ;
         while ( i . hasNext () ){
            Map . Entry me = ( Map .Entry ) i . next () ;
            System.out.print ( me . getKey () + ": " ) ;
            System.out.println ( me . getValue () ) ;
         }
      }
   }
}

输出

1: B
2: A
4: RDD
88: XYZ
44: R

结论

因此,在本文中,我们尝试梳理 HashTable 和具有不同参数的 Sunchronized Map 之间的可能差异。为了保持高级别的数据一致性,我们只能使用同步映射。尽管 hastable 不推荐用于这种情况,因为它是一个遗留类。


相关文章