Java中HashSet、LinkedHashSet和TreeSet的区别与相似之处


HashSet、LinkedHashSet和TreeSet是主要用于存储元素的Set接口类。

  • HashSet − HashSet是一个容器实例,它以非同步方式存储仅唯一的元素,以处理涉及集合的高性能操作。集合允许空值,但不遵循插入顺序。

  • LinkedHashSet − LinkedHashSet是一个克隆的数据结构,它同时具有哈希表和链表作为集合接口的功能。LinkedHashSet的有序版本始终在输入元素上作为双向链表工作。

  • TreeSet − TreeSet是一个排序的数据结构,它通过使用树形映射的存储作为接口工作。集合遵循一般的排序,其中比较器类使用构造函数设置延迟的值。

尽管这些接口类之间存在一些差异,并且也有一些共同点,但我们在这里试图讨论它们。

输入

[ ARB, RDD, KOL, DHKA ]

输出

Insertion Order of objects in HashSet : 
[ ARB, RDD, KOL, DHKA ]
Insertion Order of objects in LinkedHashSet : 
[ ARB, RDD, DHKA, KOL ]
Insertion Order of objects in TreeSet :
[ ARB, DHKA, KOL, RDD ]

HashSet、LinkedHashSet和TreeSet之间的相似之处

基于HashSet、LinkedHashSet和TreeSet的偏好和操作方式,它们之间有很多相似之处。

  • 数据集的接口 − HashSet、LinkedHashSet和TreeSet是一些常用的类,它们通过继承用作接口。

  • 无重复 − 这些集合不允许任何重复的内容,因为它们本质上是唯一的。

  • 框架 − 这些是一些著名的Java集合框架,能够以独特的方式提供操作。

HashSet、LinkedHashSet和TreeSet之间的区别

尽管有一些相似之处,但这些集合有很多区别,如下所示:

HashSet

LinkedHashSet

TreeSet

HashSet使用哈希表来存储数据。

使用双向链表维护插入顺序。

我们总是使用自平衡二叉树,称为红黑树。

元素以任意方式排序。

以可预测的迭代顺序工作。

使用自定义比较器排序。

它在恒定时间内工作。

完成每个步骤后,我们可以比较插入和删除过程。

在特定范围内,我们可以用O(log n)的时间从首尾检索数据。

在这里,我们可以说HashSet对于一般的集合操作是最有效和最突出的过程。另一方面,LinkedHashSet总是遵循插入方式,而TreeSet自动地对元素进行排序。

使用的方法

使用插入顺序和插入时间方法

算法

该算法将向您展示使用一些计时器值实现HashSet、LinkedHashSet和TreeSet结构的系统过程。

  • 步骤1 − 开始进程。

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

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

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

  • 步骤5 − 设置函数。

  • 步骤6 − 进行插入排序。

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

  • 步骤8 − 声明Set值。

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

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

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

  • 步骤12 − 运行进程并获取输出值。

  • 步骤13 − 终止进程。

语法

语法将首先检查带有某些整数值的TreeSet。之后,我们将声明一个map set,以从这些元素中创建一些对,根据免疫力对其进行过滤。

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

TreeMap < Integer , Integer > MAPTREE = new TreeMap < > () ;
MAPTREE . put ( 2,5 ) ;
MAPTREE . put ( 3,6 ) ;
MAPTREE . put ( 4,6 ) ;
MAPTREE . put ( 2,3 ) ;

使用插入顺序和插入时间方法

插入顺序是一种协议,用户可以通过它使用一定的插入时间将更多元素添加到数据集中。插入时间是元素保持时间消耗记录的时间间隔。在这种方法中,我们在LinkedHashSet上使用了insertionOrder()函数来以O(1)的时间复杂度执行该过程。

示例

在示例代码中,我们通过使用迭代来获取上述映射之间的差异,执行了各种过程,例如在特定时间段内进行插入和删除。

