Java集合框架
Java最初提供了Vector、Stack、Hashtable、BitSet与Enumeration接口。Java集合类库将接口(interface)与实现(implementation)分离。
集合类的基本接口为Collection泛型接口,基本方法为:
public interface Collection<E>
{
boolean add{E element};
Iterator<E> iterator();
}
add()方法实现添加元素,成功后返回true,若未发生变化则返回false。
Iterator泛型接口包括四个方法:
public interface Iterator<E>
{
E next();
boolean hasNext();
void remove();
default void forEachRemaining(Consumer<? super E> action);
}
Collection接口扩展了Iterable接口,任何集合可使用for each循环,也可调用forEachRemaining方法并提供一个用于处理一个元素的lambda表达式。
访问元素的顺序取决于集合类型。
Iterator接口的remove方法将会删除上次调用next方法时返回的元素。两个方法存在依赖性,若调用remove前未使用next这不合法。
set接口等同于Collection接口,但不允许添加重复元素,equals方法仅比较是否包含相同元素,不要求顺序相同。hashCode方法定义保证包含相同元素的两个集合将得到相同的散列码。
具体集合
Java中具体集合包括:ArrayList、LinkedList、ArrayDeque、HashSet、TreeSet、EnumSet、LinkedHashSet、PriorityQueue、HashMap、TreeMap、EnumMap、LinkedHashMap、WeakHashMap(值不会在别处使用时,就会被垃圾回收的一个映射)、IdentifyHashMap(使用==而不是equals比较键)。
映射(map)以key-value实现快速找寻某个元素的所有副本
链表LinkedList
链表解决了数组和数组列表删除元素时需要把之后所有元素前移导致开销很大的缺陷。Java中都是双向链表,一个Link包含:data、next、previous,删除元素时需要更新周围的链接。
访问数据需通过迭代器。
数组列表ArrayList
通过get和set方法随机访问元素。
动态数组可能会使用Vector,该类的所有方法都是同步的,可使两个线程安全地访问同一个Vector对象,ArrayList方法不同步,可用于不需要同步使用时节省时间\
散列集HashSet
散列表由链表数组实现。需要指定初始桶数,用于收集具有相同散列值的桶的数目,插入元素时桶中已有元素则会产生散列冲突,降低检索性能。桶数通常设定为预计元素个数的75%~150%。设定装填因子(load factor)确定当散列表被装填到何种程度时进行再散列。
LinkedHashMap
按照插入顺序保存键,保留HashMap的访问速度。
树集TreeSet
树集是一个有序集合,可以以任意顺序插入元素。当前树集排序使用红黑树实现。
添加元素比散列集慢,但当集合中相同元素较多,树集会更为适用。
队列、双端队列与优先队列
队列允许高效在尾部添加元素、头部删除元素。双端队列在头尾部都可高效添加或删除元素。
优先队列可按照任意顺序插入,但按有序顺序检索,remove方法实现删除优先队列中最小的元素。使用堆实现。
典型用法是任务调度:每个任务有一个优先级,任务随机添加进队列,以优先级顺序启动新任务。