Я использовал Подвижный и на работе и в моих собственных персональных проектах, и я действительно доволен ею. Преимущества, которые я вижу:
, Конечно, как любая новая система, во время перехода была некоторая боль. Необходимо думать об управлении версиями по-другому, чем Вы сделали, когда Вы использовали SVN, но в целом я думаю, что это в значительной степени стоит того.
Используйте Apache Commons HashcodeBuilder:
public int hashCode() {
new HashCodeBuilder(17, 37).
append(myString).
append(myInt);
}
Ссылка здесь: http://commons.apache.org/lang/api-2.3/org/apache/commons/lang/builder/HashCodeBuilder.html
А здесь:
http://www.koders.com /java/fidCE4E86F23847AE93909CE105394B668DDB0F491A.aspx
Метод хэш-кода - это то, что потенциально может вызываться много раз, и поэтому стоит оптимизировать. Если расчет сложен, рассмотрите возможность запоминания хеш-значения. Кроме того, избегайте действий, требующих большего количества вычислений, чем необходимо. (Например, решение StringBuilder тратит большую часть своего времени на создание временной строки.)
Еще я хочу отметить, что качество хэша важно. Вы хотите избежать любого алгоритма хэш-кода, который отображает множество общих ключей. Если это произойдет, поиск в хеш-таблице может больше не соответствовать O (1). (В худшем случае это будет O (N) ... т.е. эквивалент линейного поиска!). Вот пример плохой хэш-функции:
int hashcode() {
int hash = 1;
for (int val : this.values) {
hash = hash * value;
}
return hash;
}
Рассмотрим, что произойдет, если элемент this.
Или, если вы не хотите добавлять другую библиотеку, сделайте что-нибудь вроде следующего:
public int hashCode() {
StringBuilder builder = new StringBuilder();
builder.append(myString);
builder.append(myInteger);
return builder.toString().hashCode();
}
Eclipse всегда выполняет примерно одну и ту же функцию хеширования, вот пример для класса с полями in и String
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + this.interger;
result = prime * result + ((this.string == null) ? 0 : this.string.hashCode());
return result;
}
Они всегда выбирают 31 в качестве простого числа, а затем умножают на встроенный хэш функции или значение, если это примитив. Что-то подобное не составит труда создать в качестве метода.
public int hashCode(Object ... things) {
final int prime = 31;
int result = 1;
for(Object thing : things) {
result = prime * result + thing.hashCode();
}
return result;
}
В дополнение к последним изменениям, если скорость извлечения важнее, чем проблемы с хранением, вы можете предварительно -вычислить и сохранить хэш-код при создании вашего класса StringInt
. Это безопасно, поскольку вы пометили поля String
и int
как final
, а также учитывая, что String
является неизменным.
]Также, вы можете оптимизировать свой метод равно
, проверив, что сравниваемый объект == this
, прежде чем выполнять полное сравнение. Я бы также порекомендовал выполнить более дешевое сравнение на основе int перед сравнением строковых полей.
Еще одно последнее предложение: вы можете изменить свой метод valueOf (String, int)
, чтобы создать StringInt
или вернуть ранее созданный экземпляр, если он уже существует с такими же значениями String
и int. Это делает строительство более дорогостоящим, но сравнение очень дешевым, поскольку вы можете сравнивать StringInt
, используя "==", зная, что никакие два StringInt
s никогда не будут созданы с одинаковыми Строка
и int
значение.
Еще одно последнее предложение: вы можете изменить свой метод valueOf (String, int)
, чтобы создать StringInt
или вернуть ранее созданный экземпляр, если он уже существует с такими же значениями String
и int. Это делает строительство более дорогостоящим, но сравнение очень дешевым, поскольку вы можете сравнивать StringInt
, используя "==", зная, что никакие два StringInt
s никогда не будут созданы с одинаковыми Строка
и int
значение.
Еще одно последнее предложение: вы можете изменить свой метод valueOf (String, int)
, чтобы создать StringInt
или вернуть ранее созданный экземпляр, если он уже существует с такими же значениями String
и int. Это делает строительство более дорогостоящим, но сравнение очень дешевым, поскольку вы можете сравнивать StringInt
, используя «==», зная, что никакие два StringInt
не будут созданы с одинаковыми Строка
и int
значение.
StringInt
, либо вернуть ранее созданный экземпляр, если он уже существует с такими же значениями String
и int. Это делает строительство более дорогостоящим, но сравнение очень дешевым, поскольку вы можете сравнивать StringInt
, используя «==», зная, что никакие два StringInt
не будут созданы с одинаковыми Строка
и int
значение. int) , чтобы либо создать StringInt
, либо вернуть ранее созданный экземпляр, если он уже существует с такими же значениями String
и int. Это делает строительство более дорогостоящим, но сравнение очень дешевым, поскольку вы можете сравнивать StringInt
, используя «==», зная, что никакие два StringInt
не будут созданы с одинаковыми Строка
и int
значение.