В дополнение к ценным ответы до сих пор, я хотел бы добавить некоторые другие методы, чтобы рассмотреть следующие вопросы:
3a):
public int hashCode() {
return Objects.hashCode(name);
}
Не много плюсов/минусов с точки зрения но немного более кратким.
4.) Вы должны либо предоставить дополнительную информацию о классе, о котором вы говорите, либо пересмотреть свой дизайн. Но использование класса в качестве ключа хэш-карты, когда только свойство этого класса является String
, то вы можете может также иметь возможность напрямую использовать строку. Так вариант 4:
// Changing this...
Map<Key, Value> map;
map.put(key, value);
Value value = map.get(key);
// ... to this:
Map<String, Value> map;
map.put(key.getName(), value);
Value value = map.get(key.getName());
(И если это не представляется возможным, так как «имя» из Key
может измениться после того, как она была создана, вы в большей неприятности, так или иначе - смотрите следующий пункт)
5.) Возможно, вы можете прекомпретировать хэш-код.На самом деле, это также делается в java.lang.String
классе:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
...
/** Cache the hash code for the string */
private int hash; // Default to 0
Но, конечно, это имеет смысл только для неизменяемых классов. Вы должны знать, что использование классов mutable в качестве ключей Map
является «опасным» и может привести к ошибкам согласования и должно выполняться только в том случае, если вы абсолютно уверены, что экземпляры, которые используются в качестве ключей, t изменение.
Так если вы хотите использовать класс в качестве ключей, и, возможно, ваш класс имеет даже больше полей, чем просто одну, то вы могли бы хранить хэш-код в качестве поля:
class Key
{
private final String name;
... // Other fields...
private final int hashCode;
Key(String name, ...)
{
this.name = name;
... // Other fields
// Pre-compute and store the hash code:
this.hashCode = computeHashCode();
}
private int computeHashCode()
{
int result = 31;
result = 31 * result + Objects.hashCode(name);
result = 31 * result + ... // Other fields
return result;
}
}
в первый только что вернулся ... 5 .. для чего это выгодно? – Minzkraut
Сторона примечания: 'name.length' не _a бит лучше_ это _a бит менее ужасный_: P – BackSlash
почему бы не автогенерировать его? –