In this article, we will discuss HashSet class – one of the Set implemented classes in detail
1. Key points about HashSet:
- HashSet contains only unique elements
- It doesn’t maintains insertion-order or
- say stores in random-order
2. HashSet:
- HashSet is the implementation class of Set interface (i.e.; HashSet implements Set)
- HashSet is backed by a hashtable (actually a HashMap instance) to store element/objects
- Duplicate element/objects are NOT allowed
- If duplicate value is added again, then there won’t be any compile-time or runtime errors
- Simply add(object) method returns false for already containing object inside HashSet
- At any time, HashSet contains only unique element/objects
- Insertion-order is NOT maintained
- While iterating through HashSet, we will get items in random-order (as against insertion-order)
- Allows NULL insertion but maximum of only one NULL value
- Without generics, HashSet allows to insert any type of objects;
- with generics, it is type-bounded (except, if we take Object as type within angle brackets)
- HashSet is non-synchronized
- Search operation is faster i.e.; searching any element from HashSet is faster, as it uses hashing to store elements
- Present in java.util package and extends java.util.AbstractSet implements java.util.Set interface
- Also, implements java.lang.Cloneable, java.io.Serializable marker interfaces which provides special ability to HashSet (provided by JVM at run time) like,
- java.lang.Cloneable: to create a duplicate object or to clone an object
- java.io.Serializable: to transfer objects across network
Source: Team BenchResources.Net
3. HashSet constructors:
3.1 HashSet hs = new HashSet();
- creates an empty HashSet object of size 16
- with default fill ratio 0.75
3.2 HashSet hs = new HashSet(int initialCapacity);
- creates an empty HashSet object of specified size (or initial capacity)
- with default fill ratio 0.75
3.3 HashSet hs = new HashSet(int initialCapacity, float loadFactor);
- creates an empty HashSet object of specified size (or initial capacity) and
- specified fill ratio (for example 0.85)
3.4 HashSet hs = new HashSet(Collection c);
- creates an equivalent HashSet object for the specified collection
- it is basically used for inter-conversion between collection objects
4. Fill ratio (or Load factor)
- Fill ratio is also known as Load factor
- This factor determines when to increase the size of HashSet automatically
- For example, for the 1st two constructors the default load factor is 0.75 –> which means after filling 75% of HashSet, new HashSet of bigger size will be created
- For 3rd constructor, programmer can define load factor while creating HashSet object. If programmer defined it to be 0.95, then after filling 95% of HashSet, size of HashSet will be increased automatically
- The value of Load factor should be in between 0.0 to 1.0
5. HashSet examples:
HashSetAddAndRemove.java
package in.bench.resources.java.collection;
import java.util.HashSet;
import java.util.Iterator;
public class HashSetAddAndRemove {
public static void main(String[] args) {
// creating HashSet object of type String
HashSet<String> hs = new HashSet<String>();
// adding elements to HashSet object
hs.add("Sundar Pichai");
hs.add("Satya Nadella");
hs.add("Shiv Nadar");
hs.add("Shantanu Narayen");
hs.add("Sundar Pichai"); // adding duplicate element
hs.add("Francisco D’Souza");
// adding null element to HashSet
hs.add(null);
hs.add(null); // 2nd null is added to hs
// creating Iterator reference
Iterator<String> ceo = hs.iterator();
System.out.println("Iterating using Iterator\n");
// iterating using while loop
while (ceo.hasNext()){
System.out.println(ceo.next());
}
System.out.println("\n\nprinting inside"
+ " square brackets []");
System.out.println(hs);
}
}
Output:
Iterating using Iterator
null
Satya Nadella
Sundar Pichai
Francisco D’Souza
Shiv Nadar
Shantanu Narayen
printing inside square brackets []
[null, Satya Nadella, Sundar Pichai, Francisco D’Souza,
Shiv Nadar, Shantanu Narayen]
Note: All methods of HashSet is non-synchronized
Q) How to make HashSet synchronized ?
- HashSet can be easily converted into synchronized HashSet
- using utility method synchronizedSet(hs); of java.util.Collections class
Set set = Collections.synchronizedSet(hs);
Related Articles:
- How to get size or length of HashSet
- How to delete a element and delete all elements of HashSet
- retainAll() method explanation with HashSet
- How to check whether particular element is present in HashSet
- Comparing two HashSet objects using containsAll() method
- Adding one HashSet to another HashSet using addAll() method
- Various ways to iterate through HashSet
- How to reverse LinkedHashSet contents
- Sorting HashSet contents in ascending and descending order
- How to Sort HashSet in Java – 2 ways
References:
- https://docs.oracle.com/javase/tutorial/collections/intro/
- https://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html
- https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html
- https://docs.oracle.com/javase/tutorial/collections/interfaces/list.html
- https://docs.oracle.com/javase/tutorial/collections/interfaces/set.html
- https://docs.oracle.com/javase/7/docs/api/java/util/Set.html
- https://docs.oracle.com/javase/7/docs/api/java/util/class-use/HashSet.html
- https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html
- https://en.wikipedia.org/wiki/Hash_table
Happy Coding !!
Happy Learning !!