android 基础 collection和map

来源:互联网 发布:c语言编程输出爱心图形 编辑:程序博客网 时间:2024/04/29 22:40





数据结构:

①数组 (Array)
在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数
据元素的集合称为数组。在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组
元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指

针数组、结构数组等各种类别。

②栈 (Stack)
栈是只能在某一端插入和删除的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后
的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
③队列 (Queue)
一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行
插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
④链表 (Linked List)
一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:
一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
⑤树 (Tree)
树是包含n(n>0)个结点的有穷集合K,且在K中定义了一个关系N,N满足 以下条件:
(1)有且仅有一个结点 k0,他对于关系N来说没有前驱,称K0为树的根结点。简称为根(root)
(2)除K0外,k中的每个结点,对于关系N来说有且仅有一个前驱。
(3)K中各结点,对关系N来说可以有m个后继(m>=0)。
⑥堆 (Heap)
在计算机科学中,堆是一种特殊的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指
二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。
⑦图 (Graph)
图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,
边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。
⑧散列表 (Hash)
若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称
这个对应关系f为散列函数(Hash function),按这个思想建立的表为散列表。


算法,那么多的数据中如何做到最快的增删改查。


java.util中重要的三个接口:

list  列表
set 保证集合中元素唯一
map 维护多个key-value键值对,保证key唯一

集合关系:

CollectionlistLinkedListVectorArrayListSetTreeSetHashSetMapTreeMapHashMapLinkedHashMap


Collection,操作集合的工具类

由于大部分的集合接口实现类都是不同步的,可以使用Collections.synchronized*方法创建同步的集合类对象。
如创建一个同步的List
List synList = Collections.synchronizedList(new ArrayList());
其实现原理就是重新封装new出来的对象,操作对象时用关键字synchronized同步


List

ArrayList是非同步的。Vector是同步的,不用考虑多线程时应使用ArrayList提升效率。
LinkedList是链表,链表随机位置插入,删除数据时比线性表快。遍历却慢一些。

由此可根据实际情况来选择使用ArrayList(非同步、非频繁删除时选择)、Vector(需同步时选择)、LinkedList(频繁在任意位置插入、删除时选择)。


Map(存储键值对,Key唯一)

HashMap结构的实现原理是将put进来的key-value封装成一个Entry对象存储到一个Entry数组中,位置(数组下标)由key的哈希值与数组长度计算而来。如果数组当前下标已有值,则将数组当前下标的值指向新添加的Entry对象。HashMap位置是乱序的。存进去的顺序和取出来的顺序是不一样的。

TreeMap是由Entry对象为节点组成的一颗红黑树,put到TreeMap的数据默认按key的自然顺序排序,new TreeMap时传入Comparator自定义排序。

HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。

WeakHashMap类
WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。

Set(保证容器内元素唯一性)

Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。
Set结构其实就是维护一个Map来存储数据的,利用Map结构key值唯一性。
HashSet、TreeSet分别默认维护一个HashMap、TreeMap。


Collection 接口是用于容纳元素的容器。而Iterator接口是用于遍历集合中每一个元素的数据结构,因此Iterator也被称为迭代器。


Iterator 通用方法简介

Boolean hasNext()
可以判断是否到了集合的末尾,如果到集合的末尾,就返回false
Object next()
返回当前指针跳过的那个元素






总结

1 )ArrayList<E>

数据结构:数组(线性序列)
适合操作:根据数据结构,善于随机访问元素,但是在其中间插入和移除元素时较慢
基本介绍:初始化时可设置数组容量大小,当实际元素个数size大于数组容量,对其进行扩容。因为其数据结构是数组,每次查询可根据下标直接查到元素。
删除一个元素时,后面元素统一向前移一位。


2 ) LinkedList<E>

数据结构:双向链表
适合操作:根据数据结构,不善于随机访问元素,但是在其中间插入和移除元素时较快
基本介绍:每个元素都是一个Node,除了元素值位,还有一个指向左右的引用。每次增删Node,只需要改变左右的引用指向即可,不用移动元素


3 ) Vector<E>

