Collection是一个接口,是高度抽象出来的集合,它包含了集合的基本操做和属性。java
集合是存储对象的容器,面相对象语言对事物的体现都是以对象的形式,因此为了方便对多个对象的操做,存储对象,集合是存储对象最经常使用的一种方式。git
集合的出现就是为了持有对象。集合中能够存储任意类型,并且长度可变。在程序中有可能没法预知须要多少个对象,那么用数组来装对象的话,长度很差定义,而集合解决了这样的问题。github
上图是Java集合框架图,这边咱们就只先看Iterator接口、Collection接口和其子接口。数组
Iterator的定义以下:数据结构
public interface Iterable<T> {}
Iterator是一个接口,它是集合的迭代器。集合能够经过Iterator去遍历集合中的元素。多线程
注意:Iterator遍历Collection时,是fail-fast机制的。即,当某一个线程A经过iterator去遍历某集合的过程当中,若该集合的内容被其余线程所改变了;那么线程A访问集合时,就会抛ConcurrentModificationException异常,产生fail-fast事件。框架
// Iterator的API abstract boolean hasNext() abstract E next() abstract void remove()
ListIterator的定义以下:函数
public interface ListIterator<E> extends Iterator<E> {}
ListIterator是一个继承于Iterator的接口。它是队列迭代器,专门用于遍历List,能提供向前/向后遍历。相比于Iterator,它新增了添加、是否存在上一个元素、获取上一个元素等API接口。性能
// ListIterator的API // 继承于Iterator的接口 abstract boolean hasNext() abstract E next() abstract void remove() // 新增API接口 abstract void add(E object) abstract boolean hasPrevious() abstract int nextIndex() abstract E previous() abstract int previousIndex() abstract void set(E object)
Collection的定义以下:线程
public interface Collection<E> extends Iterable<E> {}
它是一个接口,是高度抽象出来的集合,它包含了集合的基本操做:添加、删除、状况、遍历、是否为空、获取大小、是否保护某元素等等。一个Collection表明一组Object,即Collection的元素;Collection接口存储一组不惟一,无序的对象。
Collection接口的全部子类(直接子类或间接子类)都必须实现2中构造函数:不带参数的构造函数和参数类型为Collection的构造函数。带参数的构造函数,能够用来转换Collection的类型。
// Collection的API abstract boolean add(E object) abstract boolean addAll(Collection<? extends E> collection) abstract void clear() abstract boolean contains(Object object) abstract boolean containsAll(Collection<?> collection) abstract boolean equals(Object object) abstract int hashCode() abstract boolean isEmpty() abstract Iterator<E> iterator() abstract boolean remove(Object object) abstract boolean removeAll(Collection<?> collection) abstract boolean retainAll(Collection<?> collection) abstract int size() abstract <T> T[] toArray(T[] array) abstract Object[] toArray()
List的定义以下:
public interface List<E> extends Collection<E> {}
List是一个继承于Collection的接口,即List是集合的一种。List是有序的队列,List中的每个元素都有一个索引;第一个元素的索引是0,日后的元素的索引值依次+1,并且容许有相同的元素。List接口存储一组不惟一,有序的对象。
关于API方面。既然List是继承于Collection接口,它天然就包含了Collection中的所有函数接口;因为List是有序队列,它也有本身额外的API接口。主要有添加、删除、获取元素、修改指定位置的元素、获取List中的子队列等。
// Collection的API abstract boolean add(E object) abstract boolean addAll(Collection<? extends E> collection) abstract void clear() abstract boolean contains(Object object) abstract boolean containsAll(Collection<?> collection) abstract boolean equals(Object object) abstract int hashCode() abstract boolean isEmpty() abstract Iterator<E> iterator() abstract boolean remove(Object object) abstract boolean removeAll(Collection<?> collection) abstract boolean retainAll(Collection<?> collection) abstract int size() abstract <T> T[] toArray(T[] array) abstract Object[] toArray() // 相比与Collection,List新增的API: abstract void add(int location, E object) abstract boolean addAll(int location, Collection<? extends E> collection) abstract E get(int location) abstract int indexOf(Object object) abstract int lastIndexOf(Object object) abstract ListIterator<E> listIterator(int location) abstract ListIterator<E> listIterator() abstract E remove(int location) abstract E set(int location, E object) abstract List<E> subList(int start, int end)
Set的定义以下:
public interface Set<E> extends Collection<E> {}
Set是一个继承于Collection的接口,Set具备和Collection彻底同样的接口,只是行为上不一样,Set不保存重复的元素。Set接口存储一组惟一,无序的对象。
// Set的API(跟Collection的API彻底同样) abstract boolean add(E object) abstract boolean addAll(Collection<? extends E> collection) abstract void clear() abstract boolean contains(Object object) abstract boolean containsAll(Collection<?> collection) abstract boolean equals(Object object) abstract int hashCode() abstract boolean isEmpty() abstract Iterator<E> iterator() abstract boolean remove(Object object) abstract boolean removeAll(Collection<?> collection) abstract boolean retainAll(Collection<?> collection) abstract int size() abstract <T> T[] toArray(T[] array) abstract Object[] toArray()
Set和List的区别
Java提供了一套实现了Collection接口的标准集合类。其中一些事具体类,这些类能够直接拿来使用,而另一些是抽象类,提供了接口的部分实现。
文章做者:leisurexi
新博客地址:https://leisurexi.github.io/
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文连接及做者。