Attic
CollectionsUtilities & Concurrency

Specialized Types & Autoboxing

Memory-optimized EnumSet, EnumMap, BitSet bit-vectors, and avoiding primitive autoboxing overhead

Java provides specialized data structures optimized for enum types and compact bit manipulation, eliminating the memory overhead of general-purpose collections.


EnumSet & EnumMap

When keys or elements belong to a Java enum, specialized implementations outperform HashSet and HashMap:

EnumSpecializations.java
enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }

// EnumSet: Backed internally by a single 64-bit long word (bit-vector)
Set<Day> weekend = EnumSet.of(Day.SAT, Day.SUN);
boolean hasSat = weekend.contains(Day.SAT);

// EnumMap: Backed by a flat compact array indexed directly by enum ordinal
Map<Day, String> plan = new EnumMap<>(Day.class);
plan.put(Day.MON, "DSA");
plan.put(Day.TUE, "Java Collections");

String mondayTask = plan.get(Day.MON);

BitSet

BitSet represents a dynamically resizing vector of boolean bit flags packed into 64-bit long words. It uses a fraction of the memory of boolean[] or List<Boolean>:

BitSetDemo.java
BitSet bits = new BitSet();
bits.set(2);
bits.set(5);

boolean isSet = bits.get(2); // true
bits.clear(2);

int activeCount = bits.cardinality(); // 1 (number of set bits)

Autoboxing & Generic Primitives

Java generics operate strictly on reference types, never raw primitive types:

AutoboxingDemo.java
// Invalid generic declaration:
// List<int> numbers = new ArrayList<>(); ❌ (Compile Error)

// Valid:
List<Integer> numbers = new ArrayList<>();
numbers.add(10);        // Autoboxing: int -> Integer
int val = numbers.get(0);// Auto-unboxing: Integer -> int

Performance Warning in Hot Loops: Storing millions of primitive numbers in generic collections (like PriorityQueue<Integer> or HashMap<Integer, Integer>) incurs continuous object allocations and garbage collection overhead. In numeric-intensive workloads, prefer flat primitive arrays (int[]) or specialized primitive libraries.

On this page