不区分大小写的字符串作为哈希映射键

2022-08-31 06:16:14

出于以下原因,我想使用不区分大小写的字符串作为HashMap键。

  • 在初始化期间,我的程序使用用户定义的字符串创建哈希映射
  • 在处理事件(在我的情况下是网络流量)时,我可能会在其他情况下收到String,但我应该能够找到来自HashMap的,忽略我从流量中收到的情况。<key, value>

我遵循了这种方法

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;
            }
    }

查找代码.java

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

因此,我将为每个事件创建一个新对象 CaseInsensitiveString。因此,它可能会影响性能。

有没有其他方法可以解决这个问题?


答案 1
Map<String, String> nodeMap = 
    new TreeMap<>(String.CASE_INSENSITIVE_ORDER);

这就是您真正需要的。


答案 2

正如Guido García在这里的答案中所建议的那样:

import java.util.HashMap;

public class CaseInsensitiveMap extends HashMap<String, String> {

    @Override
    public String put(String key, String value) {
       return super.put(key.toLowerCase(), value);
    }

    // not @Override because that would require the key parameter to be of type Object
    public String get(String key) {
       return super.get(key.toLowerCase());
    }
}

https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/CaseInsensitiveMap.html