java基础一:Collection

写在开始

作为java基础知识中的核心组成,collection类的重要性不言而喻,另外集合也是java面向对象特性的重要体现,这篇文章试图揭示一部分java中collection类的特性用法,毕竟合理地选用数据结构可以大大简化我们的算法复杂度,更何况collection类中封装了那么多的现成方法^_^!

Collection类的特点

collection类似于数组的概念,是一堆数据的集合,因此可以认为collection是数据结构的体现。基础的C语言中数据结构分为顺序表(数组)、链表、栈、队列、树、图等,这些数据结构在collection类中几乎都有子类与之对应。另外,上述的数据结构只能存储相同类型的数据,但是collection类还可以存储不同类型的数据。C语言中数据结构的类型可以自行定义,可以是数值类型也可以地址/指针类型,但是java语言中collection中只能存储引用类型,如自定义类、String、装箱类型等,注意如果要存储的数据是普通的数据类型,在存储时将自动升级为装箱类型,例如:

1
//Integer、Long、Byte、Short、Float、Double、Chararcter、Boolean

注意所有collection的子类的长度都不是固定的,即没有与数组对等的类型。

Collection包含的类型

collection主要包含两大类型:List 和Set它们都属于父类接口,分别实现这两个子类接口的是:ArrayList、LinkedList、Vector、Stack;HashSet,TreeSet等,下面依次介绍它们的联系和区别。

Set和List

Set和List的区别主要体现在是否允许内部数据重复和数据是否有序,List中的数据允许重复,并且可以对其中数据排序,其插入或移动数据的效率较高。Set中不允许其中出现重复的数据,数据插入和移动的效率较低。

ArrayList、LinkedList和Vector

实现List接口的几个类具备类似于线性表的功能,能够准确控制数据元素插入的位置和顺序,允许相同元素在List中同时存在,只是在实现方式上有所差别

类名 实现方式 是否线程安全 特点
ArrayList 动态数组 按照下标查找比较快速插入删除数据消耗大
LinkedList 链表 插入删除效率高,查找数据效率低
Vector 动态数组 使用耗时长但是线程同步

HashSet和TreeSet

HashSet与TreeSet的区别在于,HashSet为Hash结构其中数据不存在顺序,TreeSet数据已经拍好顺序,采用的排序方法是二叉树排序。

封装方法

实现实例

1
2
3
4
5
6
7
8
9
10
11
List<E>name=new ArrayList<E>();//ArrayList实例,E为泛型

List<E>name=new LinkedList<E>();//LinkedList实例

Stack<E>name=new Stack<E>(); //Stack实例

Vector<E>name=new Vector<E>(); //Vector实例

HashSet<E>name=new HashSet<E>(); //HashSet实例

TreeSet<E>name=new TreeSet<E>();//TreeSet实例

通用方法

1
2
3
4
5
6
7
8
9
size();  //返回尺寸

contains(Object); //是否包含某一对象

add(E); //添加元素,在末尾

remove(Obeject); //移除指定元素

addAll(Collection); //将Collection中的全部数据添加进现在的Collection中

迭代器Iterator

使用方法

类似于C++中的vector,java Collection类也提供了迭代器方法,

1
2
3
4
5
6
7
Iterator<E> it= ListName.iterator();//返回一个头部的Iterator
while(it.hasNext())
{
it.next(); //遍历访问下一个元素
it.remove(); //移除当前元素,注意先next()再remove
...
}

与for循环相比

for循环使用get()方法来根据下标获取数据元素,iterator像是链表访问数据的方式,实际上for 循环加get()的方法效率更高,但是涉及到增删的情况就不如用iterator了。另外使用itarator遍历List还是Set代码不用修改,但是for循环要相应的做出修改。