Java集合――Collection接口
摘要:本文主要介绍了Java集合的Collection接口。
概述
Collection是一个接口,是高度抽象出来的集合,它包含了集合的基本操作和属性。Collection包含了List和Set两大分支。
常用方法
添加单个元素:boolean add(Object object);
添加一个集合里的所有元素:boolean addAll(Collection<? extends E> collection);
删除单个元素:boolean remove(Object object);
删除指定集合里有的元素:boolean removeAll(Collection collection);
删除两个集合都有的元素:boolean retainAll(Collection collection);
判断是否包含某个元素:boolean contains(Object object);
判断是否包含指定集合的所有元素:boolean containsAll(Collection<?> collection);
判断集合是否为空:boolean isEmpty();
清除集合里的元素:void clear();
获取集合元素个数:int size();
将集合转换为数组:Object[] toArray();
将集合转换为指定类型的数组:<T> T[] toArray(T[] array);
获取集合迭代器:Iterator iterator();
集合同数组的比较
数组长度一旦固定,不能再改变,集合的长度是可以改变的。
数组只能保存相同类型的数据,集合可以保存指定类型或其子类型的数据。
数组在使用的时候相对比较麻烦,集合可以利用多种方法,还有工具类。
List接口
List接口继承自Collection接口,允许定义一个重复的有序集合,集合中的每个元素都有对应的一个索引,可以通过索引访问List中的元素。
实现List接口的实现类主要有:ArrayList、LinkedList、Vector、Stack。
特点
允许重复。
有序,取出的顺序和插入的顺序一致。
为每一个元素提供一个索引值,默认从0开始。
常用方法
在指定索引位置添加单个元素:void add(int index, Object object);
在指定索引位置添加一个集合:boolean addAll(int index, Collection<? extends E> collection);
获取指定位置的单个元素:Object get(int index);
获取指定元素的出现的第一个索引:int indexOf(Object object);
获取指定元素的出现的最后一个索引:int lastIndexOf(Object object);
获取指定位置的集合,包含起始位置,不包含结束位置:List<E> subList(int fromIndex, int toIndex);
获取集合迭代器:ListIterator<E> listIterator();
ArrayList类
特点
ArrayList是动态数组结构,也是我们最常用的集合,允许任何符合规则的元素插入,包括null。
ArrayList提供了索引机制,可以通过索引迅速查找元素,查找效率高。但是每次增加或删除元素时,身后的元素都要移动,所以增删效率低。
ArrayList的操作是非同步的,是线程不安全的。
扩容机制
数组结构都会有容量的概念,ArrayList的初始容量为10,加载因子是1,当快插入元素后长度超出原有长度时会进行扩增,扩容增量是0.5,扩增后容量为1.5倍,可使用方法手动扩容和缩减。
如果一开始就明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间和效率。
Vector类
特点
与ArrayList相似,它的操作与ArrayList几乎一样。
Vector是同步的,是线程安全的动态数组,但是效率低。
扩容机制
初识容量为10,加载因子为1,扩容增量是1,扩增后容量为原来长度的2倍,适用于数据量大的环境。
LinkedList类
特点
LinkedList是双向链表结构,额外提供了操作列表首尾元素的方法,因为不是数组结构,所以不存在扩容机制。
LinkedList使用了链表结构,通过修改前后两个元素的链接指向实现增加和删除操作,增删效率高,但是查找操作必须从开头或者结尾便利整个列表,所以查找效率低。
LinkedList的操作是非同步的,是线程不安全的。
特殊方法
在开头位置插入元素:void addFirst(Object object);
在结尾位置插入元素:void addLast(Object object);
删除开头位置的元素并返回:Object removeFirst();
删除结尾位置的元素并返回:Object removeLast();
获取开头位置的元素:Object getFirst();
获取结尾位置的元素:Object getLast();
Set接口
Set接口继承自Collection接口,允许定义一个不重复的无序集合,集合中只允许存在一个null值。
实现Set接口的实现类主要有:HashSet、LinkedHashSet、TreeSet。
特点
不可以重复,只能插入一个空值。
无序,不能保证插入的顺序和输出的顺序一致。
没有索引。
HashSet类
特点
HashSet的底层是HashMap。
HashSet使用了一个散列集存储数据,通过元素的Hash值进行排序,不能保证插入和输出的顺序一致。
HashSet不能插入重复的元素,只能存在一个null值。
HashSet内部通过哈希表进行排序,具有很好的查找和存取功能。
HashSet是非同步的,线程不安全。
扩容机制
和HashMap相同。
LinkedHashSet类
特点
LinkedHashSet继承自HashSet,其底层是基于LinkedHashMap来实现的。
LinkedHashSet使用链表维护元素的次序,同时根据元素的hash值来决定元素的存储位置,遍历集合时候,会以元素的添加顺序访问集合的元素。
LinkedHashSet不能插入重复的元素,只能存在一个null值。
LinkedHashSet插入性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能。
LinkedHashSet是非同步的,线程不安全。
扩容机制
和HashMap相同。
TreeSet类
特点
TreeSet的底层是TreeMap。
TreeSet基于二叉树结构,可以实现自然排序。
TreeSet通过比较方法的返回值来判断元素是否相等,因此不能添加null的数据,不能添加重复元素,只能插入同一类型的数据。
TreeSet支持两种排序方式,自然排序和定制排序。
自动排序:添加自定义对象的时候,必须要实现Comparable接口,并要覆盖compareTo方法来自定义比较规则。
定制排序:创建TreeSet对象时,传入Comparator接口的实现类。要求Comparator接口的compare方法的返回值和两个元素的equals方法具有一致的返回值。