public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
因此,如果你想使用 Hashtable/HashMap 作为字符串的键,并且像“ Some Key”、“ SOMEKEY”和“ some key”这样的键被看作是相等的,那么你将不得不把你的字符串包装在另一个类中(你不能扩展 String,因为它是最终类)。例如:
private static class HashWrap {
private final String value;
private final int hash;
public String get() {
return value;
}
private HashWrap(String value) {
this.value = value;
String lc = value.toLowerCase();
this.hash = lc.hashCode();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o instanceof HashWrap) {
HashWrap that = (HashWrap) o;
return value.equalsIgnoreCase(that.value);
} else {
return false;
}
}
@Override
public int hashCode() {
return this.hash;
}
}
然后像这样使用它:
HashMap<HashWrap, Object> map = new HashMap<HashWrap, Object>();
然而,值得注意的是,这种方法既不执行完整的大小写折叠,也不执行分解,因此 cannot perform caseless matching as specified in the Unicode standard.实际上,JDK API 不提供对大小写折叠字符数据信息的访问,所以这项工作最好委托给一个经过尝试和测试的第三方库。