美文网首页Java基础集合
Android中的集合数据结构

Android中的集合数据结构

作者: MengkZhang | 来源:发表于2018-07-28 11:21 被阅读0次

集合框架结构图

集合和数组的区别

Collection集合的方法

常用集合的分类

Collection 接口的接口 对象的集合(单列集合)
├——-List 接口:元素按进入先后有序保存,可重复
│—————-├ LinkedList接口实现类, 链表, 插入删除, 没有同步, 线程不安全
│—————-├ ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
│—————-└ Vector 接口实现类 数组, 同步, 线程安全
│ ———————-└ Stack 是Vector类的实现类
└——-Set 接口: 仅接收一次,不可重复,并做内部排序
├—————-└HashSet 使用hash表(数组)存储元素
│————————└LinkedHashSet 链表维护元素的插入次序
└ —————-TreeSet 底层实现为二叉树,元素排好序

Map 接口 键值对的集合 (双列集合)
├———Hashtable 接口实现类, 同步, 线程安全
├———HashMap 接口实现类 ,没有同步, 线程不安全-
│—————–├ LinkedHashMap 双向链表和哈希表实现
│—————–└ WeakHashMap
├ ——–TreeMap 红黑树对所有的key进行排序
└———IdentifyHashMap

List和Set集合详解

list和set的区别

List

(1)ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素
(2)LinkedList 底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素
(3)Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素

ArrayList的自动扩容机制

在 Java 7 中,查看源码可以知道:ArrayList 的默认大小是 10 个元素,HashMap 的默认大小是16个元素(必须是2的幂,为什么呢???下文有解释)。这就是 Java 7 中 ArrayList 和 HashMap 类 的代码片段

// from ArrayList.java JDK 1.7
private static final int DEFAULT_CAPACITY = 10;
 
//from HashMap.java JDK 7
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

这里要讨论这些常用的默认初始容量和扩容的原因是:

当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,

这无疑使效率大大降低。加载因子的系数小于等于1,意指即当元素个数超过容量长度*加载因子的系数时,进行扩容。另外,扩容也是有默认的倍数的,不同的容器扩容情况不同。

ArrayList、Vector默认初始容量为10

Vector:线程安全,但速度慢

  • 底层数据结构是数组结构
  • 加载因子为1:即当 元素个数 超过 容量长度 时,进行扩容
  • 扩容增量:原容量的 1倍
  • 如 Vector的容量为10,一次扩容后是容量为20
  • ArrayList:线程不安全,查询速度快
  • 底层数据结构是数组结构
  • 扩容增量:原容量的 0.5倍+1**
  • 如 ArrayList的容量为10,一次扩容后是容量为16

每次扩容都是通过Arrays.copyOf(elementData, newCapacity) 这样的方式实现的。ArrayList的自动扩容机制底层借助于System实现System.arraycopy(0,oldsrc,0,newsrc,length);

ArrayList查找速度确实快,但是频繁的插入删除数据对于ArrayList来说效率就很低了,需要不停的复制、移动元素。

扩展:System源码中的arraycopy()标识为native意味JDK的本地库,不可避免的会进行IO操作,如果频繁的对ArrayList进行扩容,毫不疑问会降低ArrayList的使用性能,因此当我们确定添加元素的个数的时候,我们可以事先知道并指定ArrayList的可存储元素的个数,这样当我们向ArrayList中加入元素的时候,就可以避免ArrayList的自动扩容,从而提高ArrayList的性能。

HashMap HashSet默认初始容量为16

  • Set(集) 元素无序的、不可重复。
  • HashSet:线程不安全,存取速度快
  • 底层实现是一个HashMap(保存数据),实现Set接口
  • 默认初始容量为16(为何是16,见下方对HashMap的描述)
  • 加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容
  • 扩容增量:原容量的 1 倍
  • 如 HashSet的容量为16,一次扩容后是容量为32
  • Map是一个双列集合
  • HashMap:默认初始容量为16
  • (为何是16:16是2^4,可以提高查询效率,另外,32=16<<1)
  • 加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容
  • 扩容增量:原容量的 1 倍
  • 如 HashSet的容量为16,一次扩容后是容量为32

List和Set总结

(1)、List,Set都是继承自Collection接口,Map则不是
(2)、List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。)
(3).Set和List对比:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。

ArrayList与LinkedList的区别和适用场景

Arraylist:
优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。
缺点:因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。

LinkedList:
优点:LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作add和remove,LinedList比较占优势。LinkedList 适用于要头尾操作或插入指定位置的场景
缺点:因为LinkedList要移动指针,所以查询操作性能比较低。

HashMap与TreeMap的区别

HashMap 非线程安全
HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。

TreeMap:非线程安全基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。

线程安全集合类与非线程安全集合类

LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;
HashMap是非线程安全的,HashTable是线程安全的;
StringBuilder是非线程安全的,StringBuffer是线程安全的。

相关文章

  • 【Android】Android中的数据结构:SparseArr

    SparseArray和ArrayMap是Android中的特有集合类数据结构。 一、SparseArray Sp...

  • 复习

    数据结构 数据结构 集合常见数据结构:集合,链表,队列,数组,栈,映射java中:List列表,Set集合,Map...

  • Android中的集合数据结构

    集合框架结构图 集合和数组的区别 Collection集合的方法 常用集合的分类 Collection 接口的接口...

  • 容器类框架分析(6)(java)HashSet & Li

    移步数据结构--容器汇总(java & Android)内容: Set 集合概述 HashSet 源码简单分析 L...

  • Android中的数据结构解析(四)SparseArray和Ar

    Android数据结构解析系列:Android中的数据结构解析(一)ArrayList、LinkedList、Ve...

  • 数据结构(一):结构概念 与 算法概念 及 时间复杂度

    数据结构概念 数据结构分为:逻辑结构、物理结构 逻辑结构 集合结构:集合结构中的数据元素除了同属于一个集合外,它们...

  • 数据结构

    ㈠什么是数据结构 数据结构是指相互有关联的数据元素的集合。数据结构研究的内容包括以下3个方面,①数据集合中...

  • 数据结构之集合和映射

    基于二分搜索树的集合实现 集合(Set)的基础概念: 数据结构中的集合概念与数学中的集合概念是一样的,集合中的元素...

  • stream流

    1.流与集合 粗略地说,集合与流之间的差异就在于什么时候进行计算。集合是一个内存中的数据结构,它包含数据结构中目...

  • 8 集合[python基础]

    # 什么是集合? 集合(Set)是Python中的内置数据结构 集合可以看作是没有Value的字典 {'张...

网友评论

    本文标题:Android中的集合数据结构

    本文链接:https://www.haomeiwen.com/subject/gttprctx.html