NotionNext
NotionNext
编程爱好者
/互联网从业者
/知识分享博主
认知决定态度,态度决定选择,选择决定人生

Java集合一些重要的接口

NotionNext - 2023-4-13 - Technical / Java / 后端
发布于:2023-4-13|最后更新: 2023-8-29|
type
status
date
slug
summary
tags
category
icon
password
  • Java中集合基本每天都会用到,同时也是面试重点考察部分
  • 集合体系内容很多,要先抓住三大集合List/Set/Map的主线进行学习
  • 集合可以认为是对数据进行增删改查的容器
  • 集合中的方法非常多,不需要每个都记都学,需要掌握如何查看和使用的方法
  • 集合是学习阅读JDK源码非常好的材料,我们不仅要掌握使用方法,还要能自己理解原理,动手实现

什么是集合?

  • 将一个或多个元素组合在一起的容器,可以对数据进行增删改查
  • 集合框架是用于表示和操作集合的统一体系结构
  • 集合由三个主要部分组成
    • 接口:表示集合的抽象
    • 实现:集合接口的具体实现,本质上,它们是可重用的数据结构
    • 算法:对实现集合接口的对象执行计算的方法。相同的方法可以用于适当集合接口的许多不同实现(多态)。本质上,算法是可重用的功能
  • 集合相关代码位置
    • 大部分集合类都位于java.util包下
    • 在java.util.concurrent包下提供了并发容器

Java集合框架Overview

notion image

三大重要集合接口和实现类

  • List → ArrayList (动态数组)
  • Set → HashSet (高中数学中的集合,无重复元素)
  • Map → HashMap (键值对,字典)
    • key —> value key 不能重复
  • 掌握这三大重要集合接口和对应实现类就能解决日常工作90%以上使用集合的场景问题

集合

notion image
  • Colleaction接口
    • Set接口
      • HashSet
    • List接口
      • ArrayList
    • Queue接口
    • Deque接口

Iterable 接口

  • Colleaction 接口继承了 Iterable 接口, lterable 可迭代的
notion image
  • 所有的 Collection 集合对象,具有 for-each 可遍历性
notion image
  • Iterable 接口返回 Iterator接口
notion image

Iterator 接口

  • Enumeration 接口
    • 提供了方法来枚举向量(vector)的元素、哈希表(hashtable)的键,以及哈希表中的值。枚举同样也被用来指定输入流SequenceInputStream(顺序输入流)。
    • 新的实现应该用 Iterator
notion image
  • Iterator 接口
    • 迭代器(Iterators)允许调用者在迭代过程中删除底层集合中的元素,并具有明确定义的语义。 方法名称已得到改善。
    • notion image
    • hasNext方法
    • notion image
    • next 方法
    • notion image

动手实现自己的Iterator

List 接口

  • List 接口表示一个有序的集合,用于存储一组元素。它是 Collection 接口的子接口,拥有比 Collection 更多的操作方法,如插入、修改、查找等。常见的 List 接口实现类有 ArrayList 和 LinkedList
  • List接口中的方法
    • void add(int index, E element):在指定位置插入元素;
    • boolean addAll(int index, Collection<? extends E> c):在指定位置插入集合元素;
    • E get(int index):获取指定位置的元素;
    • int indexOf(Object o):返回指定元素第一次出现的位置;
    • int lastIndexOf(Object o):返回指定元素最后一次出现的位置;
    • E remove(int index):删除指定位置的元素;
    • E set(int index, E element):替换指定位置的元素;
    • List subList(int fromIndex, int toIndex):返回指定范围内的子集,右边界不会包含;
    • void sort(Comparator<? super E> c): 根据 Comparator 规则排序
  • 示例代码

ListIterator 接口

  • 接口是 Java 集合框架中的一种迭代器,它扩展了 Iterator 接口。它允许程序员在迭代列表时向前或向后遍历列表,修改列表中的元素,并在迭代期间插入或删除元素。
  • ListIterator 接口中定义了以下方法:
    • hasNext():如果迭代器具有下一个元素,则返回 true。
    • next():返回迭代器的下一个元素,并将迭代器的位置向前移动一个元素。
    • hasPrevious():如果迭代器具有前一个元素,则返回 true。
    • previous():返回迭代器的前一个元素,并将迭代器的位置向后移动一个元素。
    • nextIndex():返回迭代器下一个元素的索引。
    • previousIndex():返回迭代器前一个元素的索引。
    • remove():从列表中删除迭代器返回的最后一个元素。
    • set():将迭代器返回的最后一个元素设置为指定的元素。
    • add():在迭代器返回的最后一个元素之前插入指定的元素
  • ListIterator 接口仅用于遍历实现了 List 接口的集合,例如 ArrayList 和 LinkedList。它允许程序员以任意顺序遍历和访问列表,而不需要复制整个列表。

