I have a large number of name - value pairs (approx 100k) that I need to store in some sort of cache (say a hash map) where the value is a string with an average of about 30
It somewhat depends upon how you are creating the String.
One possible way is to use TreeSet that uses a Comparator that can compare existing Strings and the source of your new String. Use SortedSet.tailSet and an Iterator to find an existing String. Or alternatively NavigableSet.ceiling/floor or a TreeMap with a similar setup.
I wrote a weblog entry about another technique to cache immutable objects (in particular Strings), but that is more suitable for smaller objects.
String.intern has performance problems.