I like thinking of ArrayList as just an optimized HashMap, Lua-style, and HashMap.replaceAll also does not increment modCount, supporting our "structural modification" position.
The thing that bothers me most about the status quo is the *inconsistency* - between root list and subList, between default implementation and concrete implementation, and between ArrayList and HashMap. And there seems to be no reason for users to expect any such inconsistency.