Android中涉及数据结构和算法的工具类

一.概念

数据结构:是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。

算法:是特定问题求解步骤的描述,算法是独立存在的一种解决问题的方法和思想

详细参照:http://www.cnblogs.com/xydblog/p/3565363.html其中涉及了时间复杂度和空间复杂度,只是浅显的概念,如果想深入的了解请观看研读各种

有关书籍。还有想了解时间复杂度和空间复杂度的可以看:http://blog.csdn.net/booirror/article/details/7707551/很不错的文章

另外本文只是概括的说明和比较几种工具类的不同,详细的分析接下来会有一系列的文章

二.涉及的Android中的各种数据工具

2.1常用集合类的继承结构如下:

Collection<--List<--Vector

Collection<--List<--ArrayList

Collection<--List<--LinkedList

Collection<--Set<--HashSet

Collection<--Set<--HashSet<--LinkedHashSet

Collection<--Set<--SortedSet<--TreeSet

Map<--SortedMap<--TreeMap

Map<--HashMap (补充一个HashMap的子类LinkedHashMap:)

注意这里的 Collection、List、Set和Map都是接口(Interface)

三.接口和类详细介绍

3.1List下各种概念和特性

List:

List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下 >标)来访问List中的元素,

这类似于Java的数组。

Vector:

基于数组(Array)的List,ArrayList其实是对数组的动态扩充,底层的数据结构使用的是数组结构(数组长度是可变的百分之百延长);

特点:Vector是线程同步的(sychronized)的,线程安全的。速度相对ArrayList慢些。

ArrayList:

基于数组(Array)的List,ArrayList其实是对数组的动态扩充,底层的数据结构使用的是数组结构(数组长度是可变的百分之五十延长)

特点:查询很快,但增删较慢,线程不同步。性能上要比Vector好一些,但是线程不安全。

LinkedList:

LinkedList不同于前面两个,基于单链表实现的。

它每一个节点(Node)都包含两方面的内容:

1.节点本身的数据(data);

2.下一个节点的信息(nextNode)。

所以当对LinkedList做添加,删除动作的时候就不用像基于数组的ArrayList一样,必须进行大量的数据移动。

只要更改nextNode的相关信息就可以实现了,这是LinkedList的优势。

List总结:

所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ]

所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ]

所有的List中可以有null元素,例如[ tom,null,1 ]

基于Array的List(Vector,ArrayList)适合查询,而LinkedList 适合添加,删除操作

3.2Set下各种概念和特性

Set:

Set是一种不包含重复的元素的无序Collection。

HashSet:

虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。

但是Set则是在 HashMap的基础上来实现的,这个就是Set和List的根本区别。HashSet的存储方式是把HashMap中的Key作为Set的对应存储项。

看看 HashSet的add(Object obj)方法的实现就可以一目了然了。

Java代码  收藏代码

public boolean add(Object obj) {

return map.put(obj, PRESENT) == null;

}

这个也是为什么在Set中不能像在List中一样有重复的项的根本原因,因为HashMap的key是不能有重复的。

LinkedHashSet:

HashSet的一个子类,一个链表。

TreeSet:

SortedSet的子类,它不同于HashSet的根本就是TreeSet是有序的。它是通过SortedMap来实现的。

Set总结:

Set实现的基础是Map(HashMap)

Set中的元素是不能重复的,如果使用add(Object obj)方法添加已经存在的对象,则会覆盖前面的对象

3.3Map下面的概念和特性

Map 是一种把键对象和值对象进行关联的容器,而一个值对象又可以是一个Map,依次类推,这样就可形成一个多级映射。

对于键对象来说,像Set一样,一个 Map容器中的键对象不允许重复,这是为了保持查找结果的一致性;如果有两个键对象一样,

那你想得到那个键对象所对应的值对象时就有问题了,可能你得到的并不是你想的那个值对象,结果会造成混乱,所以键的唯一性很重要,

也是符合集合的性质的。当然在使用过程中,某个键所对应的值对象可能会发生变化,这时会按照最后一次修改的值对象与键对应。

对于值对象则没有唯一性的要求,你可以将任意多个键都映射到一个值对象上,这不会发生任何问题(不过对你的使用却可能会造成不便,

你不知道你得到的到底是那一个键所对应的值对象)。

Map有两种比较常用的实现:HashMap和TreeMap。

HashMap也用到了哈希码的算法,以便快速查找;

LinkedHashMap继承自HashMap,特点是内部存入数据是有顺序的,增加了记住元素插入或者访问顺序的功能,这个是通过内部一个双向的循环链表实现的。与 HashMap 一样,它可以为基本操作(add、contains 和 remove)提供稳定的性能,假定哈希函数将元素正确分布到桶中。由于增加了维护链接列表的开支,其性能很可能比 HashMap 稍逊一筹,不过这一点例外:LinkedHashMap 的 collection 视图迭代所需时间与映射的大小成比例。HashMap 迭代时间很可能开支较大,因为它所需要的时间与其容量成比例。

TreeMap则是对键按序存放,因此它便有一些扩展的方法,比如firstKey(),lastKey()等,你还可以从TreeMap中指定一个范围以取得其子Map。

键和值的关联很简单,用put(Object key,Object value)方法即可将一个键与一个值对象相关联。用get(Object key)可得到与此key对象所对应的值对象。

四.各个常用类的比较

4.1几个常用类的区别

1.ArrayList: 元素单个,效率高,多用于查询

2.Vector: 元素单个,线程安全,多用于查询

3.LinkedList:元素单个,多用于插入和删除

4.HashMap: 元素成对,元素可为空

5.HashTable: 元素成对,线程安全,元素不可为空

6. HashSet:元素单个,元素不可重复

4.2、Vector、ArrayList和LinkedList

大多数情况下,从性能上来说ArrayList最好,但是当集合内的元素需要频繁插入、删除时LinkedList会有比较好的表现,

但是它们三个性能都比不上数组,另外Vector是线程同步的。所以:

如果能用数组的时候(元素类型固定,数组长度固定),请尽量使用数组来代替List;

如果没有频繁的删除插入操作,又不用考虑多线程问题,优先选择ArrayList;

如果在多线程条件下使用,可以考虑Vector;

如果需要频繁地删除插入,LinkedList就有了用武之地:

如果你什么都不知道,用ArrayList没错。

猜你喜欢

转载自blog.csdn.net/xu13879531489/article/details/80565354