课时93 | 集合框架:Java如何用接口和类玩转数据结构(上)

来源:互联网 发布:正规淘宝刷平台软件 编辑:程序博客网 时间:2024/04/29 01:33

1.集合框架:

  • 框架是一个类库的集合,集合框架就是一个用来表示和操作集合的统一的架构,它包含了实现集合的接口与类
  • 集合框架中不同的集合类有各自不同的数据结构,所以在使用中要根据应用的性能要求来选择不同的集合类
  • 集合类存放在java.util包中,今后会大量使用集合类和相关接口

2.主要接口集:

这里写图片描述
文章(上)主要讲接口collection下面的子接口功能,其中List接口下的Vector略

2.1 Iterable:迭代器接口

  • 实现该接口允许对象成为“foreach”语句(增强for循环)的目标,即该集合对象允许迭代。
  • 类集接口Collection是Iterable的子接口,所以所有类集对象可以迭代访问,而映射Map不行
  • 构造方法:Iterator iterator() //返回一个在一组T类型的元素上进行迭代的迭代器
  • 方法摘要:
    • boolean hasNext() // 如果仍有元素可以迭代,则返回 true。
    • E next() //返回迭代的下一个元素。
    • void remove() //从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
  • 迭代器Iterator实现了Iterator/ListIterator接口的类的对象,可以通过遍历类集,访问操作其中的每个元素
  • ListIterator扩展了父接口Iterator,允许双向遍历,并可以修改和删除元素

2.2 Collection:类集接口

  • Collection 表示一组对象,这些对象也称为 collection 的元素。
  • JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。
  • 此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。 方法名(Collection c)
  • 方法摘要
    • int size() //返回此 collection 中的元素数。 - Object[] toArray() 返回包含此 collection 中所有元素的数组。
    • Iterator iterator() //返回在此 collection 的元素上进行迭代的迭代器。
    • boolean containsAll(Collection c) //如果此 collection 包含指定 collection 中的所有元素,则返回 true。
    • boolean add(E e) //确保此 collection 包含指定的元素
    • boolean addAll(Collection c) // 将指定 collection 中的所有元素都添加到此 collection 中
    • void clear() //移除此 collection 中的所有元素
    • boolean remove(Object o) // 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
    • boolean removeAll(Collection c) // 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
    • boolean retainAll(Collection c) //仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。
    • boolean contains(Object o) //如果此 collection 包含指定的元素,则返回 true。
    • boolean isEmpty() //如果此 collection 不包含元素,则返回 true。
    • boolean equals(Object o) //比较此 collection 与指定对象是否相等。
    • T[] toArray(T[] a) //返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。
    • boolean isEmpty() //如果此 collection 不包含元素,则返回 true。
    • int hashCode() //返回此 collection 的哈希码值。
        int hashCode = 1;      Iterator<E> i = list.iterator();      while (i.hasNext()) {          E obj = i.next();          hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());      }

2.3 List:列表接口

List容器是有序的collection。此接口的用户可以对List容器中每个元素的插入值进行精确地控制,用户可以根据元素的整数索引(在列表中的值位置)访问元素,并搜索列表中的元素。List容器允许插入重复的值,包括Null

  • List扩展了Collection,特点:有序且可重复的
  • List 接口提供了 4 种对列表元素进行定位(索引)访问方法。列表(像 Java 数组一样)是基于 0 的
  • List 接口提供了特殊的迭代器,称为 ListIterator,除了允许 Iterator 接口提供的正常操作外,该迭代器还允许元素插入和替换,以及双向访问。还提供了一个方法来获取从列表中指定位置开始的列表迭代器。
  • List 接口提供了两种搜索指定对象的方法。从性能的观点来看,应该小心使用这些方法。在很多实现中,它们将执行高开销的线性搜索。
  • List 接口提供了两种在列表的任意位置高效插入和移除多个元素的方法。
  • List从collection扩展的接口方法:
    • ListIterator listIterator()// 返回此列表元素的列表迭代器(按适当顺序)。
    • ListIterator listIterator(int index) // 返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。指定的索引表示 next 的初始调用所返回的第一个元素。previous 方法的初始调用将返回索引比指定索引少 1 的元素。
    • Object[] toArray()//返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。 由于此列表不维护对返回数组的任何引用,因而它将是“安全的”。(换句话说,即使数组支持此列表,此方法也必须分配一个新数组)。因此,调用者可以随意修改返回的数组。
    • boolean containsAll(Collection c)//如果列表包含指定 collection 的所有元素,则返回 true。
    • boolean addAll(int index,Collection c)将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。将当前处于该位置的元素(如果有的话)和所有后续元素向右移动(增加其索引)。
    • void add(int index,E element) //在列表的指定位置插入指定元素(可选操作)。将当前处于该位置的元素(如果有的话)和所有后续元素向右移动(在其索引中加 1)。
    • E remove(int index) //移除列表中指定位置的元素(可选操作)。将所有的后续元素向左移动(将其索引减 1)。返回从列表中移除的元素。
    • E get(int index) //返回列表中指定位置的元素。
    • E set(int index,E element) //用指定元素替换列表中指定位置的元素(可选操作)。
    • int indexOf(Object o) //返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1
    • int lastIndexOf(Object o)// 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
    • List subList(int fromIndex,int toIndex)// 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。(如果 fromIndex 和 toIndex 相等,则返回的列表为空)。

