SimpleArrayMap和ArrayMap是否意味着保留订单?

时间:2016-11-04 14:20:47

标签: android hashmap

我知道SimpleArrayMapArrayMap类对于HashMap来说更有效(对于少量项目)替换。HashMapLinkedHashMap没有可预测的迭代顺序(与SimpleArrayMap不同),但我注意到ArrayMapSimpleArrayMap类中的一些方法让我相信它们可能。< / p>

keyAt(int index)valueAt(int index)removeAt(int index)等方法似乎表明ArrayMapArrayMap以可预测的方式存储其项目。这些方法也可以非常方便地访问这些项目,因此我在FragmentPagerAdapter添加了public class TabPagerAdapter extends FragmentPagerAdapter { private final ArrayMap<CharSequence, Fragment> mData = new ArrayMap(); public TabPagerAdapter(FragmentManager manager) { super(manager); } public void addPage(CharSequence title, Fragment fragment) { mData.put(title, fragment); } @Override public CharSequence getPageTitle(int position) { return mData.keyAt(position); } @Override public Fragment getItem(int position) { return mData.valueAt(position); } @Override public int getCount() { return mData.size(); } } 来保存每个页面的标题和片段:

getPageTitle()

虽然我在实践中注意到getItem()ArrayMap返回的项目并不总是按照我将其添加到Map#get(Object key)的顺序。但是,如果这些项的索引不可预测,为什么这些类会有通过索引返回键和值的方法(而不是仅使用SimpleArrayMap方法)?

ArrayMapReadFile.txt是否意味着保留订购?难道我做错了什么?或者,如果没有,为什么它们会包含上述方法?

1 个答案:

答案 0 :(得分:2)

在查看SimpleArrayMap实现之后,当调用put,putAll或remove方法时,它似乎会动态增长和缩小。此时您的索引可能会发生变化。如果您在拨打电话后致电notifyDataSetChanged(),您可能会有更好的时间。现在这只是我对你的代码的推理,所以没有保证。 :)

更接近它,​​indexOf方法需要搜索项的假定索引,因为索引的key-hash的内部数组似乎在收缩地图时不会更新。所以索引显然会发生变化。

int index = ContainerHelpers.binarySearch(mHashes, N, hash);

// If the hash code wasn't found, then we have no entry for this key.
if (index < 0) {
    return index;
}

// If the key at the returned index matches, that's what we want.
if (key.equals(mArray[index<<1])) {
   return index;
}

// Search for a matching key after the index.
int end;
for (end = index + 1; end < N && mHashes[end] == hash; end++) {
    if (key.equals(mArray[end << 1])) return end;
}

// Search for a matching key before the index.
for (int i = index - 1; i >= 0 && mHashes[i] == hash; i--) {
    if (key.equals(mArray[i << 1])) return i;
}

// Key not found -- return negative value indicating where a
// new entry for this key should go.  We use the end of the
// hash chain to reduce the number of array entries that will
// need to be copied when inserting.
return ~end;

对于您知道没有对地图进行任何修改的用法,可能存在索引方法。

更新: 为了实现您想要的功能,您需要实现 public long getItemId(int position)也是如此,因为您的位置并没有为您提供稳定的商品ID。

我想说如果您期望对底层地图进行更改,那么使用索引方法可能不是您的最佳选择,因为必须更新缓存的索引。