ArrayMap put方法以奇怪的顺序推送元素

时间:2017-03-29 13:11:05

标签: java android

我在项目中第一次使用ArrayMap,我认为它就像一个数组一样。我预计当我使用.put方法时,它会将它插入下一个索引。 但在我的情况下,这不是真的 - 在我逐个添加所有元素后,我添加的第一个元素最终在索引4处,这有点奇怪。

以下是我添加元素的前三个步骤:

1 - 沙拉:

enter image description here

2 - 汤:

enter image description here

3 - 开胃菜:

enter image description here

所以第二步" Soup"元素被插入索引0而不是1,正如我所料,但奇怪的是第三步"开胃菜"在" Soup"之后按预期插入。

这是我用来推送键和值对的代码:

function ArrayMap<String, DMType> addElement(String typeKey, DMType type) {
    ArrayMap<String, DMType> types = new ArrayMap<>();
    types.put(typeKey, type);

    return types;
}

我是否遗漏了有关ArrayMap行为的内容?

4 个答案:

答案 0 :(得分:1)

它不能用作数组,我在名称中看不到ArrayMapdocumentation明确表示其行为为通用键 - &gt;值映射,比传统的HashMap实现更有效(内存明智)。

实际上,与插入订单相比,我不明白为什么你关心订单。数据在类中是私有的,并且您无法通过索引获取元素,因此您基本上想知道与其使用无关的私有实现。

如果您真的想了解它如何存储数据,您应该查看source code

答案 1 :(得分:1)

ArrayMap不像数组一样工作,而是像HashMap一样工作,具有性能优化。

键值对的内部序列无法保证,因为它不是合同的一部分。

在您的情况下,您真正​​想要使用的可能是ArrayList<Element>,其中Element类的定义如下:

public class Element{
    private final String typeKey;
    private final DMType type;
    public Element(String typeKey, DMType type){
           this.typeKey = typeKey;
           this.type = type;
    }
}

如果您不希望新类仅用于存储结果,并且您希望保留序列,则可以使用LinkedHashMap<String, DMType>。如文件所述:

  

类LinkedHashMap

     

Map接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与HashMap的不同之处在于它维护了一个贯穿其所有条目的双向链表。此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序)。请注意,如果将键重新插入地图,则插入顺序不会受到影响。 (如果m.containsKey(k)在调用之前立即返回true,则调用m.put(k,v)时,将密钥k重新插入到映射m中。)

答案 2 :(得分:1)

  

我认为它就像一个数组

不,它的作用就像一张地图,因为它是一张地图。它类似于HashMap,但对于较小的数据集,内存效率更高。

它的顺序不应该也不重要。在引擎盖下,它是使用 一个数组,自数组以来有一个顺序。这固有地为ArrayMap提供了一个顺序,但这并不是它的API的一部分。就像Java对象所在的内存插槽一样,您也不应该关心这里的订单。

答案 3 :(得分:1)

是的,因为名称有误导性,但ArrayMap不像数组那样保证订单。

  

ArrayMap是一个通用的key-&gt;值映射数据结构   旨在提高内存效率,而不是传统的HashMap。

ArrayMap实际上是一个Map:

  

public class ArrayMap extends SimpleArrayMap实现了Map

如果您想要保证订单的地图功能,请使用LinkedHashMap。

  

LinkedHashMap定义了迭代排序,通常是   键插入地图的顺序(插入顺序)。

documentation