2

我只是明白 LinkedHashSet 在插入时不允许重复元素。但是,我不明白 Hashset 在 Hava 中是如何工作的?我知道在 Hashset 中使用了 Hashtable,因此哈希表用于存储元素,这里也不允许重复元素。然后,Treeset 也类似于 Hashset,它也不允许重复的条目,因此可以看到唯一的元素,并且它遵循升序。

我对 HashMap 还有一个疑问 - Hashmap 不维持秩序。它可能有一个空键和多个空值。我只是不明白这一点,这实际上是什么意思?有什么实际的例子吗?

我知道一点,Hashmap 曾经基于此工作 - 用于放入存储桶的键和值也存储桶具有唯一编号。这样,就可以从桶中识别并获取键和值。当我将键/值对放入其中标识符是键的哈希码的桶中时。

例如:键的哈希码是101,所以它存储在桶101中。一个桶可以存储多个键和值对。假设 Object1 是“A”,object2 是“A”,object3 是“B”,那么它具有相同的 Hash 码。因此,它通过在同一个桶中共享相同的 Hashcode 来存储不同的对象。我的疑问是,具有相同哈希码的对象应该相等,不同的对象应该有不同的哈希码?

这是使用 HashSet 的程序:

    import java.util.*;
    public class Simple{
    public static void main(String[] args){
    HashSet hh=new HashSet();
    hh.add("D");
    hh.add("A");
    hh.add("B");
    hh.add("C");
    hh.add("a");        
    System.out.println("Checking the size is:"+hh.size()+"");
    System.out.println(hh);

    Iterator i=hh.iterator();
    while(i.hasNext()){
    System.out.println(i.next());
    }      
    }
    }

输出是,

Checking the size is:5
[D, A, B, a, C]
D
A
B
a
C

我的疑问是,为什么“a”插入在“B”和“C”之间。

现在,我正在使用 LinkedHashSet 所以,

public class Simple{
public static void main(String[] args){
    LinkedHashSet hh=new LinkedHashSet();
            hh.add("D");
            hh.add("A");
    hh.add("B");
    hh.add("C");
            hh.add("a");  

        System.out.println("Checking the size is:"+hh.size()+"");
    System.out.println(hh);

    Iterator i=hh.iterator();
    while(i.hasNext()){
        System.out.println(i.next());
    }      
}
}

我只是明白,它遵循插入顺序并且避免重复元素。所以输出是,

Checking the size is:5
[D, A, B, C, a]
D
A
B
C
a

现在,使用树集:

import java.util.*;
public class Simple{
public static void main(String[] args){
    TreeSet hh=new TreeSet();
            hh.add("1");
            hh.add("5");
            hh.add("3");
            hh.add("5");
            hh.add("2");
            hh.add("7");  

System.out.println("Checking the size is:"+hh.size()+"");
System.out.println(hh);

    Iterator i=hh.iterator();
    while(i.hasNext()){
        System.out.println(i.next());
    }      
}
}

在这里,我只是明白- Treeset 遵循升序。

The output is,
Checking the size is:5
[1, 2, 3, 5, 7]
1
2
3
5
7

那么我的疑问是,Hashset 在 Java 中是如何工作的?而且我知道 LinkedHashset 遵循双链表。如果它使用双向链表,那么它如何存储元素?双向链表是什么意思,它是如何工作的?那么这三个Hashset,Treeset,LinkedHashset在Java中会在哪里使用,哪一个在Java中性能更好呢?

4

4 回答 4

3

我的疑问是,为什么“a”插入在“B”和“C”之间。

TreeSet 对条目进行排序。

LinkedHashSet 保留插入顺序。

HashSet 不保留插入顺序,也不对条目进行排序/排序。这意味着当您遍历集合时,条目以难以理解的顺序返回......并且没有实际意义。"a"在这一点上没有插入特定的“原因” 。结果就是这样……给定一组输入键和插入它们的顺序。

我唯一的疑问是,Hashset 在 Java 中是如何工作的。

它实现了一个哈希表。阅读有关哈希表的 Wikipedia 页面以获取一般概述,以及源代码java.util.HashMapjava.util.HashSet详细信息。

简短的回答是HashSetHashMap都是作为哈希链数组实现的哈希表。

我知道,LinkedHashset 遵循双链表。如果它使用双向链表,那么它如何存储元素?

LinkedHashSet本质上是一个哈希表,带有一个记录插入顺序的附加链表。元素存储在主哈希表中......这就是提供快速查找的原因。同样,有关详细信息,请参阅源代码。

双向链表是什么意思,它是如何工作的?

阅读 Wikipedia 中关于双向链表的文章。


那么这三个Hashset,Treeset,Linkedhashset在Java中都将在哪里使用,哪一个在Java中具有更好的性能?

在这三个类别(和其他类别)之间进行选择时,需要考虑很多事情:

  • 它们是否提供所需的功能。例如,我们已经看到它们在迭代顺序方面具有不同的行为。

  • 它们是否具有所需的并发属性?例如,它们是线程安全的吗?他们处理争用吗?他们允许同时修改吗?

  • 他们需要多少空间?

  • 什么是性能(时间)特征。

关于最后两点?

  • ATreeSet使用最少的空间,而 aLinkedHashSet使用最多。

  • 对于较大的集合, AHashSet往往是查找、插入和删除最快的,而 aTreeSet往往是最慢的。

于 2013-11-26T13:00:33.903 回答
1

首先,您需要知道所有Set实现都共享相同的功能:它们不允许重复。这不仅仅是LinkedHashSet.

其次,一个重要的区别是,在您询问的 3 种集合类型中,TreeSet是有序集合,即元素根据其自然顺序或根据使用 aComparator或实现Comparable接口的命令式描述的逻辑进行排序。

切换到 和 的区别HashSetLinkedHashSet请注意LinkedHashSet是 的子类HashSet。它们不是排序集。

HashSet是集合的最快实现,它使用(首先)hashCode()方法返回的它们的哈希值和(然后)它们的equals()方法来确保元素的唯一性。在幕后,它使用HashMap.

LinkedHashSet确保在 a 的帮助下对集合的元素进行一致的排序,LinkedList而 basic HashSets 不提供。

于 2013-11-26T12:55:11.990 回答
1

我会简明扼要。

集合遵循集合的数学理论。Set(AbstractSet 是 Java 中的超类型)类似于列表,只是它不能有两次相同的元素。

HashSet 用 HashMap 实现,TreeSet 用 Tree 实现,LinkedHashset 用双向链表实现。

于 2013-11-26T12:46:59.220 回答
0
  • HashSet 不保留元素的顺序。因此您无法识别它的顺序。
  • LinkedHashSet 保留在集合中添加元素时的顺序。它保持我们插入时的顺序。

  • TreeSet 维护元素的顺序。TreeSet 是最慢的,因为它在每次添加或删除元素之后排列其元素。

    否则,这一切都取决于您的要求,无论您是否需要有序列表、线程安全等。

于 2015-08-10T06:28:29.343 回答