Java中Hashtable和Synchronized Map的區別


HashTable是一個緊湊的抽象資料集,它透過計算對映鍵到陣列槽中的索引來將對映的鍵轉換為值,從而實現更快的資料訪問。另一方面,同步對映是一個Java集合類,主要用於同步特定對映以使其成為執行緒安全的集合,並可以應用於整個物件。該對映不包含任何空值。

輸入

[ ARB, RDD, KOL, DHKA ]

輸出

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和Synchronized Map的區別

HashTable

Synchronized Map

HashTable使用表格儲存資料。

此結構使執行緒能夠在併發訪問時保持其安全性。

元素以任意方式排序。

它遵循手動同步,錯誤率低。

它在恆定時間範圍內工作。

一個與API友好的過程,具有效能開銷。

HashTable是一個同步過程,用於透過提供執行緒安全性來實現map介面,但這會帶來潛在的處理成本。另一方面,SynchronizedMap使用繼承的內建結構包裝現有的map類,以確保執行執行緒的安全性。

使用物件級同步方法

在這種方法中,我們使用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和Synchronized Map在不同引數下的可能區別。為了保持高水平的資料一致性,我們只能使用同步對映。雖然在這種情況下不推薦使用雜湊表,因為它是一個遺留類。

更新於:2023年11月2日

281 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告