Map和SparseArray的PK。

Map

Map这是Java语言自带的一种容器
使用起来比较简单,很多数据结构中用的相当频繁,
众所周知,Map是一个接口。我们看下关于
A、Map的集合实现,键值对的一一对象存储关系。
** B、Map集合中不能包含相同的key(键值)--此处是通过Key的散列码区分。**

Map相关的方法:
clear():清除Map集合的所有数据。
containKey(Object var1):是否包含键。返回的数boolean数据。
containValue(Object var1):是否包含某个值。
isEmpty():是否为空。
put(K var1, V var2):添加键值对。
putAll(Map<? extends K, ? extends V> var1);添加一个Map集合(但是两个集合的键值对的对象是同类的)。
remove(Object var1):删除某个键值对。参数是key值。
size():Map集合的大小。
Map集合的遍历方式:

1、迭代器遍历

Iterator iterator = map.entrySet().iterator();
  while ( iterator.hasNext() ) {
      Map.Entry entry = (Map.Entry) iterator.next();
      Object valueObject =  entry.getValue();
      Object keyObject =  entry.getKey();
  }![image](http://note.youdao.com/favicon.ico)

2、foreach遍历

for (Map.Entry entry : map.entrySet()) {
     Object keyObject = entry.getKey();
     Object valueObject = entry.getValue();
 }

3、单独取值遍历

Map<Object, Object> map = new HashMap();
for (Object object : map.keySet()) {
    //获取到的是Key.
}
for(Object object : map.values()){
    //获取的是values.
}
Map实现类的相关介绍
(1)HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。
     A、HashMap最多只允许一条记录的键为null,允许多条记录的值为null。
     B、HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。
     C、如果需要同步,可以用Collections.synchronizedMap(HashMap map)方法使HashMap具有同步的能力。
(2)Hashtable与HashMap类似,不同的是:
    A、它不允许记录的键或者值为空;
    B、它支持线程的同步,即任一时刻只有一个线程能写Hashtable,然而,这也导致了Hashtable在写入时会比较慢。
(3)LinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的。 在遍历的时候会比HashMa慢。
(4)TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用Iteraor遍历TreeMap时,得到的记录是排过的。

SparseArray

SparseArray是Android里了替代hashMap这样的数据结构的产生的 目的是为了提高内存的使用效率。(SparseArray采用的是折半查找)

SparseArray相关特点
在google的官方文档中也提及到了内存效率高些。主要是有以下两点吧(与HashMap相比)
A、不需要进行对象转化。(HashMap的键值都是对象。SparseArray是常见的数据类型)。
B、数据结构的差异,与hashMap的散列码以及哈希值不一样的在于,底层的是用过一个数组实现的。通过折半对数组进行一系列的操作,所以其实在查询上可能还会比HashMap慢,但是在添加和删除操作中,会提高百分之50的内存效率。
C、大量的数据我们相对SparseArray会优先选择HashMap,如果数据在几百个这个数目, 那么选择它们任意一个去实现区别不大,如果数量较少,就选择SparseArray去实现。
SparseArray相关的方法

每个数据结构,无非就是增删改查

  • clone() 克隆一个与当前SparseArray不是同一个存储地址的SparseAarry相当于 new 一个当前的SparseArray.
    1. append(int key, E value) 添加数据的时候,相当于StringBuilder的添加方法,在最后一位添加。

    2. put(int key, E value)
      这个就和HashMap差不多吧,如果当前有key的话就替代value之前已经有的。
      其实我后来研究了一下,这两个方法本质是一样的 没有什么区别。都是一样的功能如果只是单纯看文档说明就是上面我说的意思。

      我们来看看源码吧

/**
     * Puts a key/value pair into the array, optimizing for the case where
     * the key is greater than all existing keys in the array.
     */
    public void append(int key, E value) {
        if (mSize != 0 && key <= mKeys[mSize - 1]) {
            put(key, value);
            return;
        }

        if (mGarbage && mSize >= mKeys.length) {
            gc();
        }

        mKeys = GrowingArrayUtils.append(mKeys, mSize, key);
        mValues = GrowingArrayUtils.append(mValues, mSize, value);
        mSize++;
    }

append方法还是会调put方法的。

    • delete(int key)
    • remove(int key)
      上面的方法都是通过删除的方式,其实是一样的。
    • removeAt(int index) 这就是通过索引值删除这数据。
    • clear() 清空所有的Key-Values的数据.

    remove()源码如下:

/**
     * Alias for {@link #delete(int)}.
     */
    public void remove(int key) {
        delete(key);
    }
    • **setValueAt(int index, E value) ** 修改对应该的index去修改对应的Value
    • 还有就是put以及append方法了。这也是修改数据的方法。
    • indexOfKey(int key)indexOfValue(E value) 查找索引值(角标)。
    • keyAt(int index)valueAt(int index)就是通过索引值查找对于的key和Value.
  • gc()

    • 这是SparseArray自己构建的回收机制。

SparseArray的遍历

for (int x = 0; x < sparseArray.size();x ++){
            int key = sparseArray.keyAt(x);
            String values = sparseArray.valueAt(x);
  }

可以只取key或者Values. 看个人需求。

以上有什么有问题的地方,多多担待

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容

  • 转载自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay阅读 6,110评论 1 5
  • 分析常用集合的底层的原理:ArrayList、Vector、LinckedList、HashMap、HashSet...
    仕明同学阅读 2,182评论 1 13
  • 我们习惯了用我们的经历去判断一个人,正如我早上发了一条说说一样,说自己英语五级,然而这个所谓的五级并不是四六级里面...
    FiftytwoHzwhale阅读 138评论 0 0
  • 好想 触碰着你的指尖 感受 你的心动 让爱倾涌 好想 凝视着你的眉弯 望穿 你的心灵 让心交融 好想 静守着你的身...
    古楼听雨忆流年阅读 201评论 0 1
  • 十年前 你还是个蹦蹦跳跳的小屁孩 每天都会看“动画梦工厂” 还记得那个聪明的一休 每天都会忍不住要看《火影忍者》 ...
    Joe_太君阅读 249评论 1 1