Young Pups: New Collections APIs for Java 9 by Stuart Marks
59 3 7489
The Collections Framework has been around for a long time. The existing implementations have mostly served us well, but there's still room for improvement. Current work slated for Java 9 includes new collection implementations that add convenience, immutability, and space efficiency. The "API footprint" of the new collections will be extremely small, making them simple to learn and use. The new collections implement the standard collections interfaces, so they will be readily interoperable with code that uses the collections framework. The benefits will be simpler, cleaner code, and reduced memory consumption for many common cases.
By anonymous 2017-09-20
As others pointed out, the
Map contract allows nulls...
[S]ome implementations prohibit
nullkeys and values [...]. Attempting to insert an ineligible key or value throws an unchecked exception, typically
... and the collection factories (not just on maps) make use of that.
nullkeys and values. Attempts to create them with
nullkeys or values result in
null in collections is by now seen as a design error. This has a variety of reasons. A good one is usability, where the most prominent trouble maker is
Map::get. If it returns
null, it is unclear whether the key is missing or the value was
null. Generally speaking, collections that are guaranteed
null free are easier to use. Implementation wise, they also require less special casing, making the code easier to maintain and more performant.
Null elements, keys, and values will be disallowed. (No recently introduced collections have supported nulls.) In addition, prohibiting nulls offers opportunities for a more compact internal representation, faster access, and fewer special cases.
HashMap was already out in the wild when this was slowly discovered, it was too late to change it without breaking existing code but most recent implementations of those interfaces (e.g.
ConcurrentHashMap) do not allow
null anymore and the new collections for the factory methods are no exception.
(I thought another reason was that explicitly using
null values was seen as a likely implementation error but I got that wrong. That was about to duplicate keys, which are illegal as well.)
null had some technical reason but it was also done to improve the robustness of the code using the created collections.