Here are the key points about LinkedHashSet and HashSet in Java:
Underlying Data Structure:
LinkedHashSet: Backed by both a hash table and a linked list. This linked list defines the iteration ordering.
HashSet: Backed by a hash table (specifically, a HashMap instance).
Ordering:
LinkedHashSet: Maintains the order of insertion. The set’s iteration order is predictable and is the order in which elements were inserted.
HashSet: This does not guarantee any order. The iteration order can change over time.
Performance:
LinkedHashSet: Slightly slower performance (due to the added cost of maintaining the linked list) and typically consumes more memory than a simple HashSet.
HashSet: Generally faster since there’s no overhead of maintaining order.
Usage Scenarios:
LinkedHashSet: When you need a set with unique elements (like HashSet), but also require the set to maintain the order of insertion.
HashSet: When you only need to ensure uniqueness and don’t care about the order of elements.
Null Elements:
Both LinkedHashSet and HashSet allow one null element.
Memory Overhead:
LinkedHashSet: Has additional memory overhead for linking the elements.
HashSet: Lesser memory overhead as compared to LinkedHashSet since it doesn’t maintain any order.
Inheritance:
LinkedHashSet: Extends HashSet class and thus inherits its properties.
HashSet: Directly implements the Set interface.
Initialization:
LinkedHashSet: While initializing, you can specify the initial capacity and load factor.
HashSet: This also allows specifying the initial capacity and load factor during initialization.
Difference Between LinkedHashSet and HashSet in Java
Criteria | LinkedHashSet | HashSet |
---|---|---|
Underlying Data Structure | Hash table + Doubly iss> | Hash table |
Ordering of Elements | Maintains the insertion order | No guaranteed order |
Performance | Sligh.2ly slower due to maintenance of the linked list | Generally faster due to not having to maintain any linked list |
Use-case | When order of elements is important based on their insertion order | When order of elements is not important and you just want to avoid duplicates |
Null Elements | Allows one null element | Allows one null element |
Memory Overhead | Higher due to additional linked list data structure | Lower as it’s just a simple hash table |
Duplicates | Does not allow duplicates | Does not allow duplicates |
Example: Difference Between LinkedHashSet and HashSet in Java
import java.util.LinkedHashSet;
import java.util.HashSet;
public class LinkedHashSetVsHashSetDemo {
public static void main(String[] args) {
// Create a HashSet and add elements
HashSet<String> hashSet = new HashSet<>();
hashSet.add("apple");
hashSet.add("banana");
hashSet.add("cherry");
System.out.println("HashSet:");
hashSet.forEach(System.out::println);
// Create a LinkedHashSet and add elements
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("apple");
linkedHashSet.add("banana");
linkedHashSet.add("cherry");
System.out.println("\nLinkedHashSet:");
linkedHashSet.forEach(System.out::println);
}
}
Output:
HashSet: banana cherry apple LinkedHashSet: apple banana cherry
Explanation:
1. HashSet: A HashSet is a collection that does not allow duplicate elements. It is implemented using a hash table, and as a result, the order of the elements in a HashSet is not guaranteed to remain constant over time.
2. LinkedHashSet: A LinkedHashSet is similar to a HashSet in that it doesn't allow duplicates, but it is implemented as a hash table combined with a linked list. This combination allows the LinkedHashSet to maintain the insertion order of its elements, which means the order in which elements were added to the set.
3. In the provided example, both the HashSet and LinkedHashSet have the same elements added in the same order. However, when printed, the HashSet might display its elements in a different order, while the LinkedHashSet maintains the order in which the elements were added.
4. If maintaining the order of elements is important for the use case, then LinkedHashSet should be preferred over HashSet. Otherwise, for simple set operations where order doesn't matter, a HashSet could be used as it might be slightly more memory-efficient than LinkedHashSet.