leisurexi's Blog.

Collection

字数统计: 1.9k阅读时长: 7 min
2019/05/18 Share

Collection是一个接口,是高度抽象出来的集合,它包含了集合的基本操作和属性。

什么是集合

集合是存储对象的容器,面相对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,存储对象,集合是存储对象最常用的一种方式。

集合的出现就是为了持有对象。集合中可以存储任意类型,而且长度可变。在程序中有可能无法预知需要多少个对象,那么用数组来装对象的话,长度不好定义,而集合解决了这样的问题。

集合和数组的区别

  • 数组的长度是固定的,集合长度是可变的。
  • 数组中可以存储基本数据类型,集合只能存储对象(Java集合实际存放的只是对象的引用,每个集合元素都是一个引用变量,实际内容都放在堆内存或方法区里面,但是基本数据类型是在栈内存上分配空间的,栈上的数据随时就会被收回)。
  • 数组中存储数据类型是单一的,集合中可以存储任意类型的对象。

集合接口

上图是Java集合框架图,这边我们就只先看Iterator接口、Collection接口和其子接口。

Iterator简介

Iterator的定义如下:

1
public interface Iterable<T> {}

Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。

注意:Iterator遍历Collection时,是fail-fast机制的。即,当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛ConcurrentModificationException异常,产生fail-fast事件。

1
2
3
4
// Iterator的API
abstract boolean hasNext()
abstract E next()
abstract void remove()

ListIterator简介

ListIterator的定义如下:

1
public interface ListIterator<E> extends Iterator<E> {}

ListIterator是一个继承于Iterator的接口。它是队列迭代器,专门用于遍历List,能提供向前/向后遍历。相比于Iterator,它新增了添加、是否存在上一个元素、获取上一个元素等API接口。

1
2
3
4
5
6
7
8
9
10
11
12
13

// 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简介

Collection的定义如下:

1
public interface Collection<E> extends Iterable<E> {}

它是一个接口,是高度抽象出来的集合,它包含了集合的基本操作:添加、删除、情况、遍历、是否为空、获取大小、是否保护某元素等等。一个Collection代表一组Object,即Collection的元素;Collection接口存储一组不唯一,无序的对象。

Collection接口的所有子类(直接子类或间接子类)都必须实现2中构造函数:不带参数的构造函数和参数类型为Collection的构造函数。带参数的构造函数,可以用来转换Collection的类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 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简介

List的定义如下:

1
public interface List<E> extends Collection<E> {}

List是一个继承于Collection的接口,即List是集合的一种。List是有序的队列,List中的每一个元素都有一个索引;第一个元素的索引是0,往后的元素的索引值依次+1,而且允许有相同的元素。List接口存储一组不唯一,有序的对象。

关于API方面。既然List是继承于Collection接口,它自然就包含了Collection中的全部函数接口;由于List是有序队列,它也有自己额外的API接口。主要有添加、删除、获取元素、修改指定位置的元素、获取List中的子队列等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 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简介

Set的定义如下:

1
public interface Set<E> extends Collection<E> {}

Set是一个继承于Collection的接口,Set具有和Collection完全一样的接口,只是行为上不同,Set不保存重复的元素。Set接口存储一组唯一,无序的对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 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的区别

  • Set接口实例存储的无序的、不重复的数据;List接口实例存储的是有序的、可以重复的数据。
  • Set检索效率低下,删除和插入效率高,插入和删除并不会引起元素位置改变。
  • List和数组类型,可以动态增长,根据实际存储的数据长度自动增长List的长度。查找元素效率高,插入、删除效率低,因为会引起其他元素的位置改变。

集合实现类

Java提供了一套实现了Collection接口的标准集合类。其中一些事具体类,这些类可以直接拿来使用,而另外一些是抽象类,提供了接口的部分实现。

  • AbstractCollection
    • 实现了大部分Collection接口的方法。
  • AbstractList
    • 继承于AbstractCollection,并且实现了大部分List接口的方法。
  • AbstractSequentialList
    • 继承于AbstractList,提供了对数据元素的链式访问而不是随机访问。
  • LinkedList
    • 实现了List接口,允许有null(空)元素;主要用于创建链表数据结构。该类不是同步的,多线程情况下不要使用。
    • LinkedList查找效率低。
  • ArrayList
    • 实现了List接口,实现了可变大小的数组,随机访问和遍历元素时,提供更好的性能。该类也是非同步的,在多线程情况下不要使用。ArrayList增长当前长度的50%。
    • ArrayList插入、删除效率低。
  • AbstractSet
    • 继承于AbstractCollection,并且实现了大部分Set接口的方法。
  • HashSet
    • 实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,但最多只能一个。
  • LinkedHashSet
    • 继承HashSet,实现了Set接口。具有可预知迭代顺序。
  • TreeSet
    • 实现了Set接口,可以根据元素的大小进行排序。

总结

  1. 集合是一个对象,可容纳其他对象的引用。集合接口声明每一中类型的集合可以执行的操作。
  2. 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要强制类型转换。
CATALOG
  1. 1. 什么是集合
  2. 2. 集合和数组的区别
  3. 3. 集合接口
    1. 3.1. Iterator简介
    2. 3.2. ListIterator简介
    3. 3.3. Collection简介
    4. 3.4. List简介
    5. 3.5. Set简介
  4. 4. 集合实现类
  5. 5. 总结