一尘不染

Java 不区分大小写的字符串作为HashMap键

java

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

  • 在初始化期间,我的程序使用用户定义的String创建HashMap。
  • 在处理事件(在我的情况下为网络流量)时,我可能会在其他情况下收到String,但是我应该能够<key, value>忽略HashMap中的来自我的情况而从HashMap 定位。
    我遵循了这种方法
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()));

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

还有其他解决方法吗?


阅读 578

收藏
2020-03-24

共1个答案

一尘不染

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

这就是你真正需要的。

2020-03-24