Различия между HashMap и Hashtable?

Мне нравятся вышеупомянутые решения, но у них есть недостаток, который вам нужно отслеживать диапазоны и средства по всем вашим данным. Это может быть громоздким, если у вас есть несколько наборов данных, которые будут отображаться вместе. Чтобы исправить это, я использовал методы ax.get_ [xyz] lim3d () и поместил все это в отдельную функцию, которую можно вызвать только один раз, прежде чем вы вызовете plt.show (). Вот новая версия:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np

def set_axes_equal(ax):
    '''Make axes of 3D plot have equal scale so that spheres appear as spheres,
    cubes as cubes, etc..  This is one possible solution to Matplotlib's
    ax.set_aspect('equal') and ax.axis('equal') not working for 3D.

    Input
      ax: a matplotlib axis, e.g., as output from plt.gca().
    '''

    x_limits = ax.get_xlim3d()
    y_limits = ax.get_ylim3d()
    z_limits = ax.get_zlim3d()

    x_range = abs(x_limits[1] - x_limits[0])
    x_middle = np.mean(x_limits)
    y_range = abs(y_limits[1] - y_limits[0])
    y_middle = np.mean(y_limits)
    z_range = abs(z_limits[1] - z_limits[0])
    z_middle = np.mean(z_limits)

    # The plot bounding box is a sphere in the sense of the infinity
    # norm, hence I call half the max range the plot radius.
    plot_radius = 0.5*max([x_range, y_range, z_range])

    ax.set_xlim3d([x_middle - plot_radius, x_middle + plot_radius])
    ax.set_ylim3d([y_middle - plot_radius, y_middle + plot_radius])
    ax.set_zlim3d([z_middle - plot_radius, z_middle + plot_radius])

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_aspect('equal')

X = np.random.rand(100)*10+5
Y = np.random.rand(100)*5+2.5
Z = np.random.rand(100)*50+25

scat = ax.scatter(X, Y, Z)

set_axes_equal(ax)
plt.show()
3531
задан Mike B. 6 March 2019 в 12:25
поделиться

9 ответов

Существует несколько различий между [1 116] HashMap и Hashtable в Java:

  1. Hashtable , синхронизировался , тогда как HashMap не. Это делает HashMap лучше для нерезьбовых приложений, поскольку несинхронизируемые Объекты обычно работают лучше, чем синхронизируемые.

  2. Hashtable не позволяет null ключи или значения. HashMap позволяет один null ключ и любое количество null значения.

  3. Один из подклассов HashMap LinkedHashMap , поэтому если Вы хотели бы предсказуемый итеративный порядок (который является порядком вставки по умолчанию), Вы могли легко выгрузить HashMap для LinkedHashMap. Это не было бы столь же легко, если бы Вы использовали Hashtable.

, Так как синхронизация не является проблемой для Вас, я рекомендовал бы HashMap. Если синхронизация становится проблемой, можно также посмотреть ConcurrentHashMap .

3582
ответ дан Josh Brown 6 March 2019 в 12:25
поделиться

Для потоковых приложений можно часто сходить с рук ConcurrentHashMap-, зависит от требований к производительности.

17
ответ дан Tim Howland 6 March 2019 в 12:25
поделиться
  • 1
    +1, потому что это отвечает на заголовок вопроса – NReilingh 6 May 2013 в 00:23

На основе информации здесь , я рекомендовал бы идти с HashMap. Я думаю, что самое большое преимущество состоит в том, что Java будет препятствовать тому, чтобы Вы изменили его, в то время как Вы выполняете итерации по нему, если Вы не делаете это через итератор.

23
ответ дан pkaeding 6 March 2019 в 12:25
поделиться

Hashtable подобно HashMap и имеет подобный интерфейс. Рекомендуется использовать HashMap, если Вы не требуете поддержки унаследованных приложений, или Вам нужна синхронизация, как эти Hashtables, методы синхронизируются. Таким образом в Вашем случае, поскольку Вы не многопоточность, HashMaps, Ваш лучший выбор.

47
ответ дан nbro 6 March 2019 в 12:25
поделиться
  • 1
    постинкремент имеет приоритет по преинкременту; Вы хотите сказать тот i++ isn' t lvalue, не ++i. (Хотя это doesn' t работают так или иначе), – Stephen Canon 2 October 2009 в 18:32

Хеш-таблица синхронизируется, тогда как HashMap не. Это делает Хеш-таблицу медленнее, чем Hashmap.

Для нерезьбовых приложений, используйте HashMap, так как они - иначе то же с точки зрения функциональности.

25
ответ дан izb 6 March 2019 в 12:25
поделиться

В дополнение к тому, что сказанный izb, HashMap позволяет нулевым значениям, тогда как эти Hashtable не делает.

Также примечание, которое Hashtable расширяется Dictionary класс, который как состояние Javadocs, является устаревшим и было заменено эти Map интерфейс.

62
ответ дан matt b 6 March 2019 в 12:25
поделиться
  • 1
    Вы могли разъяснить это немного? Я пытался скомпилировать " ++ я = 4; " и получите ошибку при высказывании, что lvalue требуется слева операнда. Возможно, мое недоразумение находится в определении lvalue? Я понял его, чтобы быть чем-то, чему можно было присвоить. – nall 2 October 2009 в 18:56

HashMap: реализация эти Map интерфейс, который использует хэш-коды для индексации массива. Hashtable: Привет, 1998 названный. Они хотят свой API наборов назад.

Серьезно, хотя, Вы более обеспечены избегающий Hashtable в целом. Для однопоточных приложений Вам не нужны дополнительные издержки синхронизации. Для очень параллельных приложений параноидальная синхронизация могла бы привести к исчерпанию ресурсов, мертвым блокировкам или ненужным паузам сборки "мусора". Как Tim Howland, на которого указывают, Вы могли бы использовать ConcurrentHashMap вместо этого.

122
ответ дан Apocalisp 6 March 2019 в 12:25
поделиться

Обратите внимание на то, что много ответов указывает, что Хеш-таблица синхронизируется. На практике это покупает Вас очень мало. синхронизация находится на средстве доступа / мутаторные методы остановят два добавления потоков или удаление из карты одновременно, но в реальном мире Вам часто будет нужна дополнительная синхронизация.

А очень общая идиома должна "проверить тогда помещенный" — т.е. искать запись в эти Map и добавить его, если это уже не существует. Это ни в коем случае не атомарная операция, используете ли Вы Hashtable или HashMap.

эквивалентно синхронизируемый HashMap может быть получен:

Collections.synchronizedMap(myMap);

, Но правильно реализовать эту логику Вам нужно дополнительная синхронизация из формы:

synchronized(myMap) {
    if (!myMap.containsKey("tomato"))
        myMap.put("tomato", "red");
}

Даже итерация по Hashtable записи (или HashMap полученный Collections.synchronizedMap) не ориентированы на многопотоковое исполнение, если Вы также не охраняете Map от того, чтобы быть измененным до дополнительной синхронизации.

Реализации ConcurrentMap интерфейс (например ConcurrentHashMap ) решают часть этого включением ориентированная на многопотоковое исполнение check-then-act семантика , такая как:

ConcurrentMap.putIfAbsent(key, value);
639
ответ дан Mike B. 6 March 2019 в 12:25
поделиться

Хеш-таблица считается устаревшим кодом. В Hashtable нет ничего, что нельзя было бы сделать с помощью HashMap или производных от HashMap , поэтому для нового кода я не вижу никаких оснований для возврата по Hashtable .

346
ответ дан 17 December 2019 в 16:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: