Enum Collections if Possible
EnumMap over HashMap
If working with Enum's, and you need to store specific mappings, use EnumMap, as it gives a number of benefits
over HashMap.
Under the Hood
EnumMap is at least, and likely to be more, performant than a standard HashMap due to the fact that:
- A quicker hash can be calculated due to the range of keys being known at compile time
- They are represented internally as arrays so operations always complete in constant amortized time - O(1)
- There is no opportunity for collisions within keys as each option is indexed by the enums values ordinal (index position in the declaration)
Instantiation
enum Status {
ACTIVE, DISABLED, UNRESPONSIVE
}
void enumTest() {
EnumMap<Status, String> statusMap = new EnumMap<>(Status.class);
statusMap.put(Status.ACTIVE, "www.active-route.com");
statusMap.put(Status.DISABLED, "www.disabled-route.com");
statusMap.put(Status.UNRESPONSIVE, "www.404.com");
}
Ordering
As EnumMap is an ordered map, the iteration order will be as defined by the order of the enum declarations.
for (Status status : statusMap.keySet()) {
System.out.println(status); // Prints ACTIVE, DISABLED, UNRESPONSIVE - in that order
}
EnumSet over HashSet
EnumSet's are a specialised implementation of the Set interface, and provides an extremely compact and efficient
representation of the internal date. Similarly to EnumMap, it is at least as, and likely to be more, performant than
a HashSet.
Represented internally as a bit vector/array, all operations (even bulk) execute in constant amortised time.
Under the Hood
If the enum selected for the EnumSet contains less than 65 values, a RegularEnumSet is initialised, which uses a
long (64 bits) for its bit-vector representation. Otherwise, a JumboEnumSet is created, utilising a long array
.
Instantiation
EnumSet<Status> statusMap = EnumSet.of(ACTIVE, DISABLED);
Ordering
Similarly to EnumMap, the order will be as defined by the order of the enum declarations.
for (Status status : EnumSet.of(Status.class).VALUES) {
System.out.println(status); // Prints ACTIVE, DISABLED, UNRESPONSIVE - in that order
}