9. How do you work with Java collections like List, Set, and Map?

Basic

9. How do you work with Java collections like List, Set, and Map?

Overview

The Java Collections Framework (JCF) is a set of classes and interfaces that implement commonly reusable collection data structures such as Lists, Sets, and Maps. Understanding how to work with these collections is fundamental in Java programming, as it allows developers to store, retrieve, manipulate, and communicate aggregate data effectively. Their importance cannot be overstated, as they touch nearly every aspect of programming in Java, from data processing to concurrent programming.

Key Concepts

  1. List Interface: Ordered collections that can contain duplicate elements. Implementations include ArrayList, LinkedList, etc.
  2. Set Interface: Collections that cannot contain duplicate elements. Common implementations include HashSet, LinkedHashSet, and TreeSet.
  3. Map Interface: Objects that map keys to values, where each key can map to at most one value. Examples include HashMap, LinkedHashMap, and TreeMap.

Common Interview Questions

Basic Level

  1. What are the differences between List, Set, and Map in Java?
  2. How do you iterate over a List in Java?

Intermediate Level

  1. What are the differences between HashSet, LinkedHashSet, and TreeSet?

Advanced Level

  1. How would you design a cache system using Java Collections?

Detailed Answers

1. What are the differences between List, Set, and Map in Java?

Answer: In Java, List, Set, and Map are interfaces in the Collections Framework, each serving different purposes:
- List is an ordered collection that can contain duplicate elements. It allows positional access and insertion of elements.
- Set is a collection that cannot contain duplicate elements. It models the mathematical set abstraction.
- Map is an object that maps keys to values, with each key mapping to a unique value. A map cannot contain duplicate keys, and each key can map to at most one value.

Key Points:
- Lists allow duplicates and are ordered.
- Sets do not allow duplicates and can be ordered or unordered depending on the implementation.
- Maps hold key-value pairs where keys are unique.

Example:

// List example
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Java"); // This is valid, list can contain duplicates

// Set example
Set<String> set = new HashSet<>();
set.add("Java");
set.add("Java"); // The second "Java" is ignored, sets do not allow duplicates

// Map example
Map<Integer, String> map = new HashMap<>();
map.put(1, "Java");
map.put(2, "Python");
map.put(1, "C#"); // The value "Java" is replaced by "C#" for key 1

2. How do you iterate over a List in Java?

Answer: In Java, you can iterate over a List in several ways, including using a basic for-loop, enhanced for-loop, iterator, and Java 8's forEach method with lambda expressions.

Key Points:
- The enhanced for-loop is the simplest way to iterate over all elements.
- An Iterator allows the removal of elements during iteration.
- Java 8's forEach method provides a modern, functional programming approach to iteration.

Example:

List<String> list = Arrays.asList("Java", "Python", "C#");

// Enhanced for-loop
for (String element : list) {
    System.out.println(element);
}

// Iterator
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

// Java 8 forEach with lambda
list.forEach(element -> System.out.println(element));

3. What are the differences between HashSet, LinkedHashSet, and TreeSet?

Answer: These are all implementations of the Set interface, differing in their ordering and performance characteristics:
- HashSet is the fastest set implementation; it stores its elements in a hash table, meaning it does not guarantee any order of its elements.
- LinkedHashSet is a slightly slower implementation than HashSet that maintains a doubly-linked list across all elements, thus preserving the insertion order.
- TreeSet implements the NavigableSet interface and stores its elements in a red-black tree, maintaining them in ascending order. It offers several methods to deal with ordered sets.

Key Points:
- HashSet offers the best performance but does not guarantee any order.
- LinkedHashSet maintains insertion order.
- TreeSet maintains a natural ordering and provides additional functionalities for ordered collections.

Example:

Set<String> hashSet = new HashSet<>();
hashSet.add("C#");
hashSet.add("Java");

Set<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("C#");
linkedHashSet.add("Java"); // Maintains insertion order

Set<String> treeSet = new TreeSet<>();
treeSet.add("C#");
treeSet.add("Java"); // Sorted in natural order

4. How would you design a cache system using Java Collections?

Answer: A simple cache system can be designed using HashMap for storing cache data and LinkedList for maintaining the order of elements for eviction policies like Least Recently Used (LRU).

Key Points:
- Use HashMap for fast lookups by key.
- Use LinkedList or another ordered collection to track access order.
- Implement eviction policies based on the collection that tracks order (e.g., remove the first element for LRU).

Example:

class SimpleCache<K, V> {
    private final Map<K, V> cache = new HashMap<>();
    private final LinkedList<K> order = new LinkedList<>();
    private final int capacity;

    public SimpleCache(int capacity) {
        this.capacity = capacity;
    }

    public V get(K key) {
        if (!cache.containsKey(key)) {
            return null;
        }
        order.remove(key);
        order.addLast(key);
        return cache.get(key);
    }

    public void put(K key, V value) {
        if (cache.size() >= capacity) {
            K oldestKey = order.removeFirst();
            cache.remove(oldestKey);
        }
        cache.put(key, value);
        order.addLast(key);
    }
}

This simple cache system stores key-value pairs in a HashMap for fast access and maintains access order with a LinkedList. When the cache exceeds its capacity, the oldest element (the first in the list) is removed to make space for new entries.