数组、常用集合框架

array(数组)对每一门编程语言来说都是重要的数据结构之一,array就是把相同数据类型的数据按照一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分它们的变量的集合,这个名字称为数组名,编号称为下标。

数组长度在初始化后就固定的了,而java集合框架则和数组不一样,框架里面的数据结构的储存空间会随着元素添加而动态增加,其中,一些支持重复元素一些则不支持,一些支持null,一些能自动升序等等。

java集合框架主要包括两种类型的容器,一种是集合(collection),存储一个元素集合,一种是图(map),存储键值对映射。collection接口又有三种子类型(接口):List、Set和Queue,再下面是一些抽象类,最后是具体实现类。所以总的来说,我们可以说集合框架可以分为四类:set代表无序、不可重复的集合,List代表着有序、可重复的集合,Queue代表着一种队列集合实现,Map代表着具有映射关系的集合。

首先要介绍的是List接口的两个实现类,第一个是ArrayList,ArrayList是一个有序的集合,随机访问元素比较快,但是往中间插入和移除元素比较慢。ArrayList是一个动态数组,也就是说长度可以动态变化,这就是它和之前我们提到的数组最主要的区别,所以,ArrayList也可以称为动态数组。

List接口的第二个实现类是LinkedList,和ArrayList相比,它往中间插入和移除元素更快,但是随机访问元素较慢,主要是因为LinkedList的实现机制和ArrayList是不一样的。ArrayList是以数组的形式保存集合中的元素,而LinkedList是以双向链表的形式保存集合中的元素。

总结一下,ArrayList比较适合快速随机访问元素的场合,LinkedList比较适合需要快速插入或删除元素的场合。

set接口有三个实现类,第一个是HashSet,它是专门为了快速查找而设计的Set,存入HashSet的元素必须重新定义hashCode()。

第二个是LinkedHashSet,具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。也必须重新定义 hashCode()。

第三个是TreeSet,保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。

Collection的最后一个子类型是queue,queue是一种后进先出的容器,不大常用,暂时不先细说。

然后就轮到Map了,第一个实现类是HashMap,基于散列表实现,存储的内容是键值对 (key-value) 映射,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null ,不支持线程同步。

第二个是LinkedHashMap,类似于 HashMap,但是迭代遍历它时,取得键值对的顺序是其插入顺序,或者是最近最少使用的次序,只比 HashMap慢一点,而在迭代访问时反而更快,因为是通过链表维护内部次序。

最后一个是TreeMap,基于红黑树实现,查看键或者键值对时,他们会被排序,TreeMap的特点是,得到的结果是经过排序的,TreeMap是唯一带有subMap()方法的Map,可返回一个子树。

暂时来说,最重要的还是了解不同集合框架的区别和使用场合,在实际应用中明白使用哪个更高效合理再去研究具体是怎么实现。