2.4 Queue:队列接口

除了基本的 Collection 操作外,队列还提供其他的插入、提取和检查操作。每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是用于专门为有容量限制的 Queue 实现设计的;在大多数实现中,插入操作不会失败。

  • Queue 实现通常不允许插入 null 元素,尽管某些实现(如 LinkedList)并不禁止插入 null。即使在允许 null 的实现中,也不应该将 null 插入到 Queue 中
  • Queue 实现通常未定义 equals 和 hashCode 方法的基于元素的版本,而是从 Object 类继承了基于身份的版本
  • 方法摘要:
    Queue的三对方法
    • boolean add(E e) // 将指定的元素插入队尾(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException。
    • boolean offer(E e) // 将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(E)
    • E remove() //获取并移除此队列的头。此方法与 poll 唯一的不同在于:此队列为空时将抛出一个异常。
    • E pool() //获取并移除此队列的头,如果此队列为空,则返回 null。
    • E element() // 获取,但是不移除此队列的头。此方法与 peek 唯一的不同在于:此队列为空时将抛出一个异常。
    • E peek() // 获取但不移除此队列的头;如果此队列为空,则返回 null。

2.5 Deque:双端队列接口

一个线性 collection,支持在两端插入和移除元素。名称 deque 是“double ended
queue(双端队列)”的缩写,通常读为“deck”。大多数 Deque

  • Deque支持在队头入元素,在队尾出元素,方法个数是Queue的两倍

这里写图片描述

  • 其中的六种方法与Deque的方法完全等效
    这里写图片描述

  • 其余的六种方法可以实现栈操作(后进先出),完全等效于Stack类的方法,在实现堆栈的数据结构中,应优先使用Deque接口而不是Stack类:
    这里写图片描述

  • 虽然 Deque 实现没有严格要求禁止插入 null 元素,但建议最好这样做。
  • Deque 实现通常不定义基于元素的 equals 和 hashCode 方法,而是从 Object 类继承基于身份的 equals 和 hashCode 方法。
  • 迭代器方法:
    • Iterator iterator() //返回以正序在此双端队列的元素上进行迭代的迭代器。
    • Iterator descendingIterator //返回以逆向顺序在此双端队列的元素上进行迭代的迭代器。
  • 扩展方法:
    • boolean removeFirstOccurrence(Object o) //从队列移除第一次出现的指定元素
    • boolean removeLaseOccurrence(Object 0) //从队列移除最后一次出现的指定元素
  • 在处理队列操作时,尽量用offer(),poll(),peak()方法而不是,add(),remove(),element()。
    在后续做条件判断时,null是一个很好的边界值。

2.6 数据结构的顺序存储VS链式存储

上过数据结构课程的同学应该对上面提到了两种方式不会陌生,看到这里,很显然我们能得到下面的结论:

不同的容器有不同的数据结构,不同的数据结构操作的性能是不一样的
接口Queue和接口Deque实现链表容器,适合:插入,删除
接口List和接口ArrayList实现顺序表容器,适合:查询

.
.
.
.
.
.
.
参考资料:Java集合框架——接口

0 0
原创粉丝点击