Case insensitive string as HashMap key

r.s picture r.s · Nov 23, 2011 · Viewed 137.9k times · Source

I would like to use case insensitive string as a HashMap key for the following reasons.

  • During initialization, my program creates HashMap with user defined String
  • While processing an event (network traffic in my case), I might received String in a different case but I should be able to locate the <key, value> from HashMap ignoring the case I received from traffic.

I've followed this approach

CaseInsensitiveString.java

    public final class CaseInsensitiveString {
            private String s;

            public CaseInsensitiveString(String s) {
                            if (s == null)
                            throw new NullPointerException();
                            this.s = s;
            }

            public boolean equals(Object o) {
                            return o instanceof CaseInsensitiveString &&
                            ((CaseInsensitiveString)o).s.equalsIgnoreCase(s);
            }

            private volatile int hashCode = 0;

            public int hashCode() {
                            if (hashCode == 0)
                            hashCode = s.toUpperCase().hashCode();

                            return hashCode;
            }

            public String toString() {
                            return s;
            }
    }

LookupCode.java

    node = nodeMap.get(new CaseInsensitiveString(stringFromEvent.toString()));

Because of this, I'm creating a new object of CaseInsensitiveString for every event. So, it might hit performance.

Is there any other way to solve this issue?

Answer

Roel Spilker picture Roel Spilker · Mar 11, 2014
Map<String, String> nodeMap = 
    new TreeMap<>(String.CASE_INSENSITIVE_ORDER);

That's really all you need.