Java LinkedHashSet
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中更快。