ArrayMap与HashMap
与org.apache.myfaces.trinidad.util.ArrayMap
和java.util.HashMap
的主要区别是什么?
ArrayMap是线程安全的吗?
在文档中提到Array在性能方面是最好的。
我不想使用hashmap或并发hashmap。 我想尝试下面的其他。 哪一个是最佳替代方案如果我考虑线程的安全性和性能?
ArrayMap var= new ArrayMap();
HashMap使用下面的数组,因此它永远不会比正确使用数组更快。
Random.nextInt()
比你测试的慢很多倍,即使使用数组来测试一个数组会使你的结果产生偏差。你的数组如此慢的原因是由于等于比较,而不是数组访问本身。
ArrayList
实现List
接口, HashMap
实现Map
接口。 所以真正的问题是你何时想要使用List以及何时想要使用Map。 这是Java API文档很有帮助的地方。
列表:
有序集合(也称为序列)。 该接口的用户可以精确控制列表中每个元素的插入位置。 用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。
地图:
将键映射到值的对象。 地图不能包含重复的键; 每个键最多可以映射一个值。
列表接口(ArrayList)
是您使用索引访问的对象的有序集合,非常类似于数组(在ArrayList
的情况下,顾名思义,它只是背景中的数组。您将使用ArrayList
当你想按顺序保存事物时(它们被添加的顺序,或者实际上你添加对象时指定的列表中的位置)。
HashMap
实现使用密钥对象的哈希值来定位它的存储位置,因此不再保证值的顺序。 然而,Java API中可以提供其他类,例如LinkedHashMap
,它使用哈希表来存储键/值对,还按照添加顺序维护键的List(LinkedList),这样您就可以按照添加的顺序(如果需要)再次访问这些项目。
何时使用数组?
永远不要低估数组。 大多数情况下,当我们必须使用对象列表时,我们倾向于考虑使用向量或列表。 但是,如果集合的大小已知并且不会更改,则可以将数组视为潜在的数据结构。 访问数组的元素比使用向量或列表更快。 这很明显,因为你需要的只是一个索引。 额外的get方法调用没有开销。
有时,最好使用上述方法的组合。 例如,您可以使用HashMap的ArrayList来满足特定需求。