I am currently discussing memory-compact reimplementations of HashMap
and HashSet
with, among others, Doug Lea. This particular question hasn't come up, but here's my first thoughts on the question...
- Chained hash tables degrade reasonably gracefully. Whether it's higher load factors or lots of hash collisions, chaining doesn't degrade nearly as quickly as open addressing can.
- As you've said,
remove
is...not a pleasant operation on open-addressed tables. As a general rule, remove
is the least common operation on hash tables, but there are applications for which it's more common, and bad performance would be noticed.
- I also suspect -- though I don't have much data -- that implementing a "linked" open-addressed hash table would be noticeably more difficult.
LinkedHashMap
is written as a subclass of HashMap
, and borrows most of the implementation details; it's somewhat easier to implement the linked list of entries when the entries are discrete objects -- and at that point, you're already most of the way to a chained implementation.
- Nothing in the spec ties them to this implementation -- they're always free to mess around with it later.
- The JDK collections libraries...don't make memory consumption an especially high priority. Memory is cheap. (You may or may not agree with this, but it's definitely a noticeable trend.)