数据结构:跟 ArrayList 的数据结构一样(数组)
适合操作:跟 ArrayList 一样,因同步的,所以没有 ArrayList 快
基本介绍:其方法与 ArrayList 也基本相同,只是在增、删、改、查等方法前加了synchronized关键字。
单线程中不需使用,即使使用后台的编译期也会进行对其进行优化,消除同步代码。多线程中一般也很少使用,因为速度比较慢,而且组合操作(如果存在删除)无法实现线程安全。


4 ) Stack<E>栈

数据结构:继承Vector(数组),可用LinkedList链表实现。
适合操作:“栈”,先进后出的容器,只有一个口,一端放入元素,同一端取出元素
应用:
1)平衡符号: 栈中:{{【{(  站外:)}】}} ,从栈中向外弹出元素做比较。
2)后缀表达式: 表达式a+b*c+(d*e+f)*g 转成后缀:abc*+de*f+g*+ ,现将abc压栈,遇到*,bc出栈做乘法,,,,
基本介绍: LinkedList能够直接实现栈的所有功能的方法,因此可以直接将LinkedList作为栈使用。


5 ) Queue<E> 队列

数据结构:数组(ArrayDeque)、链表(LinkedList)
适合操作:队列,先进先出的容器,从容器的一端放入事物, 从另一端取出
应用:并发(只是思想)
基本介绍:放入顺序与取出顺序相同。


6 ) PriorityQueue<E> 优先队列

数据结构:堆(数组)。
适合操作:优先队列,声明下一个弹出的元素是最需要的元素(最大值/最小值具有最高优先级)
基本介绍: 根据堆的性质,每次在[0]位置的都是最大或最小的元素。因为要进行排序所以元素要实现接口Comparator<T>


7 ) Deque<E> 双向队列

数据结构:数组(ArrayDeque)、链表(LinkedList)
适合操作:双向队列,可以在任何一端添加或删除元素
基本介绍:因为ArrayDeque、LinkedList都实现了Deque接口,所以可以通过向上转型使用Deque


8 ) HashMap<K,V> 

数据结构:散列(数组+单向链表)
适合操作:当get()时使用线性搜索,执行速度会很慢,而HashMap通过散列码可以很快定位元素位置。
基本介绍:
1)每个元素都是一个Entry<K,V>对象,其底层通过Entry<K,V>数组来存储元素,每个Entry<K,V>对象中会有一个next属性来实现单向链表
2)通过hash算法(利用K的hashCode)为每个Entry的K生成一个hash值,然后根据hash值和数组length算出Entry在数组中的位置。
3)不同的K可能生成相同的hash值,即会存储在数组的同一个位置,这时通过equals比较,如果是false将新插入的值放入计算出来的位置,然后next指向oldEntry,如果是false,则替
换value
4) 装(负)载因子默认是075,即当数组75%的位置都有值时,对数组进行扩容length*2,然后重新计算每个元素在数组中的位置。


9 ) HashSet<E> 

数据结构:散列
适合操作:无重复元素,可以快速超找到对象。
基本介绍:HashSet的元素可以看作是HashMap的key没有重复元素,查找块。所以HashSet的底层实现就是HashMap


10 ) LinkedHashMap<K,V>     

数据结构:散列,双向链表
适合操作:具有HashMap的查询速度,内部使用双向链表维护顺序(插入次序),迭代遍历按插入顺序显示,因为使用链表维护内部顺序,所以迭代访问很快。
基本介绍:继承自HashMap,每个元素Entry<K,V>多出两个指向两边元素的引用来维护顺序。


11 )Linked HashSet<E> 

数据结构:散列
适合操作:无重复元素,可以快速超找到对象。迭代遍历按插入顺序显示
基本介绍:LinkedHashSet的元素可以看作是LinkedHashMap的key没有重复元素,所以LinkedHashSet的底层实现就是LinkedHashMap


12 )TreeMap <K,V>   

数据结构:红黑树
适合操作:对元素自动排序
基本介绍:下面是Entry<K,V>的属性。TreeMap会对K自动排序,次序由Comparable或Comparator决定,TreeMap中的元素都是有序的,如果键被用于TreeMap,那么必须实现Comparable


13 )TreeSet <E> 

数据结构:红黑树
基本介绍:通过TreeMap实现,功能参照TreeMap


0 0