I was having a conversation about strings and various languages a while back, and the topic of string interning came up. Apparently Java and the .NET framework do this auto
The points you listed are all valid to a certain extent. But there are important counter-arguments.
subString() operations are very fast.equals() falls back to a character by character comparison.On balance I'd say it is worth it in most cases and fits well with the VM-managed heap concept. I could imagine some special scenarios where it could be a real pain though.