Хотелось бы раз и навсегда выяснить, что лучше и целесообразнее использовать в виде ключа в хэш-коллекциях String
или UUID
?
Map<String, Value> map = ...
Map<UUID, Value> map = ...
Можно посмотреть на реализации функций hashCode
в классах String
и UUID
.
Для String:
/**
* Returns a hash code for this string. The hash code for a
* <code>String</code> object is computed as
* <blockquote><pre>
* s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
* </pre></blockquote>
* using <code>int</code> arithmetic, where <code>s[i]</code> is the
* <i>i</i>th character of the string, <code>n</code> is the length of
* the string, and <code>^</code> indicates exponentiation.
* (The hash value of the empty string is zero.)
*
* @return a hash code value for this object.
*/
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;
}
Для UUID:
/**
* Returns a hash code for this {@code UUID}.
*
* @return A hash code value for this {@code UUID}
*/
public int hashCode() {
long hilo = mostSigBits ^ leastSigBits;
return ((int)(hilo >> 32)) ^ (int) hilo;
}
Можно видеть, что для UUID
вычисления хэша происходит очень быстро, с помощью битовых операций над полями.
Для String
хэш вычисляется путём прохода по каждому символу строки. Но это происходит для каждого объекта только один раз. После того, как хэш уже был однажды вычислен, он просто хранится в поле класса и возвращается, если он нужен.
При этом нужно отметить разницу в подходах хранения данных в этих классах. В классе String
строка хранится как массив значений char
. А в классе UUID
в двух полях типа long
. Вследствие этого, объект типа String
, хранящий UUID, будет занимать куда больше места, чем сам UUID. В строке будет около 36 символов, т.е. 72 байта, плюс расходы на хранение, например, длины строки. В то время как в UUID
это будет всего 16 байт.
Таким образом, если вы хотите использовать не очень много ключей, но при этом обращение по ним может быть частым, можно использовать String
. В остальных случаях, особенно, если вам нужно хранить очень много разных ключей, однозначно лучше использовать UUID
.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Разбираюсь с технологией protocol buffer formatЕсть файл
У меня есть объект URI который содержит в себе адрес загружаемого изображенияМне надо получить изображение и изменить его размер