import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;
public class ARBRDD {
   private static void insertionOrder (){
      LinkedHashSet < String > ARBRDDLINKEDSET
         = new LinkedHashSet <> ();
      TreeSet <String> ARBRDDTREESET = new TreeSet <> ();
      HashSet <String> ARBRDDHASHSET = new HashSet <String> ();
      for ( String str : Arrays.asList ( "ARB", "RDD", "DHKA", "KOL" ) ) {
         ARBRDDLINKEDSET . add ( str ) ;
         ARBRDDTREESET . add ( str ) ;
         ARBRDDHASHSET . add ( str ) ;
      }
      
      System.out.println ( "Insertion Order " + " of objects in HashSet :" + ARBRDDHASHSET ) ;
      System.out.println ( " Insertion Order of " + "objects in LinkedHashSet : " + ARBRDDLINKEDSET ) ;
      System.out.println ( "Insertion Order of" + " objects in TreeSet : " + ARBRDDTREESET ) ;
   }
   private static void insertionTime () {
      HashSet <Integer> numbersHS = new HashSet <> () ;
      long startTime = System . nanoTime () ;
      for  ( int i = 0; i < 1000; i ++ ) {
         numbersHS . add ( i ) ;
      }
      
      long endTime = System . nanoTime () ;
      System.out.println ( "Total time to insert" + " 1000 elements in" + " HashSet in nanoseconds: " + ( endTime - startTime ) ) ;
      LinkedHashSet <Integer> numbersLLS
         = new LinkedHashSet <> () ;

      startTime = System . nanoTime () ;
      for ( int i = 0; i < 1000; i ++ ) {
         numbersLLS . add ( i ) ;
      }
      
      endTime = System . nanoTime () ;
      System.out.println ( "Total time to insert" + " 1000 elements in" + " LinkedHashSet nanoseconds: " + ( endTime - startTime ) ) ;
      TreeSet <Integer> numbersTS = new TreeSet <> () ;

      startTime = System . nanoTime () ;
      for  ( int i = 0; i < 1000; i++ ) {
         numbersTS . add ( i ) ;
      }
      
      endTime = System . nanoTime () ;
      System.out.println ( "Total time to insert" + " 1000 elements in" + " TreeSet in nanoseconds: " + ( endTime - startTime ) ) ;
   }
   private static void deletion () {
      HashSet <Integer> deletionHS = new HashSet <> () ;

      for ( int i = 0; i < 1000; i ++ ) {
         deletionHS . add ( i ) ;
      }

      long startingTime = System . nanoTime () ;
      for ( int i = 0; i < 1000; i ++ ) {
         deletionHS . remove ( i ) ;
      }

      long endedTime = System . nanoTime () ;
      System.out.println("Total time to Deletion " + "1000 elements in HashSet in nanoseconds : " + Math . abs ( startingTime - endedTime ) ) ;
      LinkedHashSet <Integer> deletionLLS
         = new LinkedHashSet <> () ;

      for ( int i = 0; i < 1000; i ++ ) {
         deletionLLS . add ( i ) ;
      }
      startingTime = System . nanoTime () ;
      for ( int i = 0; i < 1000; i ++ ) {
         deletionLLS . remove ( i ) ;
      }

      endedTime = System . nanoTime () ;
      System.out.println (
         "Total time to Deletion 1000"
         + " elements in LinkedHashSet in nanoseconds: "
         + Math . abs ( startingTime - endedTime ) ) ;
         
      TreeSet <Integer> deletionTS = new TreeSet <> () ;
      for ( int i = 0; i < 1000; i ++ ) {
         deletionTS . add ( i ) ;
      }
      
      startingTime = System . nanoTime () ;
      for ( int i = 0; i < 1000; i ++ ) {
         deletionTS . remove ( i ) ;
      }
      
      endedTime = System . nanoTime () ;
      System.out.println(
         "Total time to Deletion 1000"
         + " elements in TreeSet in nanoseconds: "
         + Math . abs ( startingTime - endedTime ) ) ;
   }
   public static void main ( String args [] ){
      insertionOrder () ;
      insertionTime () ;
      deletion () ;
   }
}

输出

Insertion Order  of objects in HashSet : [ ARB, RDD, KOL, DHKA ]
Insertion Order of objects in LinkedHashSet : [ ARB, RDD, DHKA, KOL ]
Insertion Order of objects in TreeSet : [ ARB, DHKA, KOL, RDD ]
Total time to insert 1000 elements in HashSet in nanoseconds : 584880
Total time to insert 1000 elements in LinkedHashSet nanoseconds : 343136
Total time to insert 1000 elements in TreeSet in nanoseconds : 1445318
Total time to Deletion 1000 elements in HashSet in nanoseconds : 339148
Total time to Deletion 1000 elements in LinkedHashSet in nanoseconds : 261723
Total time to Deletion 1000 elements in TreeSet in nanoseconds : 877681

结论

因此,在今天的文章中,我们将学习HashSet、LinkedHashSet和TreeSet之间显著的区别。它们之间也有许多相似之处,因为它们都实现了Set接口。这三种结构不允许重复,并且是非同步的。我们可以使用迭代器克隆它们并调整它们的大小,因为这些数据集是故障优先的。

更新于:2023年11月2日

251 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告