Java集合――Collection接口

匿名 (未验证) 提交于 2019-12-02 21:40:30

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方法具有一致的返回值。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!