Android-Java:常用基本容器学习总结

Android-Java:常用基本容器学习总结

1.常用容器的总体框架

在这里插入图片描述

2.常用容器类的重点

1. ArrayList

https://www.cnblogs.com/skywang12345/p/3308556.html

1.1 存储结构:

在这里插入图片描述

value值存在elementData这个Object类型的数组中,默认容量是10。
1.2 容器特点:

  1. ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。
  2. ArrayList 实现java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输.
  3. ArrayList中的操作不是线程安全的!所以,建议在单线程中才使用ArrayList.

1.3 注意事项:

  1. 遍历ArrayList时,使用随机访问(即,通过索引序号访问)效率最高,而使用迭代器的效率最低
  2. ArrayList中的操作不是线程安全的!所以,建议在单线程中才使用ArrayList.

2. Vector

Vector 是矢量队列,继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口。
https://www.cnblogs.com/skywang12345/p/3308833.html
2.1 存储结构:

在这里插入图片描述

value值存在elementData这个Object类型的数组中,默认容量是10。

2.2 容器特点:

  1. Vector中的操作是线程安全的,add(),remove(),clear()等操作均加上了synchronized保护;


    在这里插入图片描述

3. Stack

Stack是继承Vector来实现,基于Vector的addElement和removeElement来实现push,pop,peek操作,因此Stack也是通过数组实现的,而非链表。
3.1 存储结构:
实质上还是用的Vector的数组实现:

在这里插入图片描述

3.2 容器特点:

  1. Stack实际上也是通过数组去实现的。
    执行push时(即,将元素推入栈中),是通过将元素追加的数组的末尾中。
    执行peek时(即,取出栈顶元素,不执行删除),是返回数组末尾的元素。
    执行pop时(即,取出栈顶元素,并将该元素从栈中删除),是取出数组末尾的元素,然后将该元素从数组中删除。
  2. Stack继承于Vector,意味着Vector拥有的属性和功能,Stack都拥有。

4. HashMap

http://androidxref.com/9.0.0_r3/xref/libcore/ojluni/src/main/java/java/util/HashMap.java
4.1 存储结构:
JDK1.8 链表结构优化为数组+红黑树形式:

在这里插入图片描述

JDK1.8 之前数据+链表实现:


在这里插入图片描述

数组是HashMap的主体,链表,红黑树则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表或红黑树,那么对于查找,添加等操作很快,仅需一次寻址即可;

如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。

所以,性能考虑,HashMap中的链表出现越少,性能才会越好。

4.2 容器特点:

  1. HashMap线程不安全;
  2. HashMap可以接受为null的键值(key)和值(value)

5. HashTable

HashTable和Hashmap类似,有个HashTableEntry 类型的数组成员变量table,管理着键值对。


在这里插入图片描述

Hashtable是synchronized,这意味着Hashtable是线程安全的

但是HashTable已经被淘汰了,如果不需要线程安全,那么使用HashMap,如果需要线程安全,那么使用ConcurrentHashMap。
5.1 HashTable方法API:

在这里插入图片描述

5.2 容器特点:

  1. Hashtable 的函数都是同步的,这意味着它是线程安全的。
  2. 它的key、value都不可以为null。
  3. Hashtable中的映射不是有序的。
  4. 该类型已经提示被淘汰,需要线程安全的话可以使用ConcurrentHashMap

6. HashSet

  1. HashSet是一个集合,集合中不允许出现重复元素。
  2. HashSet是基于HashMap实现,HashSet中有一个HashMap的成员变量map,HashSet的Value 值会被以键值对<Value,PRESENT>加入到map中,由于HashMap不可以有重复的key,因而实现了set的去重。

6.1 注意事项:

  1. HashSet实现了Set接口,它不允许集合中出现重复元素。当我们提到HashSet时,第一件事就是在将对象存储在HashSet之前,要确保重写hashCode()方法和equals()方法,这样才能比较对象的值是否相等,确保集合中没有储存相同的对象。
    案例:https://www.cnblogs.com/dongying/p/4024519.html

7. ConcurrentHashMap

原理:http://www.cnblogs.com/chengxiao/p/6842045.html

7.1 存储结构:

在这里插入图片描述

Segmemt:
每个绿色方块是ConcurrentHashMap的一个Node:
在这里插入图片描述

7.2 容器特点:
1.ConcurrentHashMap是线程安全的;
1.ConcurrentHashMap不同于HashMap,它既不允许key值为null,也不允许value值为null;
2.HashTable容器的get方法是需要加锁的,而ConcurrentHashMap的get操作是不加锁的,原因是它的get方法里将要使用的共享变量都定义成volatile;
3.在ConcurrentHashMap中,每个hash区间使用的锁是ReentrantLock;

Android中独有的:

8. SparseArray

8.1 存储结构:

在这里插入图片描述

8.2 容器特点

  1. SparseArray在存储和读取数据时候,使用的是二分查找法;
  2. 满足下面两个条件我们能够使用SparseArray取代HashMap:
    a.数据量不大,最好在千级以内;
    b.key必须为int类型,这中情况下的HashMap能够用SparseArray取代;
  3. SparseArray被称为稀疏数组,原因是数组中可能并不是连续存储着value,remove方法并没有去直接删掉元素,而是将这个key指向了DELETED,这时候value失去了引用,如果没有其它的引用,会在下一次系统内存回收的时候被干掉,或者该key被复用指向新的值,是一个优化;
  4. SparseArray不需要开辟内存空间来额外存储外部映射,从而节省内存,key为int的时候才能使用,注意是int而不是Integer,这也是sparseArray效率提升的一个点,去掉了Hashmap的装箱的操作。

9. ArrayMap

https://www.jianshu.com/p/1fb660978b14
9.1数据结构:

在这里插入图片描述

  1. 数据变量含义:
    (1)mHashes,用于保存key对应的hashCode;
    (2)mArray,用于保存键值对(key,value),其结构为[key1,value1,key2,value2,key3,value3,......];
    (3)mBaseCache,缓存,如果ArrayMap的数据量从4,增加到8,用该数组保存之前使用的mHashes和mArray,这样如果数据量再变回4的时候,可以再次使用之前的数组,不需要再次申请空间,这样节省了一定的时间;
    (4)mTwiceBaseCache,与mBaseCache对应,不过触发的条件是数据量从8增长到12;
  2. allocArrays()
  3. 适用场景:
    a. 数据量不大
    b.空间比时间重要
    c.需要使用Map在Android平台,相对来说,内存容量更宝贵。而且数据量不大。所以当需要使用key是Object类型的Map时,可以考虑使用ArrayMap来替换HashMap
  4. 中占据时间复杂度最多的属于第一步:确定key的hashCode在mHahses中的索引值。而这一步对mHashes查找使用的是二分查找,即Binary Search。所以ArrayMap的查询时间复杂度为 ‎O(log n);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 4,416评论 1 14
  • hashmap实现的数据结构,数组、桶等。 如图所示 JDK 1.7,是以数组+链表组成的,链表为相同hash的键...
    不需要任何阅读 828评论 0 1
  • Java继承关系初始化顺序 父类的静态变量-->父类的静态代码块-->子类的静态变量-->子类的静态代码快-->父...
    第六象限阅读 2,154评论 0 9
  • 本系列出于AWeiLoveAndroid的分享,在此感谢,再结合自身经验查漏补缺,完善答案。以成系统。 Java基...
    济公大将阅读 1,528评论 1 6
  • 大多数人在职场的成长轨迹通常是步出校园之后,先进入公司工作。如何在工作的过程中建立正确的个人商业模式呢? 对于工作...
    路上的威利阅读 165评论 0 1