首先,要明白,List 接口 和Set接口 是Collection 接口的子接口.
List接口
List是有序的Collection,次序是List最重要的特点:它保证维护元素特定的顺序。使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。和下面要提到的Set不同,List允许有相同的元素。
除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。
实现List接口的常用类有LinkedList,ArrayList,Vector和Stack(继承了Vector类,下面没有算进List接口实现类)。其中,最常用的是LinkedList和 ArrayList两个。
List接口,被实现了3个类.
第一个是Vector ,由于是JDK 版本1.0 就出现了,所以命名和之后的2个类有区别.
第二个 是 ArrayList类.
第三个是 LinkedList 类.
下面来谈谈这三个类的具体区别:
Vector类和ArrayList类底层都是利用数组实现的,区别在于 Vector是线程安全的,ArrayList是线程不安全的.也因此,Vector相对执行速度慢一点,ArrayList执行速度相对快一点.
ArrayList类 和 LinkedList类,前面说了,ArrayList是数组实现的,线程不安全,而Linkedlist 底层是由链表实现的,线程也不安全.(这2个类是实际开发中比较常用的)
Set接口
Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面有几个不同的List。实际上Set就是 Collection,只是行为不同。(这是继承与多态思想的典型应用:表现不同的行为)。其次,Set是一种不包含重复的元素的Collection,加入Set的元素必须定义equals()方法以确保对象的唯一性( 即任意的两个元素e1和e2都有e1.equals(e2)=false),与List不同的是,Set接口不保证维护元素的次序。最后,Set最多有一个null元素。
很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。
请注意:必须小心操作可变对象(Mutable Object)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。
Set接口被实现了2个类.
第一个是 HashSet 类 , 它存储的数据是没有顺序的,迭代器迭代打印时,不会按照插入顺序显示.LinkedHashSet 继承HashSet类, 它和其父类的区别就在于 既具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序).于是在使用迭代器遍历时,结果会按元素插入的次序显示.
第二个是 TreeSet 类 ,它存储的数据是有次序的(即插入的次序),使用它可以从Set提取有序的序列.
小总结:(Map会在之后介绍,勿急)
Collection是对象集合,Collection有两个子接口List和Set
List可以通过下标(1,2..)来取得值,值可以重复
而Set只能通过游标来取值,并且值是不能重复的
ArrayList,Vector,LinkedList是List的实现类
ArrayList是线程不安全的,Vector是线程安全的,这两个类底层都是由数组实现的
LinkedList是线程不安全的,底层是由链表实现的