Prev Next

Java / Java 21 Collection Framework features Interview questions

Explain the internal working of the retrofit strategy used to add Sequenced interfaces without breaking existing implementations?

The JDK team's core constraint was strict backward compatibility: millions of existing classes implement List, Deque, Set, and Map, and none of them could be forced to suddenly implement new methods they know nothing about.

The solution was to insert the new interfaces into the existing hierarchy as new supertypes, with default implementations provided wherever the existing type already had equivalent functionality, so no concrete class needed to change its own source code to comply.

flowchart TD
    A["Collection"] --> B["List"]
    A --> C["Deque"]
    D["SequencedCollection (new)"] --> B
    D --> C
    E["Set"] --> F["SequencedSet (new)"]
    F --> G["LinkedHashSet"]
    E --> H["NavigableSet"]
    F --> H
    H --> I["TreeSet"]

For example, List already had methods equivalent to getFirst() in spirit (get(0)), so the JDK could provide a default method on the interface itself, computed generically in terms of existing List operations, without touching ArrayList or LinkedList's source code at all.

Where a class could implement something more efficiently than the generic default - like TreeSet reusing its existing first()/last() tree operations instead of a generic default - the JDK overrode the default method directly in that class, keeping performance intact while still satisfying the new interface's contract.

The core constraint driving the retrofit strategy was:
Where a class already had an efficient equivalent (like TreeSet's first()/last()), the JDK:

More Related questions...

What is the Sequenced Collections feature introduced in Java 21? What is the SequencedCollection interface? What is the SequencedSet interface? What is the SequencedMap interface? What are the new methods added by the SequencedCollection interface? What is the purpose of the reversed() method in Java 21 collections? Define encounter order in the context of Sequenced Collections? What are getFirst() and getLast() used for? What are addFirst() and addLast() used for? What are removeFirst() and removeLast() used for? List the collection classes that implement SequencedCollection in Java 21? List the collection classes that implement SequencedSet in Java 21? List the collection classes that implement SequencedMap in Java 21? What are firstEntry() and lastEntry() in SequencedMap? What are putFirst() and putLast() in SequencedMap? What are pollFirstEntry() and pollLastEntry()? Describe the sequencedKeySet(), sequencedValues(), and sequencedEntrySet() methods? How do you use getFirst() and getLast() on an ArrayList in Java 21? How do you apply reversed() to a List in Java 21? How do you use putFirst() on a LinkedHashMap? Why was the Sequenced Collections API introduced in Java 21? Why doesn't HashSet implement SequencedSet? Why doesn't HashMap implement SequencedMap? How does SequencedSet differ from a plain LinkedHashSet used before Java 21? How does TreeSet implement SequencedSet given its natural ordering? How does TreeMap support SequencedMap given its comparator-based ordering? What is the difference between SequencedCollection and List? What is the difference between SequencedSet and NavigableSet? What is the difference between List.reversed() and Collections.reverse()? What is the difference between removeFirst()/removeLast() on SequencedCollection and on Deque? When should you choose SequencedMap over a regular Map? When would you choose getFirst() over get(0) on a List? What happens when you call getFirst() on an empty SequencedCollection? What happens when you call reversed() on an immutable List returned by List.of()? What happens when you modify the original collection after calling reversed() on it? How is the encounter order of a LinkedHashSet determined when using SequencedSet methods? How does LinkedHashMap's access-order mode interact with SequencedMap methods? Why doesn't Set.of() return a SequencedSet? Which is better and why: getFirst() or peekFirst() on an ArrayDeque? How can you optimize iteration and access using SequencedCollection methods instead of manual indexing? How can you optimize a producer-consumer pattern using ArrayDeque's sequenced methods? How do you troubleshoot a NoSuchElementException thrown from a sequenced collection method? How do you troubleshoot UnsupportedOperationException when calling addFirst() on an unmodifiable list? Explain the internal working of the reversed() view for a List? Explain the lifecycle of a view returned by SequencedMap.reversed()? Explain the execution flow of putFirst() on a LinkedHashMap? Explain the internal working of the retrofit strategy used to add Sequenced interfaces without breaking existing implementations? Why is Deque now classified as a SequencedCollection? What is the difference between SequencedCollection and the Queue interface? Explain how record patterns in Java 21 complement processing elements of sequenced collections?
Show more question and Answers...


Comments & Discussions