JAVA基础(3)——容器(1)——常用容器分类

来源:互联网 发布:excuse me网络意思 编辑:程序博客网 时间:2024/05/16 07:57

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): booleanadd(int, E): voidaddAll(Collection<? extends E>): booleanaddAll(int, Collection<? extends E>): booleanclear(): voidcontains(Object): booleancontainsAll(Collection<?>): booleanequals(Object): booleanget(int): EhashCode(): intindexOf(Object): intisEmpty(): booleaniterator(): Iterator<E>lastIndexOf(Object): intlistIterator(): ListIterator<E>listIterator(int): ListIterator<E>remove(int): Eremove(Object): booleanremoveAll(Collection<?>): booleanreplaceAll(UnaryOperator<E>): voidretainAll(Collection<?>): booleanset(int, E): Esize(): intsort(Comparator<? super E>): voidspliterator(): 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): booleanelement(): Eoffer(E): booleanpeek(): Epoll(): Eremove(): E

为了更清晰的表达Queue的语义,存在一些和Collection重复的定义。

2.3 Set容器接口

Set是无序集合的接口:

public interface Set<E> extends Collection<E>

描述了方法:

add(E): booleanaddAll(Collection<? extends E>): booleanclear(): voidcontains(Object): booleancontainsAll(Collection<?>): booleanequals(Object): booleanhashCode(): intisEmpty(): booleaniterator(): Iterator<E>remove(Object): booleanremoveAll(Collection<?>): booleanretainAll(Collection<?>): booleansize(): intspliterator(): Spliterator<E>toArray(): Object[]toArray(T[]): T[]

3. Map

Map是Map层级结构中的根接口,维护键/值对,描述不重复的一对一的键到值的映射。
Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。
将可变对象用作映射键时必须格外小心,最好不要这样使用。

其接口为:

public interface Map<K,V>

主要描述映射关系的操作:

clear(): voidcompute(K, BiFunction<? super K, ? super V, ? extends V>): VcomputeIfAbsent(K, Function<? super K, ? extends V>): VcomputeIfPresent(K, BiFunction<? super K, ? super V, ? extends V>): VcontainsKey(Object): booleancontainsValue(Object): booleanentrySet(): Set<Entry<K, V>>equals(Object): booleanforEach(BiConsumer<? super K, ? super V>): voidget(Object): VgetOrDefault(Object, V): VhashCode(): intisEmpty(): booleankeySet(): Set<K>merge(K, V, BiFunction<? super V, ? super V, ? extends V>): Vput(K, V): VputAll(Map<? extends K, ? extends V>): voidputIfAbsent(K, V): Vremove(Object): Vremove(Object, Object): booleanreplace(K, V): Vreplace(K, V, V): booleanreplaceAll(BiFunction<? super K, ? super V, ? extends V>): voidsize(): intvalues(): Collection<V>

4. Collections

Collections是容器工具类,主要提供一些排序算法。如:

List list = new ArrayList(); …Collections.sort(list);//顺序排序Collections.shuffle(list);//乱序Collections.reverse(list);//逆序Collections.binarySearch(list, obj);//二分查找返回obj在list中的位置
0 0
原创粉丝点击