【问题标题】:Why do we need datastructures other than HashMap为什么我们需要HashMap以外的数据结构
【发布时间】:2017-01-21 08:47:31
【问题描述】:

Map(或 HashMap)在插入、删除和检索时花费恒定的时间。虽然到目前为止我所知道的所有其他数据结构都不会花费恒定的时间,并且它们用于上述操作的时间取决于输入的大小。

那么,为什么我们还需要所有其他数据结构呢? HashMap 不是通用数据结构吗?

【问题讨论】:

  • Isn't HashMap is universal data structure? - 不,它不保留元素顺序,不允许重复,也不允许您按索引和...访问元素。
  • 尝试学习 Go,其中地图基本上是唯一的内置数据结构(除了数组)。你可以只用地图来做事;但是用地图实现集合的新颖性再次很快就消失了。
  • 您从哪里得知插入、删除和检索需要固定时间? This implementation provides constant-time performance for the basic operations (get and put), assuming the hash function disperses the elements properly among the buckets. 并且您无法提供哈希函数,但使用了该类型的内置函数……
  • 尝试在哈希图中存储范围。或者找到最接近特定值的项目。所以你可能有键 5 和 8,如果有人搜索键 7,你会返回 8,因为它是最接近的。 Map 和 HashMap 非常适合通过精确值查找事物,但这只是程序访问事物的一小部分。有很多事情是 HashMap 或类似结构无法完成或无法有效完成的。

标签: java data-structures collections stl hashmap


【解决方案1】:

Map 性能不是免费的,代价是内存和复杂性。

其他数据结构适用于您不关心性能以及不需要访问集合中的一个元素的所有情况。

例如,如果您有一个给定的元素列表字符串,而您在代码中的唯一用途就是准确地打印出这个元素列表,那么更好的选择是使用字符串数组。

另一个例子,可能是元素的顺序。如果您关心元素的顺序,那么 Map 不是您应该使用的数据结构,因为无法保证顺序,因此您必须在每次需要时进行排序。

这只是两个示例,每个存在的数据结构还有很多其他示例。

【讨论】:

  • “你不关心性能的地方”当你确实关心性能时,你会使用不同的数据结构。例如,您可以用Map<Integer, Value> 模拟List<Value>(就像JS 对数组所做的那样)。但是性能会比使用ArrayList差很多。
  • @AndyTurner esp 如果您希望索引在插入或删除时更改。
  • @AndyTurner 我的意思是在获得价值方面的表现,正如 OP 所要求的那样。
【解决方案2】:

HashMap 什么时候不应该使用

  • 一个普通的 Java 对象就可以完成这项工作。 Java 对象类型安全且更高效。
  • 当您需要排序集合时。
  • 当键是枚举时。
  • 当索引是从 0 开始的 int 时。
  • 什么时候密钥可能会改变。
  • 当您想要并发访问时。
  • 当您在收藏中需要任何排序或优先级时。
  • 当您需要一组东西时(即没有值)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2011-12-13
    • 2011-04-22
    • 2011-04-05
    • 2011-02-04
    • 1970-01-01
    • 2015-10-23
    相关资源
    最近更新 更多