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接口。这三种结构不允许重复,并且是非同步的。我们可以使用迭代器克隆它们并调整它们的大小,因为这些数据集是故障优先的。