【问题标题】:ArrayMap versus HashMap [closed]ArrayMap 与 HashMap [关闭]
【发布时间】:2013-10-26 19:26:24
【问题描述】:

org.apache.myfaces.trinidad.util.ArrayMapjava.util.HashMap 的主要区别是什么?

ArrayMap 是线程安全的吗?

在文档中提到 Array 在性能方面是最好的。

我不想使用 hashmap 或并发 hashmap。我想试试下面的其他。如果我考虑线程安全和性能,哪一个是最佳选择?

ArrayMap<String,String> var= new ArrayMap<String,String>(); 

【问题讨论】:

  • 什么是 ArrayMap?提示:它不是 Java 标准库的一部分
  • 你上面的代码不会编译,没有ArrayMap这个东西你是说ArrayList吗?
  • @PradeepSimha - 有一个东西叫ArrayMap。只是它不是 Java SDK 的一部分。我在 Google 的朋友提供这门课程。
  • @R.J 谢谢。我没有意识到这一点:)
  • 其实很多人都提供了。 Oracle ArrayMapApaches MyFaces ArrayMap。 OP需要提及,问题中提到的是哪一个?!

标签: java multithreading collections hashmap


【解决方案1】:

HashMap 在下面使用一个数组,因此它永远不会比正确使用数组更快。

Random.nextInt() 比您正在测试的要慢很多倍,即使使用数组来测试数组也会使您的结果产生偏差。您的数组如此慢的原因是由于等于比较,而不是数组访问本身。

ArrayList 实现List 接口,HashMap 实现Map 接口。所以真正的问题是你什么时候想使用List,什么时候想使用Map。这就是 Java API 文档大有帮助的地方。

列表:

有序集合(也称为序列)。此界面的用户可以精确控制每个元素在列表中的插入位置。用户可以通过整数索引(列表中的位置)访问元素,并在列表中搜索元素。

地图:

将键映射到值的对象。地图不能包含重复的键;每个键最多可以映射到一个值。

列表接口(ArrayList) 是一个有序的对象集合,您可以使用索引访问这些对象,很像数组(在ArrayList 的情况下,顾名思义,它只是背景中的一个数组。当您想要按排序顺序(添加顺序,或者实际上是您在添加对象时指定的列表中的位置)时,您可以使用ArrayList

HashMap 实现使用键对象的哈希值来定位它的存储位置,因此不再保证值的顺序。然而,Java API 中还有其他类可以提供此功能,例如LinkedHashMap,除了使用哈希表来存储键/值对之外,还按照添加的顺序维护键的列表(LinkedList),因此您始终可以按照它们的顺序再次访问这些项目添加(如果需要)。

何时使用数组?

永远不要低估数组。大多数时候,当我们必须使用对象列表时,我们倾向于考虑使用向量或列表。但是,如果集合的大小已知并且不会改变,则可以将数组视为潜在的数据结构。访问数组元素比访问向量或列表更快。这很明显,因为您只需要一个索引。没有额外的 get 方法调用的开销。

有时,最好结合使用上述方法。例如,您可以使用 HashMap 的 ArrayList 来满足特定需求。

【讨论】:

  • 那很酷..我知道这一点...但是当谈到线程安全时,这将是最好的..?
  • Hashmap 不是线程安全的,而 arraylist 是。任何多线程可以修改的东西都应该是线程安全的。因此,如果许多线程可以修改 Lists 中的 Map、Lists 和 Objects,那么所有这些都应该具有线程安全防护。如果只有 Map 和 List 实例可以并发修改,那么只有它们需要线程安全。如果多个线程可以读取所有内容,但不能修改,那么您不需要任何线程安全。
  • 好的,但这并不能将ArrayMapHashMap 进行比较,这是问题所在。 ArrayMap 在这里:developer.android.com/reference/android/support/v4/util/…
猜你喜欢
  • 1970-01-01
  • 2014-08-06
  • 2021-04-29
  • 2016-06-11
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 2014-02-24
相关资源
最近更新 更多