Hashset,Treeset和Linkedhashset,Hashmap之间的主要区别是什么?它在Java中如何工作?

时间:2013-11-26 12:42:40

标签: java collections hashset linkedhashset

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

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

我知道一点,Hashmap曾经基于此工作 - 用于放入存储桶的密钥和值也有唯一的数字。这样,就可以从桶中识别并获取密钥和价值。当我将键/值对放在桶中时,其标识符是键的哈希码。例如:密钥的哈希码是101,因此它存储在桶101中。一个桶可以存储多于密钥和值对。假设一个例子,因为Object1是“A”,object2是“A”而object3是“B”,那么它具有相同的哈希码。因此,它通过在同一个桶中共享相同的Hashcode来存储不同的对象。我的疑问是,具有相同Hashcode的对象应该相等,不同的对象应该有不同的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

现在,使用Treeset: -

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中具有更好的性能?

5 个答案:

答案 0 :(得分:3)

  

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

TreeSet对条目进行排序。

LinkedHashSet保留了插入顺序。

HashSet不保留插入顺序,并且不对条目进行排序/排序。这意味着当你遍历集合时,条目将以难以理解的顺序返回......并且没有实际意义。没有特别的“原因”,"a"在那一点被插入。这就是结果......给出了输入键的集合以及它们的插入顺序。

  

我唯一怀疑的是,Hashset如何在Java中运作。

它实现了一个哈希表。阅读hash tables上的维基百科页面以获取一般概述,并阅读java.util.HashMapjava.util.HashSet的源代码以获取详细信息。

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

  

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

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

  

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

doubly linked lists上阅读维基百科上的文章。


  

然后在Java中使用所有这三个Hashset,Treeset,Linkedhashset以及哪个在Java中具有更好的性能?

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

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

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

  • 他们需要多少空间?

  • 表现(时间)特征是什么。

最后两点?

  • TreeSet占用的空间最小,而LinkedHashSet使用的空间最少。

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

答案 1 :(得分:1)

我会简洁。

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

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

答案 2 :(得分:1)

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

第二,一个重要的区别是,在您询问的3种类型中,TreeSet是一个有序集合,即元素按照其自然顺序排序或根据必须使用的逻辑进行排序Comparator或实施Comparable界面。

切换到HashSetLinkedHashSet之间的差异,请注意LinkedHashSetHashSet的子类。它们不是排序集。

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

LinkedHashSetLinkedList的帮助下确保对集合元素的一致排序,基本HashSet不提供。

答案 3 :(得分:0)

  • HashSet不保留元素的顺序。所以你无法识别 它的订单。
  • LinkedHashSet在set中添加元素时保留顺序。它 在我们插入订单时保持订单。

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

    否则,无论您是否需要,都会依赖您的要求 有序列表,线程安全等。

答案 4 :(得分:0)

HashMap接受键值对,它允许键和值的空值,而HashMap是非同步的。 HasTable接受键值对,它不允许键值和值的空值,并且HasTable是同步的。

了解更多info