在Java中,如果一个Java对象可以在内部持有若干其他Java对象,并对外提供访问接口,我们把这种Java对象称为集合,故Java的数组也可以看作是一种集合。集合的原因有两个:一、数组初始化后大小不可变;二、数组只能按索引顺序存取
集合总体框架
Java 集合框架为不同类型的集合定义了大量接口,集合有两个基本接口:Collection 和 Map。
Collection
Java标准库自带的java.util包提供了集合类:Collection,它是除Map外所有其他集合类的根接口。Java实现的集合类主要有两个特点,一是实现了接口和实现类相分离,例如,有序表的接口是List,具体的实现类有ArrayList,LinkedList等,二是支持泛型,我们可以限制在一个集合中只能放入同一种数据类型的元素,最后,Java访问集合总是通过迭代器(Iterator)来实现,它最明显的好处在于无需知道集合内部元素是按什么方式存储的。Java的java.util包主要提供了以下三种类型的集合:
List:一种有序列表的集合
Set:一种保证没有重复元素的集合
Map:一种通过键值(key-value)查找的映射表集合
此外,由于历史原因,有小部分集合已经不推荐使用了,但是又不能直接从包中删除,因为可能会影响别的基础包,例如:
Hashtable:一种线程安全的Map实现;
Vector:一种线程安全的List实现;
Stack:基于Vector实现的LIFO的栈;
为什么不推荐使用呢,线程安全但是性能不佳,重点是这是最初的实现,现在已被java.util.concurrent包里的集合代替了,还有不推荐使用的接口Enumeration<E>:已被Iterator取代,还有一个小细节:链表与泛型集合之间有一个重要的区别,链表是一个有序集合(ordered collection), 每个对象的位置十分重要。
List
在集合类中,List是最基础的一种集合:它是一种有序列表。List的行为和数组几乎完全相同,放入元素的先后顺序存放,每个元素都可以通过索引确定自己的位置,List的索引和数组一样,从0开始。也正是因为这些特性,所以List集合也是用的最多的集合;主要接口有:
在末尾添加一个元素:void add(E e)
在指定索引添加一个元素:void add(int index, E e)
删除指定索引的元素:int remove(int index)
删除某个元素:int remove(Object e)
获取指定索引的元素:E get(int index)
获取链表大小(包含元素的个数):int size()
List接口有两种实现,一种通过数组实现的ArrayLIst,还有一种是通过链表实现的LinkedList,主要区别是:
通常选用ArrayList集合,需要经常查找可用ArrayList集合,经常增删就用LinkedList集合
List的特点
List接口允许我们添加重复的元素
允许添加null
List的遍历
我们可以用用for循环根据索引配合get(int)方法遍历,但是不推荐这么使用,原因有两个,一是代码复杂,二是因为get(int)方法只有ArrayList的实现是高效的,换成LinkedList后,索引越大,访问速度越慢。所以,遍历List集合一定要用迭代器Iterator!
欢迎大家批评指正,指出问题,谢谢!