Java LinkedHashSet

时间:2020-01-09 10:35:02  来源:igfitidea点击:

Java中的LinkedHashSet也是Set接口的实现之一,例如HashSet和Treeset。 LinkedHashSet与其他实现的不同之处在于HashSet与无序的HashSet不同,LinkedHashSet是一个有序的集合,它保持迭代顺序,即将元素插入到集合中的顺序。

Java中的LinkedHashSet实现

LinkedHashSet维护一个贯穿其所有条目的双向链表。此链表定义了迭代顺序。 Java中的LinkedHashSet类将HashSet扩展为与实现Set接口不同,并且使用HashSet类本身的方法。

如果我们对HashSet内部实现有所了解,那么我们必须知道HashSet在内部使用HashMap来存储其元素。 LinkedHashSet在内部使用LinkedHashMap的方式相同。

LinkedHashSet的功能

本文中讨论的LinkedHashSet的一些功能如下:

  • Java中的LinkedHashSet仅存储唯一元素。
  • LinkedHashSet是一个有序集合,并保持插入顺序。
  • LinkedHashSet允许空元素。
  • LinkedHashSet不是线程安全的。
  • LinkedHashSet类的迭代器方法返回的迭代器是快速失败的。这意味着,如果在创建迭代器之后的任何时候修改了集合,则除了通过迭代器自己的remove方法之外,它以任何方式都将被修改,迭代器将抛出ConcurrentModificationException。

Java LinkedHashSet构造函数

Java中的LinkedHashSet类具有4个构造函数。

  • LinkedHashSet()构造一个新的空链接哈希集,其默认初始容量(16)和负载因子(0.75)。
  • LinkedHashSet(int initialCapacity)构造一个具有指定初始容量和默认负载因子(0.75)的新的空链接哈希集。
  • LinkedHashSet(int initialCapacity,float loadFactor)构造一个具有指定初始容量和负载因子的新的空链接哈希集。
  • LinkedHashSet(Collection <?extended E> c)构造一个新的链接的哈希集,该元素的元素与指定的collection相同。

Java示例,创建LinkedHashSet

本示例说明如何创建LinkedHashSet以及如何向其中添加元素。

import java.util.LinkedHashSet;
import java.util.Set;

public class LinkedHashSetDemo {
  public static void main(String[] args) {
    // Creating LinkedHashSet
    Set<String> carSet = new LinkedHashSet<String>();
    // Storing elements
    carSet.add("Audi");
    carSet.add("BMW");
    carSet.add("Mini Cooper");
    carSet.add(null);
    carSet.add("Jaguar");
    carSet.add("Mini Cooper");
    carSet.add(null);

    // Iterating the Set
    for(String str : carSet){
      System.out.println("Car Name- " + str);
    }  
  }
}

输出:

Car Name- Audi
Car Name- BMW
Car Name- Mini Cooper
Car Name- null
Car Name- Jaguar

从输出中可以看到,插入顺序得到维护。同样,重复元素仅添加一次,并且不会影响插入顺序,同样的方法,即使添加多次,也只会添加null。

LinkedHashSet实现不同步

Java中的LinkedHashSet不同步,因此不是线程安全的。如果多个线程同时访问LinkedHashSet,并且至少一个线程在结构上修改了该集,则必须在外部对其进行同步。我们可以使用Collections.synchronizedSet方法包装LinkedHashSet。

Set s = Collections.synchronizedSet(new LinkedHashSet(...));

Java LinkedHashSet迭代器

LinkedHashSet的collection视图方法返回的迭代器是快速失败的。如果在创建迭代器后的任何时候修改了集合,则除了通过迭代器自己的remove方法以外,都以任何方式修改了该迭代器,该迭代器将抛出ConcurrentModificationException。

迭代LinkedHashSet Java示例

public class LinkedHashSetDemo {
  public static void main(String[] args) {
    Set<String> carSet = new LinkedHashSet<String>();
    // Storing elements
    carSet.add("Audi");
    carSet.add("BMW");
    carSet.add("Mini Cooper");
    carSet.add("Jaguar");
    
    Iterator<String> itr = carSet.iterator();
    while(itr.hasNext()){
      System.out.println("Car Name- " + itr.next());
    } 
  }
}

输出:

Car Name- Audi
Car Name- BMW
Car Name- Mini Cooper
Car Name- Jaguar

LinkedHashSet的性能

像HashSet一样,LinkedHashSet为基本操作(添加,包含和删除)提供恒定时间的性能,假设哈希函数将元素正确地分散在存储桶中。尽管性能方面明智的LinkedHashSet可能仅略低于HashSet,这是因为维护链接列表会增加开销。一个例外是由于链接列表的实现,迭代在LinkedHashSet中更快。