JAVA基础系列规划:
- JAVA基础(1)——基本概念
- JAVA基础(2)——数据类型
- JAVA基础(3)——容器(1)——常用容器分类
- JAVA基础(4)——容器(2)——普通容器
- JAVA基础(5)——并发(1)——总体认识
- JAVA基础(6)——并发(2)——原子
- JAVA基础(7)——并发(3)——锁机制
- JAVA基础(8)——并发(4)——线程池
- JAVA基础(9)——容器(3)——并发容器
- JAVA基础(10)——IO、NIO
- JAVA基础(11)——泛型
- JAVA基础(12)——反射
- JAVA基础(13)——序列化
- JAVA基础(14)——网络编程
从元素存储的角度看,容器是存储元素的单元,这样来看,数据类型都是容器。在这里,遵从jdk的定义,将容器定义为jvm持有对象的单元。Java类库提供了一套相当完整的容器类,使用这些类的方法可以保存和操纵对象。以下内容基于jdk1.8。
1. 常用容器分类
(图片来自网络,已忘记出处,见谅)
- 在这里,集合类分为了Map和Collection两个大的类别。
- 图片左上角的那一块灰色里面的四个类(Dictionary、HashTable、Vector、Stack)都是线程安全的,但是它们都是JDK的老的遗留类,现在基本都不怎么使用了,都有了对应的取代类。其中Map是用来代替图片中左上角的那个Dictionary抽象类(Map的官方文档里面有说明)。官方推荐使用Map接口来代替它。同样对于HashTable,官方推荐ConcurrentHashMap来代替。接着下面的Vector是List下面的一个实现类。
- 图片最上面的粉红色部分是集合类所有接口关系图。其中Map的结构比较简单,而Collection的结构就相对复杂一些。Collection有三个继承接口:List、Queue和Set。
- 接下来绿色部分则是集合类的主要实现类了。这也是我们最经常使用的集合类了。
- 最下方的一个整块都是java.util.concurrent包里面的类,按照包名我们就可以知道这个包里面的类都是用来处理Java编程中各种并发场景的
按照实现接口分类
- 实现Map接口的有:EnumMap、IdentityHashMap、HashMap、LinkedHashMap、WeakHashMap、TreeMap
- 实现List接口的有:ArrayList、LinkedList
- 实现Set接口的有:HashSet、LinkedHashSet、TreeSet
- 实现Queue接口的有:PriorityQueue、LinkedList、ArrayQueue
根据底层实现的数据结构分类
- 底层以数组的形式实现:EnumMap、ArrayList、ArrayQueue
- 底层以链表的形式实现:LinkedHashSet、LinkedList、LinkedHashMap
- 底层以hash table的形式实现:HashMap、HashSet、LinkedHashMap、LinkedHashSet、WeakHashMap、IdentityHashMap
- 底层以红黑树的形式实现:TreeMap、TreeSet
- 底层以二叉堆的形式实现:PriorityQueue
并发容器
- ConcurrentHashMap、ConcurrentSkipListHashMap
- LinkedTransferQueue、CopyOnWriteArrayList、ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、LinkedBlockDeque、DelayQueue、SynchronusQueue
- ConcurrentSkipListSet、CopyOnWriteArraySet
2. Collection
Collection源自jdk1.2,是collection的根接口,collection代表着一组对象,这组对象就是collection的元素。
public interface Collection<E> extends Iterable<E>
在Collection接口中描述了collection操作的通用操作size、isEmpty、contains、iterator、toArray、add、remove、containsAll、addAll、removeAll、retainAll、clear、equals、hashCode,这些方法都是实现类需要实现的。jdk1.8添加了已实现的default方法removeIf、spliterator、stream、parallelStream。
关于default方法
jdk1.8开始,接口中可以添加已实现的方法,这种方法叫default方法。default方法的含义是当一个类实现一个接口的时候,它可以实现接口中的default方法,但这不是必须的。多继承时,default方法名和其他接口中方法名相同时,必须在实现类中实现该方法名的方法。
Iterable接口从jdk1.5出现,描述了遍历的通用操作iterator,同时在jdk1.8添加了default方法forEach、spliterator。
jdk并不提供对Collection的直接实现,而是对Collection进行了细分,提供更加细化的子接口List、Queue、Set。
2.1 List容器接口
List中的数据有序且可以重复,可随机存取数据。其接口:
public interface List<E> extends Collection<E>
描述了方法:
add(E): boolean
add(int, E): void
addAll(Collection<? extends E>): boolean
addAll(int, Collection<? extends E>): boolean
clear(): void
contains(Object): boolean
containsAll(Collection<?>): boolean
equals(Object): boolean
get(int): E
hashCode(): int
indexOf(Object): int
isEmpty(): boolean
iterator(): Iterator<E>
lastIndexOf(Object): int
listIterator(): ListIterator<E>
listIterator(int): ListIterator<E>
remove(int): E
remove(Object): boolean
removeAll(Collection<?>): boolean
replaceAll(UnaryOperator<E>): void
retainAll(Collection<?>): boolean
set(int, E): E
size(): int
sort(Comparator<? super E>): void
spliterator(): Spliterator<E>
subList(int, int): List<E>
toArray(): Object[]
toArray(T[]): T[]
2.2 Queue容器接口
Queue是先进先出的队列接口:
public interface Queue<E> extends Collection<E>
描述了方法:
add(E): boolean
element(): E
offer(E): boolean
peek(): E
poll(): E
remove(): E
为了更清晰的表达Queue的语义,存在一些和Collection重复的定义。
2.3 Set容器接口
Set是无序集合的接口:
public interface Set<E> extends Collection<E>
描述了方法:
add(E): boolean
addAll(Collection<? extends E>): boolean
clear(): void
contains(Object): boolean
containsAll(Collection<?>): boolean
equals(Object): boolean
hashCode(): int
isEmpty(): boolean
iterator(): Iterator<E>
remove(Object): boolean
removeAll(Collection<?>): boolean
retainAll(Collection<?>): boolean
size(): int
spliterator(): Spliterator<E>
toArray(): Object[]
toArray(T[]): T[]
3. Map
Map是Map层级结构中的根接口,维护键/值对,描述不重复的一对一的键到值的映射。
Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。
将可变对象用作映射键时必须格外小心,最好不要这样使用。
其接口为:
public interface Map<K,V>
主要描述映射关系的操作:
clear(): void
compute(K, BiFunction<? super K, ? super V, ? extends V>): V
computeIfAbsent(K, Function<? super K, ? extends V>): V
computeIfPresent(K, BiFunction<? super K, ? super V, ? extends V>): V
containsKey(Object): boolean
containsValue(Object): boolean
entrySet(): Set<Entry<K, V>>
equals(Object): boolean
forEach(BiConsumer<? super K, ? super V>): void
get(Object): V
getOrDefault(Object, V): V
hashCode(): int
isEmpty(): boolean
keySet(): Set<K>
merge(K, V, BiFunction<? super V, ? super V, ? extends V>): V
put(K, V): V
putAll(Map<? extends K, ? extends V>): void
putIfAbsent(K, V): V
remove(Object): V
remove(Object, Object): boolean
replace(K, V): V
replace(K, V, V): boolean
replaceAll(BiFunction<? super K, ? super V, ? extends V>): void
size(): int
values(): Collection<V>
4. Collections
Collections是容器工具类,主要提供一些排序算法。如:
List list = new ArrayList(); …
Collections.sort(list);//顺序排序
Collections.shuffle(list);//乱序
Collections.reverse(list);//逆序
Collections.binarySearch(list, obj);//二分查找返回obj在list中的位置