Java 中 IdentityHashMap、WeakHashMap 和 EnumMap 之间的区别

javaobject oriented programmingprogramming

IdentityHashMap 是一种特殊类型的哈希类,我们用它来处理与引用相等相关的罕见情况。此映射使用"= ="运算符比较键,而普通哈希映射使用"equals"方法。Weak HashMap 是一种映射接口,其中哈希表将其键与弱引用类型的值合并。由于缺少引用指针,这种类型的映射类无法进一步使用。枚举映射是一种特殊类型的映射类,它仅包含枚举键。这种类型的映射主要用于继承具有相同类型键值的抽象类。这里的任务是通过考虑各种参数来区分这些映射结构。

示例


Input :
[ ARB, RDD, KOL,  DHKA ]

Output :
Insertion Order of objects in IdentityHashMap : 
[ ARB, RDD, KOL, DHKA ]
Insertion Order of objects in WeakHashMap :
[ ARB, RDD, DHKA, KOL ]
Insertion Order of objects in EnumMap :
[ ARB, RDD, DHKA, KOL ]

IdentityHashMap、WeakHashMap 和 EnumMap 之间的区别

IdentityHashMap

WeakHashMap

EnumMap

在此我们使用引用相等 ( == 运算符) 来处理相同的对象内存。

它使用弱引用作为其键,并自动删除元素。

它可以将所需的键实现为具有枚举对象的实例类。

使用 System.identityHashCode () 作为键基础来过滤唯一对象。

弱引用哈希映射可以随时收集垃圾值。

它遵循枚举键的优化性能。

它使用 equals () 和 hashCode () 函数进行更快的查找。

此过程始终使用带有映射的动态键来向其中插入一些额外数据。

此过程在执行数据检索时内存效率高。

这里,IdentityHashMap 根据键标识比较引用值。其中 WeakHashMap 为键提供了一个通道来收集垃圾值。 EnumMap 结构专门用于以通用方式优化枚举键值。

使用的方法

在对象级别使用同步

算法

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

  • 步骤 1 - 启动流程。

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

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

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

  • 步骤 5 - 设置函数。

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

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

  • 步骤 8 - 声明集合值。

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

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

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

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

  • 步骤 13 - 终止该过程。

语法

在此语法中,我们首先通过使用一些整数值填充树集来检查树集。之后,我们声明了一个映射集,从这些元素中创建一些标识对,以便通过使用表上的 entrySet () 和 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 ) ;
}

使用 ConcurrentModificationException 级别方法

在此方法中,我们将实现 ConcurrentModificationException 以在这些特定映射上执行各种操作。ConcurrentModificationException 是一种快速失败操作,用于在未经用户许可的情况下修改迭代值。

示例

在示例中,我们输入了一些数据元素作为整数和字符串,以通过使用 IdentityHashMap 的 getKey () 和 getValue () 函数将它们同步到映射中。此外,我们还迭代了输入并使用 ConcurrentModificationException 对其进行了更新。


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 ){
      IdentityHashMap < Integer, String > ihmap
         = new IdentityHashMap <Integer, String> () ;
      ihmap . put ( 10, "ARB" ) ;
      ihmap . put ( 20, "RDD" ) ;
      ihmap . put ( 30, "4" ) ;
      ihmap . put( 40, "ARBRDD" ) ;
      ihmap . put ( 50, "You" ) ;
      
      System.out.println ( " IdentityHashMap size : " + ihmap . size () ) ;
      System.out.println ( " Initial identity hash map: " + ihmap ) ;
      
      Iterator < IdentityHashMap . Entry < Integer, String > >
         itr = ihmap . entrySet () . iterator () ;
      while ( itr . hasNext () ){
         IdentityHashMap . Entry < Integer, String > entry = itr. next () ;
         System.out.println ( " Key = " + entry . getKey () + ", Value = " + entry . getValue () ) ;
      }
   }
}

输出

IdentityHashMap size : 5
Initial identity hash map: {30 =4, 10 =ARB, 40 =ARBRDD, 50 =You, 20 =RDD}
Key = 30, Value = 4
Key = 10, Value = ARB
Key = 40, Value = ARBRDD
Key = 50, Value = You
Key = 20, Value = RDD

结论

在本文中,我们使用 Java Collections Framework 对 IdentityHashMap、WeakHashMap 和 EnumMap 执行了各种操作,以了解它们之间的差异。在对它们执行成功操作后,您可以体验到这些映射中需要异常。其中,EnumMap 是不允许将空值放入其中的最佳结构。


相关文章