To my knowledge, there are no built-in data structures that are mutable and that use the same access functions.
There are built-in data structures called transients that are mutable, and use almost the same hash functions. Read the docs on transient, persistent!, conj!, etc. Transient data structures are restricted to be modified from a single thread, to avoid concurrency issues. Any attempt to modify a transient data structure from multiple threads is detected as an error at run time.
Note that even the immutable data structures do not make a copy of the entire data structure. If the data structure is large, most of the data is shared between the old and new data structure. See the tree example on this Wikipedia page for a small example, but I know I've seen elsewhere pictures of examples closer to Clojure's persistent data structure implementations:
http://en.wikipedia.org/wiki/Persistent_data_structureYour scenario: "What if I have a hash-map that needs to handle concurrent changes to the data structure, but never needs to have concurrent changes to a given piece of data (i.e. a key/value pair)."
My question: How do you know, in advance, that it doesn't need to handle such concurrent changes?
If it is because you have multiple threads that will always modify disjoint subsets of the keys, then you could have a separate hash-map for each of those sets of keys (perhaps a transient), and modify each one from its own thread. Readers of the hash map would then have to search for keys in multiple tables, or if it was easy to calculate in advance which table the key must be in, then only one table lookup is sufficient.
Andy