You're tracking which pages a user has visited. You don't want duplicates, and you need fast "have they seen this?" checks. HashSet automatically ignores duplicates and provides O(1) membership testing.

Collect unique tags

Add items to a set - duplicates are ignored.

UniqueTags.java
import java.util.HashSet;

public class UniqueTags {
    public static void main(String[] args) {
        // Create a set of tags for a blog post
        HashSet<String> tags = new HashSet<>();
        
        System.out.println("=== Adding Blog Tags ===");
        
        // Add tags
        boolean added;
        
        added = tags.add("java");
        System.out.println("Add 'java': " + added + " → " + tags);
        
        added = tags.add("programming");
        System.out.println("Add 'programming': " + added + " → " + tags);
        
        added = tags.add("tutorial");
        System.out.println("Add 'tutorial': " + added + " → " + tags);
        
        // Try to add duplicate
        added = tags.add("java");
        System.out.println("Add 'java' again: " + added + " → " + tags);
        System.out.println("Duplicate ignored!");
        
        // Add more tags
        tags.add("beginner");
        tags.add("coding");
        tags.add("java");
        System.out.println("\nWith more tags: " + tags);
        
        System.out.println("\n=== Blog Post Tags ===");
        System.out.println("Total unique tags: " + tags.size());
        System.out.println("Tags: " + tags);
        
        // Display as hashtags
        System.out.println("\n=== Formatted ===");
        for (String tag : tags) {
            System.out.print("#" + tag + " ");
        }
        System.out.println();
    }
}

add() returns false if element already exists. Set stays unique.

HashSet Unordered collection of unique elements. O(1) add, remove, contains.

Fast membership check

Test if an item is in the set.

CheckMembership.java
import java.util.HashSet;
import java.util.Arrays;

public class CheckMembership {
    public static void main(String[] args) {
        // Create an allowlist of premium users
        HashSet<String> premiumUsers = new HashSet<>(Arrays.asList(
            "alice", "bob", "carol", "david"
        ));
        
        System.out.println("=== Premium Membership ===");
        System.out.println("Premium users: " + premiumUsers);
        
        // Check if user has access
        String currentUser = ;
        
        System.out.println("\n=== Access Check ===");
        System.out.println("User: " + currentUser);
        
        if (premiumUsers.contains(currentUser)) {
            System.out.println("✓ Premium access granted!");
            System.out.println("Welcome to exclusive content.");
        } else {
            System.out.println("✗ Not a premium user.");
            System.out.println("Upgrade to access premium features!");
        }
        
        // Blocked users check
        HashSet<String> blockedUsers = new HashSet<>(Arrays.asList(
            "spammer", "troll", "eve"
        ));
        
        System.out.println("\n=== Security Check ===");
        if (blockedUsers.contains(currentUser)) {
            System.out.println("⛔ User is blocked!");
        } else {
            System.out.println("✓ User is not blocked.");
        }
        
        // Check multiple users
        System.out.println("\n=== Batch Check ===");
        String[] usersToCheck = {"alice", "eve", "bob", "frank"};
        
        for (String user : usersToCheck) {
            String status = premiumUsers.contains(user) ? "Premium" : "Regular";
            System.out.println(user + ": " + status);
        }
    }
}
import java.util.HashSet;
import java.util.Arrays;

public class CheckMembership {
    public static void main(String[] args) {
        // Create an allowlist of premium users
        HashSet<String> premiumUsers = new HashSet<>(Arrays.asList(
            "alice", "bob", "carol", "david"
        ));
        
        System.out.println("=== Premium Membership ===");
        System.out.println("Premium users: " + premiumUsers);
        
        // Check if user has access
        String currentUser = ;
        
        System.out.println("\n=== Access Check ===");
        System.out.println("User: " + currentUser);
        
        if (premiumUsers.contains(currentUser)) {
            System.out.println("✓ Premium access granted!");
            System.out.println("Welcome to exclusive content.");
        } else {
            System.out.println("✗ Not a premium user.");
            System.out.println("Upgrade to access premium features!");
        }
        
        // Blocked users check
        HashSet<String> blockedUsers = new HashSet<>(Arrays.asList(
            "spammer", "troll", "eve"
        ));
        
        System.out.println("\n=== Security Check ===");
        if (blockedUsers.contains(currentUser)) {
            System.out.println("⛔ User is blocked!");
        } else {
            System.out.println("✓ User is not blocked.");
        }
        
        // Check multiple users
        System.out.println("\n=== Batch Check ===");
        String[] usersToCheck = {"alice", "eve", "bob", "frank"};
        
        for (String user : usersToCheck) {
            String status = premiumUsers.contains(user) ? "Premium" : "Regular";
            System.out.println(user + ": " + status);
        }
    }
}

contains() is O(1) - much faster than ArrayList's O(n) search.

Remove an item

Remove elements from the set.

RemoveItem.java
import java.util.HashSet;
import java.util.Arrays;

