hashmap или hashset? - PullRequest
       18

hashmap или hashset?

5 голосов
/ 17 мая 2011

У меня есть два списка, содержащих

List<MyObj>.   

, и MyObj имеет член "String ID".

Мне нужно время от времени повторять их, а иногда мне нужно найти объекты, похожие на оба.
Мне нужен более быстрый способ, чем списки.так что я могу знать, что я могу использовать hashMap (чем спрашивать содержит (String) при сравнении)

я должен использовать hashmap или hashset?

примечание: в хэш-наборе - мне нужно реализовать мои равенстваи когда я запускаю contains () - я думаю, что это будет медленнее, чем hashmap, где после вставки я вставляю идентификатор строки в ключ.Я прав?

Ответы [ 3 ]

5 голосов
/ 17 мая 2011

примечание: в хэш-наборе - мне нужно реализовать мои равенства, и когда я запускаю функцию contains () - я думаю, что это будет медленнее, чем hashmap, где после вставки я вставляю идентификатор строки в ключ. Я прав?

Не думаю, что вы заметите разницу в производительности. HashSet<E> реализован с использованием HashMap<E, E> под капотом. Таким образом, единственная разница заключается в вызове MyObj.equals() (который предположительно вызывает String.equals()) по сравнению с вызовом String.equals() напрямую. И JIT-компилятор довольно хорошо умеет вставлять вызовы ...

Суть в том, что вы должны (почти) никогда не беспокоиться о микрооптимизации, а сосредоточиться на том, чтобы сделать ваш дизайн простым и последовательным. Если ваша единственная задача состоит в том, чтобы избежать дублирования и проверить на сдерживание, Set является более логичным выбором.

2 голосов
/ 17 мая 2011

Это на самом деле ничего не меняет, потому что когда вы смотрите на исходный код JDK, реализация HashSet в Sun использует экземпляр HashMap для хранения своих значений:

   public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    static final long serialVersionUID = -5024744406713321676L;

    private transient HashMap<E,Object> map;

    // Dummy value to associate with an Object in the backing Map
......

И даже если это не так, то все остальные ответы о том, что это на самом деле не имеет никакого значения, относятся к POV производительности.Единственное реальное отличие состоит в том, что вместо использования equals() и hashCode() реализаций вашего ключевого класса вам нужно написать свою собственную для использования Set - но это может быть так же просто, как делегирование в поле id вашего класса., в случае, если поле id является уникальным идентификатором.

1 голос
/ 17 мая 2011

Ну, используя HashMap, вы будете вынуждены хранить данные следующим образом:

<ID1><MyObject> 
<ID2><MyObject>

Это не лучший способ, потому что у вас уже есть поле идентификатора в MyObject.Используя HashSet, вы сможете хранить только уникальные экземпляры MyObject, а также вам необходимо реализовать hashCode () в MyObject.

Выбор за вами.

...