【集合框架】1. 集合框架的介绍

本文详细介绍了Java集合框架的构成及各个接口的特点与方法,包括Collection、List、Queue、Deque、Map等,帮助读者理解每种集合类型的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合框架


1. 集合框架的介绍

1.1 集合框架

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

1.2 主要接口集

image

Iterable:迭代器接口
  • 实现该接口允许对象成为“foreach”语句(增强for循环)的目标,即该集合对象允许迭代。
  • 类集接口Collection是Iterable的子接口,所以所有类集对象可以迭代访问,而映射Map不行
  • 构造方法:
- Iterator<T> iterator()  //返回一个在一组T类型的元素上进行迭代的迭代器
  • 方法摘要:
- boolean hasNext()  //如果仍有元素可以迭代,则返回 true。
- E next()  //返回迭代的下一个元素。
- void remove()  //从迭代器指向的collection中移除迭代器返回的最后一个元素(可选操作)。
  • 迭代器Iterator实现了Iterator/ListIterator接口的类的对象,可以通过遍历类集,访问操作其中的每个元素
  • ListIterator扩展了父接口Iterator,允许双向遍历,并可以修改和删除元素
Collection:类集接口
  • Collection 表示一组对象,这些对象也称为 collection 的元素。
  • JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。
  • 此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。 方法名(Collection c)
  • 方法摘要
- int size()  //返回此 collection 中的元素数。 - Object[] toArray() 返回包含此 collection 中所有元素的数组。  
- Iterator<E> 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> T[] toArray(T[] a) //返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。
- 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());
      }
List:列表接口

扩展了Collection,特点:有序且可重复的

List容器是有序的collection。此接口的用户可以对List容器中每个元素的插入值进行精确地控制,用户可以根据元素的整数索引(在列表中的值位置)访问元素,并搜索列表中的元素。List容器允许插入重复的值,包括Null
- List 接口提供了 4 种对列表元素进行定位(索引)访问方法。列表(像 Java 数组一样)是基于 0 的
- List 接口提供了特殊的迭代器,称为 ListIterator,除了允许 Iterator 接口提供的正常操作外,该迭代器还允许元素插入和替换,以及双向访问。还提供了一个方法来获取从列表中指定位置开始的列表迭代器。
- List 接口提供了两种搜索指定对象的方法。从性能的观点来看,应该小心使用这些方法。在很多实现中,它们将执行高开销的线性搜索。
- List 接口提供了两种在列表的任意位置高效插入和移除多个元素的方法。
- List从collection扩展的接口方法:

-  ListIterator<E> listIterator()// 返回此列表元素的列表迭代器(按适当顺序)。
-  ListIterator<E> 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<E> subList(int fromIndex,int toIndex)// 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。(如果 fromIndex 和 toIndex 相等,则返回的列表为空)。
Queue:队列接口

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

抛出异常返回特殊值
插入add(e)
移除remove()
检查element()

- Queue 实现通常不允许插入 null 元素,尽管某些实现(如 LinkedList)并不禁止插入 null。即使在允许 null 的实现中,也不应该将 null 插入到 Queue 中
- Queue 实现通常未定义 equals 和 hashCode 方法的基于元素的版本,而是从 Object 类继承了基于身份的版本
- 方法摘要:

- boolean add(E e) // 将指定的元素插入队尾(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException。
 - boolean offer(E e)  // 将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(E)
 -E remove()   //获取并移除此队列的头。此方法与 poll 唯一的不同在于:此队列为空时将抛出一个异常。
 -E pool()  //获取并移除此队列的头,如果此队列为空,则返回 null。
 -E element()  // 获取,但是不移除此队列的头。此方法与 peek 唯一的不同在于:此队列为空时将抛出一个异常。
 -E peek()   // 获取但不移除此队列的头;如果此队列为空,则返回 null。
Deque:双端队列接口

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

第一个元素(头部)最后一个元素(尾部)
抛出异常特殊值抛出异常
插入addFirst(e)offerFirst(e)addLast(e)
移除removeFirst()pollFirst()removeLast()
检查getFirst()peekFirst()getLast()

- 此接口扩展了 Queue 接口。在将双端队列用作队列时,将得到 FIFO(先进先出)行为。将元素添加到双端队列的末尾,从双端队列的开头移除元素。从 Queue 接口继承的方法完全等效于 Deque 方法,如下表所示:

Queue方法等效Deque方法
add(e)addLast(e)
offer(e)offerLast(e)
remove()removeFirst()
poll()pollFirst()
element()getFirst()
peek()peekFirst()

- 其余六种方法可以实现栈操作,完全等效于Stack类的方法,在实现堆栈的数据结构中,应优先使用Deque接口而不是Stack类

Stack方法等效Deque方法
push(e)addFirst(e)
pop()removeFirst()
peek()peekFirst()

- 虽然 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是一个很好的边界值。

Map接口:

  • Map不是Collection的子接口,所以不能使用迭代器来进行遍历
  • Map接口映射唯一键到值;
  • 键是以后用于检索值的对象,给定一个键和一个值,可以存储这个值到Map对象中,以后通过键来检索;
  • 定义的方法:
– int size() //返回容器内映射对的个数
– boolean isEmpty() //容器是否为空
– boolean containsKey(Object Key) //判断容器是否包含指定的键
– boolean containsValue(Object value) //判断容器是否包含指定的值
– V get(Object key) //根据键获取对应的值
– V put(K Key, V value) //添加键/值对到容器内
– V remove(Object key) //删除Map容器中给定的键
– Collection<V> values() //获取Map容器中所有的值
– Set<Map.Entry<K,V>> entrySet() //返回包含映射关系的Set视图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值