type
status
date
slug
summary
tags
category
icon
password
- Java中集合基本每天都会用到,同时也是面试重点考察部分
- 集合体系内容很多,要先抓住三大集合List/Set/Map的主线进行学习
- 集合可以认为是对数据进行增删改查的容器
- 集合中的方法非常多,不需要每个都记都学,需要掌握如何查看和使用的方法
- 集合是学习阅读JDK源码非常好的材料,我们不仅要掌握使用方法,还要能自己理解原理,动手实现
什么是集合?
- 将一个或多个元素组合在一起的容器,可以对数据进行增删改查
- 集合框架是用于表示和操作集合的统一体系结构
- 集合由三个主要部分组成
- 接口:表示集合的抽象
- 实现:集合接口的具体实现,本质上,它们是可重用的数据结构
- 算法:对实现集合接口的对象执行计算的方法。相同的方法可以用于适当集合接口的许多不同实现(多态)。本质上,算法是可重用的功能
- 集合相关代码位置
- 大部分集合类都位于java.util包下
- 在java.util.concurrent包下提供了并发容器
Java集合框架Overview
三大重要集合接口和实现类
- List → ArrayList (动态数组)
- Set → HashSet (高中数学中的集合,无重复元素)
- Map → HashMap (键值对,字典)
- key —> value key 不能重复
- 掌握这三大重要集合接口和对应实现类就能解决日常工作90%以上使用集合的场景问题
集合
- Colleaction接口
- Set接口
- HashSet
- List接口
- ArrayList
- Queue接口
- Deque接口
Iterable 接口
- Colleaction 接口继承了 Iterable 接口, lterable 可迭代的
- 所有的 Collection 集合对象,具有 for-each 可遍历性
- Iterable 接口返回 Iterator接口
Iterator 接口
- Enumeration 接口
- 提供了方法来枚举向量(vector)的元素、哈希表(hashtable)的键,以及哈希表中的值。枚举同样也被用来指定输入流SequenceInputStream(顺序输入流)。
- 新的实现应该用 Iterator
- Iterator 接口
- 迭代器(Iterators)允许调用者在迭代过程中删除底层集合中的元素,并具有明确定义的语义。 方法名称已得到改善。
- hasNext方法
- next 方法
动手实现自己的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。