public class RemoveItem {
    public static void main(String[] args) {
        HashSet<String> cart = new HashSet<>(Arrays.asList(
            "Laptop", "Mouse", "Keyboard", "Monitor", "Headphones"
        ));
        
        System.out.println("=== Shopping Cart ===");
        System.out.println("Items: " + cart);
        System.out.println("Count: " + cart.size());
        
        // Remove an item
        String toRemove = "Mouse";
        boolean removed = cart.remove(toRemove);
        
        System.out.println("\n=== Removing Item ===");
        System.out.println("Remove '" + toRemove + "': " + removed);
        System.out.println("Cart: " + cart);
        
        // Try to remove non-existent item
        String notInCart = "Tablet";
        removed = cart.remove(notInCart);
        System.out.println("\nRemove '" + notInCart + "': " + removed);
        System.out.println("(Item wasn't in cart, so nothing changed)");
        
        // Remove more items
        cart.remove("Keyboard");
        cart.remove("Monitor");
        System.out.println("\nAfter more removals: " + cart);
        
        // Clear all
        System.out.println("\n=== Clearing Cart ===");
        System.out.println("Before clear: " + cart.size() + " items");
        cart.clear();
        System.out.println("After clear: " + cart.size() + " items");
        System.out.println("Cart is empty: " + cart.isEmpty());
        
        System.out.println("\n=== Final Cart ===");
        System.out.println("Items: " + cart);
        System.out.println("Count: " + cart.size());
    }
}

remove() returns true if element was present, false otherwise.

Combine two sets

Create a union of two sets.

SetUnion.java
import java.util.HashSet;
import java.util.Arrays;

public class SetUnion {
    public static void main(String[] args) {
        // Two teams' skill sets
        HashSet<String> teamA = new HashSet<>(Arrays.asList(
            "Java", "Python", "SQL", "Git"
        ));
        
        HashSet<String> teamB = new HashSet<>(Arrays.asList(
            "JavaScript", "Python", "CSS", "Git"
        ));
        
        System.out.println("=== Team Skills ===");
        System.out.println("Team A: " + teamA);
        System.out.println("Team B: " + teamB);
        
        // Union: All skills combined
        HashSet<String> allSkills = new HashSet<>(teamA);  // Copy first
        allSkills.addAll(teamB);  // Add all from second
        
        System.out.println("\n=== Union (All Skills) ===");
        System.out.println("Combined: " + allSkills);
        System.out.println("(Duplicates automatically removed)");
        
        // Count unique skills
        System.out.println("\n=== Statistics ===");
        System.out.println("Team A skills: " + teamA.size());
        System.out.println("Team B skills: " + teamB.size());
        System.out.println("Unique combined: " + allSkills.size());
        System.out.println("Overlap count: " + 
            (teamA.size() + teamB.size() - allSkills.size()));
        
        // Practical example: Merge user permissions
        System.out.println("\n=== Permission Merge ===");
        
        HashSet<String> basicPerms = new HashSet<>(Arrays.asList(
            "read", "comment"
        ));
        
        HashSet<String> editorPerms = new HashSet<>(Arrays.asList(
            "read", "write", "edit", "comment"
        ));
        
        HashSet<String> adminPerms = new HashSet<>(Arrays.asList(
            "read", "write", "edit", "delete", "manage"
        ));
        
        // Build editor permissions (basic + editor)
        HashSet<String> fullEditorPerms = new HashSet<>(basicPerms);
        fullEditorPerms.addAll(editorPerms);
        System.out.println("Editor has: " + fullEditorPerms);
        
        // Build admin permissions (all combined)
        HashSet<String> fullAdminPerms = new HashSet<>(basicPerms);
        fullAdminPerms.addAll(editorPerms);
        fullAdminPerms.addAll(adminPerms);
        System.out.println("Admin has: " + fullAdminPerms);
    }
}

addAll() adds all elements from another collection. Duplicates ignored.

union Combine sets: `set1.addAll(set2)`. Result has all unique elements.

Remove duplicates from list

Convert a list to set to eliminate duplicates.

RemoveDuplicates.java
import java.util.HashSet;
import java.util.ArrayList;
import java.util.Arrays;

public class RemoveDuplicates {
    public static void main(String[] args) {
        // List with duplicate entries
        ArrayList<String> emails = new ArrayList<>(Arrays.asList(
            "alice@example.com",
            "bob@example.com",
            "alice@example.com",  // duplicate
            "carol@example.com",
            "bob@example.com",    // duplicate
            "david@example.com",
            "alice@example.com"   // duplicate
        ));
        
        System.out.println("=== Email List (with duplicates) ===");
        System.out.println("Emails: " + emails);
        System.out.println("Count: " + emails.size());
        
        // Remove duplicates using HashSet
        HashSet<String> uniqueEmails = new HashSet<>(emails);
        
        System.out.println("\n=== After Removing Duplicates ===");
        System.out.println("Unique: " + uniqueEmails);
        System.out.println("Count: " + uniqueEmails.size());
        System.out.println("Removed " + (emails.size() - uniqueEmails.size()) + " duplicates");
        
        // Convert back to ArrayList if needed
        ArrayList<String> cleanedList = new ArrayList<>(uniqueEmails);
        System.out.println("\nAs ArrayList: " + cleanedList);
        
        // Preserve original order using LinkedHashSet
        System.out.println("\n=== Preserving Order ===");
        java.util.LinkedHashSet<String> orderedUnique = 
            new java.util.LinkedHashSet<>(emails);
        System.out.println("LinkedHashSet: " + orderedUnique);
        System.out.println("(Maintains insertion order!)");
        
        // Count duplicates
        System.out.println("\n=== Duplicate Analysis ===");
        java.util.HashMap<String, Integer> counts = new java.util.HashMap<>();
        for (String email : emails) {
            counts.put(email, counts.getOrDefault(email, 0) + 1);
        }
        
        for (String email : counts.keySet()) {
            int count = counts.get(email);
            if (count > 1) {
                System.out.println(email + " appeared " + count + " times");
            }
        }
    }
}

new HashSet<>(list) creates set from list, removing duplicates.

Exercise: SetOperations.java

Explore intersection, difference, and other set operations