Что быстрей String или UUID?

143
19 января 2020, 13:20

Хотелось бы раз и навсегда выяснить, что лучше и целесообразнее использовать в виде ключа в хэш-коллекциях String или UUID?

Map<String, Value> map = ...
Map<UUID, Value> map = ...
Answer 1

Можно посмотреть на реализации функций 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.

READ ALSO
Технология protocol buffer format в Java

Технология protocol buffer format в Java

Разбираюсь с технологией protocol buffer formatЕсть файл

132
Java JUnit публичные и приватные методы

Java JUnit публичные и приватные методы

У меня есть два метода

142
Как создать объект Bitmap с BitmapFactory.Options имея обьект URI?

Как создать объект Bitmap с BitmapFactory.Options имея обьект URI?

У меня есть объект URI который содержит в себе адрес загружаемого изображенияМне надо получить изображение и изменить его размер

152
Бесплатный API штрафов гибдд

Бесплатный API штрафов гибдд

Откуда берут информацию о штрафах всякие левые сервисы?

138