2017-01-15 10 views
0

При определении составного ключа для хэша-карты, таких как:HashMap составного ключ - остановить создание ключевых объектов каждому вызов решения

public key { 
    enum a; 
    enum b; 
    enum c; 

}

Где равно и хэш-код игнорируется для сравнения этих значений (а ,До нашей эры)?

Существуют ли методы для хранения этого списка ключей, чтобы их можно было найти, запросив три значения, а не каждый раз создавая новый ключ? Например, хранить список ключей? Или попробуйте повторное использование ключа?

Сбор мусора будет большим, поскольку эти ключи будут сгенерированы при каждом вызове метода.

Таким образом, мы можем остановить:

public void update(obj) { 

    Key = new Key(obj.a, obj.b, obj.c) 
    // assume already in there map or add 
    Val val = hashmap.get(key) 
    val.update(obj.newvalues) // do some calculation 

    return val; 
    // key will then be lost after get? So lots of Garbage collection? 
    // if so should it explicitly be set to key = null; 
} 
+2

Вы пытаетесь оптимизировать то, что, вероятно, не должно быть. Java очень быстро создает и собирает непродолжительные объекты, такие как ваши ключи. –

+0

Yup. Сбор мусора достаточно быстрый, это не проблема. –

ответ

1

Там нет простого способа сделать это, как вы ожидали. Это может потребоваться для создания Карты, которая использует три ключа.

Если проблема заключается в том, что программа генерирует новый экземпляр ключа только для запроса, рассмотрите возможность использования Integer в качестве ключа HashMap. Но имейте в виду, что Integer также является экземпляром. HashMap может быть быстрее сравнивать и получать значение. Он может использовать меньше памяти, чем самоопределяемый экземпляр ключа. Но не помогает избежать создания «ключевого» экземпляра (если экземпляр Integer не кэшируется JVM, это еще одна история).

Об использовании Integer в качестве ключа:

Если ключ три перечисления, попробуйте использовать Integer в качестве ключа и сделать математику перевод, убедившись, что разные скомбинировать из трех перечислений могут получить другое целое значение.

Например, предположим, что для перечисления a, enum b и enum c имеется 16 значений. Можно использовать оператор java bye для получения целого числа для представления комбайна. Затем используйте Integer для получения значения из карты.

Надеюсь, это поможет.

+0

-XX: AutoBoxCacheMax = может управлять диапазоном. И да, используя целое число как ключ, не следует избегать создания экземпляра. «Но имейте в виду, что Integer также является экземпляром». как указано в ответе выше. Одно из преимуществ - нет необходимости создавать новый класс «Ключ» для представления ключа. Это позволит избежать множества потенциальных равных, проблем с хэш-кодом. Еще одно преимущество заключается в том, что быстрее использовать Integer для hashcode и equals. – DeepNightTwo