# A mutable argument is an entry you cannot find again first call : byList([java]) -> tags=[java] cache "mutable": key [java] [ArrayList] -> tags=[java] the caller mutates the same list it passed in: [java, spring] second call : byList([java, spring]) -> tags=[java, spring] cache "mutable": key [java, spring] [ArrayList] -> tags=[java] key [java, spring] [ArrayList] -> tags=[java, spring] Two entries, and their keys now print identically - because they are the same object. The caller mutated the list it had already handed over as a key, so the first entry sits in the map under a hashCode the map no longer agrees with. Nothing will find it again and nothing will evict it: a leak with a completely ordinary-looking cause.