您的位置:首页 > 编程语言 > Java开发

Java集合简介

2017-03-22 00:24 225 查看

Java集合简介

集合相关接口

Iterator和Iterable

Iterator

功能说明

Iterator表示对Collection进行迭代的迭代器,功能比之前使用的Enumeration更加完善,取代了Enumeration,与其不同的地方有以下两点:

允许调用者利用定义良好的语义在迭代期间从迭代器所指向的collection中删除元素;

方法的名称得到了改进(见名知义);

方法说明

boolean hasNext()


如果仍有元素可以迭代,则返回
true


T next()


返回迭代的下一个元素。

void remove()

从迭代器指向的集合中移除迭代器返回的最后一个元素。

forEachRemaining()

Java 1.8之后新增:未被迭代器迭代处理的元素仍保留自己的一些Action操作

Iterable

功能说明

一个类实现了Iterable接口后,就可以对它的对象实例进行for-each遍历。

实际上,类似于Xxxable这类的接口,通常都是使其实现类具有某种本来没有的功能,如

实现Comparable就可以于T类对象进行比较;

实现Serializable就可以进行序列化等;

方法说明

Iterator<T> iterator()


获取一个迭代器

void forEach(Consumer<? super T> action)


在未被迭代器处理之前,仍可进行起已有的action(也就是说在未被迭代处理之前,集合中的元素仍然是独立的,可以进行自身已经定义好的各种action操作),默认实现如下:

default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}


Spliterator<T> spliterator()


在当前Iterable描述的元素基础之上创建一个Spliterator对象,默认实现如下:

default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}


那么何为Spliterator呢,其实就是Iterator的split版本,可以讲需要进行的迭代的集合拆分成多个Iterator来处理,来更好的适应高并发,该接口时java 1.8之后新加的。

Collection和Map

Collection和Map虽都是与集合处理有关的接口,但二者之间并没有直接联系。

Collection(接口)

Collection是集合类的根接口,java中无该接口的直接实现类。但有两个接口继承于Collection,分别是
Set
List


AbstractCollection

Collection接口的部分实现

Set(接口)

Set 不能包含重复的元素,无序(TreeSet是二叉排序树)。

SortedSet(接口)

有序的Set,其中E必须实现
Comparable
接口(或者被指定的比较器所接受),所有这些元素都必须是可互相比较的。

AbstractSet(抽象类)

提供了Set接口的部分实现。

HashSet(实现类)

此实现不是同步的,即不是线程安全的,要得到同步的HashSet,方法如下:

Set s = Collections.synchronizedSet(new HashSet());


TreeSet(实现类)

此实现不是同步的,即不是线程安全的,要得到同步的TreeSet,方法如下:

Set s = Collections.synchronizedSortedSet(new TreeSet());


List

List是一个有序的集合,可以包含重复元素,且可以通过索引方式来访问。

AbstractList

List接口的部分实现。

实现不可修改的列表,只需实现get(int)和size()方法的实现。

实现可修改的列表(列表大小不可变),还要重写set(int, E)方法。

实现可修改的列表(列表大小可变),要重写set(int, E)、add(int, E)和remove(int)。

不必提供迭代器实现

AbstractSequentialList

AbstractList的进一步实现,提供的抽象方法只有一个,如下:

public abstract ListIterator<E> listIterator(int index);


也就是说实现该类只要实现
listIterator(int index)
方法即可,它的其他方法实现上都依赖于上面这个方法。

LinkedList是它的具体实现。

ArrayList(实现类)

List
接口的大小可变数组的实现。(大致功能等同于Vector类,但要注意,此实现不是同步的,即不是线程安全的),默认列表长度为10。

Vector(实现类)

它是同步的,即线程安全的可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,
Vector
的大小可以根据需要增大或缩小,以适应创建
Vector
后进行添加或移除项的操作。

LinkedList(实现类)

List
接口的链接列表实现。注意,此实现不是同步的,即不是线程安全的

Queue(接口)

队列,在处理元素前用于保存元素的集合,通常一FIFO(先进先出)的方式排序各个元素(优先级队列和LIFO队列除外)。

每个队列的实现必须指定其顺序属性

BlockingQueue

支持两个附加操作的队列,即put(E e)(存储元素时等待队列空间变得可用)和take()(获取元素时等待队列变为非空)。

BlockingQueue的实现是线程安全的

Deque(接口)

一个线性集合,支持在两端插入和移除元素。名称 deque 是“double ended queue(双端队列)”的缩写,通常读为“deck”。大多数
Deque
实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。

BlockingDeque

支持两个附加操作的
Queue
,这两个操作是:获取元素时等待双端队列变为非空;存储元素时等待双端队列中的空间变得可用。对应的方法分别是:

// 头部
putFirst(E e);
E takeFirst();
// 尾部
putLast(E e);
E takeLast();


BlockingDeque的实现是线程安全的

Map(接口)

Map中包含了K-V对,不能包含重复的key,但可以包含相同的value,无序(TreeMap是二叉排序树)。
Map
接口提供三种集合视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容,对应的方法分别是:

// 映射关系集合
Set<Map.Entry<K,V> entrySet()
// 键值集合
Set<K> keySet();
// 值的集合
Collection<V> values();


Entry

SortedMap(接口)

进一步提供关于键的总体排序 的 Map。该映射是根据其键的自然顺序进行排序的,或者根据通常在创建有序映射时提供的 Comparator 进行排序。对有序映射的 collection 视图(由 entrySet、keySet 和 values 方法返回)进行迭代时,此顺序就会反映出来。

内容比较多,看来一个晚上写不完,未完待续。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java