Java常用集合类

集合类

集合类主要分为两大类:Collection和Map。容器内每个槽元素个数不同,Collection只有一个,Map是类型是键值对形式


1、Collection是List、Set、Queue等集合高度抽象出来的接口,它包含了这些集合的基本操作,它主要又分为三大部分:List和Set,Queue。

(1) List接口通常表示一个列表(数组、队列、链表、栈等),其中的元素可以重复,常用实现类为ArrayList和LinkedList,另外还有不常用的Vector。另外,LinkedList还是实现了Queue接口,因此也可以作为队列使用。

ArrayList

是数组,所以擅长随机访问,但是在List中间插入,删除,移动数据较慢,支持自动增长,如果没有设置初始容量,那么第一次添加数据的时候,使用默认容量大小10,,需要扩容的时候,新数组的大小是原来数组大小的1.5倍(int newCapacity = oldCapacity + (oldCapacity >> 1);

),例如数组容量是15,当增加第16个元素的时候,增加新数组但是需要大量的数据拷贝

LinkedList

他是双向链表,插入,移动,删除比较擅长,但是在随机访问方面比较慢,同时 他也实现了Queue接口(直接的Deque)


Vector

Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步。初始容量是10。扩容的策略是:

int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);
如果制定了扩容大小 就是用扩容大小,如果没有指定 那么就2倍的方式扩容

(2)Set接口通常表示一个集合,其中的元素不允许重复(通过hashcode和equals函数保证),常用实现类有HashSet,TreeSet和LinkedHashSet,


HashSet:

HashSet是通过Map中的HashMap实现的,里面实现的是HashMap,他的元素作为HashMap的Key存在,Value是Object

TreeSet

而TreeSet是通过Map中的TreeMap实现的,TreeSet还实现了SortedSet接口,因此是有序的集合(集合中的元素要实现Comparable接口,并覆写Compartor函数才行)

LinkedHashSet:

继承自HashSet,但是它的内部是LinkedHashMap实现的,所以他是线程安全的,同时LinkedHashMap是链表,所以是有序列的

(3)Queue 队列 PriorityQueue以及LinkedList

PriorityQueue是有优先级的队列


2、Map是一个映射接口,其中的每个元素都是一个key-value键值对,同样抽象类AbstractMap通过适配器模式实现了Map接口中的大部分函数,TreeMap、HashMap、WeakHashMap等实现类都通过继承AbstractMap来实现,另外,不常用的HashTable直接实现了Map接口,它和Vector都是JDK1.0就引入的集合类。

Iterator是遍历集合的迭代器(不能遍历Map,只用来遍历Collection),Collection的实现类都实现了iterator()函数,它返回一个Iterator对象,用来遍历集合,ListIterator则专门用来遍历List。而Enumeration则是JDK1.0时引入的,作用与Iterator相同,但它的功能比Iterator要少,它只能再Hashtable、Vector和Stack中使用。

Arrays和Collections是用来操作数组、集合的两个工具类,例如在ArrayList和Vector中大量调用了Arrays.Copyof()方法,而Collections中有很多静态方法可以返回各集合类的synchronized版本,即线程安全的版本,当然了,如果要用线程安全的结合类,首选Concurrent并发包下的对应的集合类。


一、Map

java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,


分别是HashMap Hashtable LinkedHashMap 和TreeMap.

Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。

HashMap

是一个最常用的Map,内存存储是一个数组,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。


Hashtable

Hashtable与 HashMap类似,Hashtable继承自Dictionary类(已经过时了),不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。


LinkedHashMap

是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。


TreeMap

它是由红黑二叉树实现的,同时他实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

可以通过比较器去进行排序


一般情况下,我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列.

HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为NULL,允许多条记录的值为NULL。

HashMap不支持线程同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致性。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。

Hashtable与HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtable在写入时会比较慢。

LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。

在遍历的时候会比HashMap慢TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用Iterator遍历TreeMap时,得到的记录是排过序的。




对于concurrent包下面的集合 有一个比较好的文章

http://blog.csdn.net/defonds/article/details/44021605/



你可能感兴趣的:(移动开发)