Set接口

  • Set 接口是 Java 集合框架中的一种集合,它继承自 Collection 接口。Set 接口定义了一种无序的,不允许重复元素的集合
  • Set 接口的常用实现类有 HashSet、TreeSet 和 LinkedHashSet。
    • HashSet 是基于哈希表的实现,它可以快速访问集合中的元素,但是它不保证元素的顺序。
    • TreeSet 是基于有序树结构的实现,它可以保证集合中的元素按照自然排序或者指定的比较器进行排序,并且支持按照范围查找元素。
    • LinkedHashSet 是基于哈希表和链表的实现,它可以保证元素的插入顺序,并且支持快速访问集合中的元素。
  • Set 接口的常见用处包括:
    • 去除集合中的重复元素
    • 判断两个集合是否有交集
    • 求两个集合的并集、交集和差集
    • 检查一个集合是否是另一个集合的子集或超集
  • 除了继承自 Collection 接口的方法外,Set 接口还定义了以下方法:
    • add(E e):将元素添加到集合中,如果集合中已经有相同的元素,则不添加,并且返回 false。
    • remove(Object o):从集合中删除指定的元素,如果集合中不存在该元素,则不删除,并且返回 false。
    • removeAll(Collection<?> c):从集合中删除包含在指定集合中的所有元素。
    • retainAll(Collection<?> c):保留集合中仅包含在指定集合中的元素。
    • contains(Object o):判断集合是否包含指定的元素。
    • containsAll(Collection<?> c):判断集合是否包含指定集合中的所有元素。
    • clear():从集合中删除所有元素,并将集合大小设置为 0。

Queue接口

  • 作者:Doug Lea
  • 特点:先进先出
  • Queue 接口是 Java 集合框架中的一种队列,它用于存储元素,并支持元素的插入和删除操作。Queue 接口定义了一些方法,这些方法按特定的顺序添加、获取和删除元素。
  • Queue 接口继承自 Collection 接口。在实现 Queue 接口时,队列通常遵循先进先出(FIFO)的规则,即先添加的元素最先被删除,最后添加的元素被保留到队列尾部,直到中间的元素全部被删除。
  • Queue 接口有许多实现类,包括 LinkedList、PriorityQueue 和 ArrayDeque。LinkedList 是基于链表的实现,PriorityQueue 是基于最小堆的实现,而 ArrayDeque 是基于循环数组的实现。
  • Queue 接口中的一些基本方法包括:
    • add(E e):向队列的尾部添加一个元素,如果插入操作失败,则抛出异常。
    • offer(E e):向队列的尾部添加一个元素,如果插入操作失败,则返回 false。
    • remove():删除并返回队列头部的元素,如果队列为空,则抛出异常。
    • poll():删除并返回队列头部的元素,如果队列为空,则返回 null。
    • element():返回队列头部的元素,但不删除该元素,如果队列为空,则抛出异常。
    • peek():返回队列头部的元素,但不删除该元素,如果队列为空,则返回 null。
  • 除了这些基本方法外,Queue 接口还具有其他一些用于操作队列的方法,例如 remove(Object o)、contains(Object o)、size() 等方法

Map 接口

  • Map 接口是 Java 集合框架中的一种映射表(Mapping),它支持键值对的存储和查找。Map 接口定义了一组用于操作键值对的方法,这些方法允许用户根据键访问值,也可以遍历所有的键值对。
    • Map 的key 不可能相等
  • Map 接口有很多实现类,包括 HashMap、TreeMap、LinkedHashMap 等。
    • HashMap 是基于哈希表的实现,它提供了快速的键值对存储和快速的键值对查找,但是它不保证元素的顺序。
    • TreeMap 是基于红黑树的实现,它保证元素按照键的顺序进行存储,同时支持键值对的区间查找。
    • LinkedHashMap 是基于哈希表和链表的实现,它既保证了快速的键值对存储和查找,又保证了元素按照插入顺序进行存储。
  • Map 接口中的一些基本方法包括:
    • put(K key, V value):向映射表中添加一个键值对(key, value),如果键已经存在,则将原有的值覆盖。
    • get(Object key):根据指定的键获取对应的值,如果键不存在,则返回 null。
    • remove(Object key):从映射表中删除键为 key 的键值对,如果键不存在,则不做任何操作。
    • containsKey(Object key):判断映射表中是否包含指定的键。
    • containsValue(Object value):判断映射表中是否包含指定的值。
    • size():获取映射表中键值对的个数。
  • 除了这些基本方法外,Map 接口还提供了许多用于操作映射表的方法,例如 keySet() 用于获取所有键的集合,values() 用于获取所有值的集合,entrySet() 用于获取所有键值对的集合,以及 clear() 用于删除所有的键值对。
  • Map 接口中键必须是唯一的,不允许重复,而值可以是重复的。如果需要存储具有相同键且值不同的多个元素,可以使用 Multimap。
 
Java集合框架之抽象类Java面向对象之抽象