Java 中 HashSet 、LinkedHashSet 和 TreeSet 之间的区别和相似之处
HashSet、LinkedHashSet 和 TreeSet 是主要用于存储元素的集合接口类。
HashSet − HashSet 是一个容器实例,它仅以非同步方式存储唯一元素,以处理与集合相关的高性能操作。集合允许不遵循插入顺序的空值。
LinkedHashSet − LinkedHashSet 是一个克隆数据结构,它同时具有哈希表和链接列表的功能作为集合接口。LinkedHashSet 的有序版本始终作为输入元素上的双向链接列表工作。
TreeSet − TreeSet 是一种排序数据结构,通过使用树形图的存储作为接口工作。该集合遵循一般顺序,其中比较器类使用构造函数设置延迟值。
尽管这些接口类之间存在一些差异,也存在一些相似之处,但我们已尝试在此进行讨论。
示例
Input : [ ARB, RDD, KOL, DHKA ] Output : 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 - 声明设置值。
步骤 9 - 按照插入方式打印值。
步骤 10 - 声明一个循环来迭代该过程。
步骤 11 - 设置计时器值。
步骤 12 - 运行该过程并获取输出值。
步骤 13 - 终止过程。
语法
语法将首先使用一些整数值检查树集。之后,我们将声明一个映射集,从这些元素中创建一些对,以根据免疫力对它们进行过滤。
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 ) ;
使用插入顺序和插入时间方法
插入顺序是用户使用特定插入时间将更多元素添加到数据集的协议。插入时间是一个间隔跨度,用于记录元素所消耗的时间。在这种方法中,我们在链接的哈希集上使用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 接口。这三种结构不允许重复,并且不同步。我们可以使用迭代器克隆它们并调整它们的大小,因为这些数据集本质上是先失败的。